一 需求分析
自行定義文法, 運(yùn)用語法分析方法對輸入語句進(jìn)行語法分析并輸出結(jié)果麸祷,加深對語法分析過程的理解仅父。
二 程序設(shè)計(jì)
2.1 總體思路
此次實(shí)驗(yàn)使用java編寫用含。程序讀取輸入的token序列(如input.txt中所示)离咐,對其進(jìn)行語法分析谱俭。這里使用LR(1)方法自底向上進(jìn)行分析,最后輸出歸約的產(chǎn)生式序列健霹。
定義的文法如下:
0 : S’-> S
1 : S -> if C S else S
2 : S -> id + id ;
3 : C -> id > id
4 : C -> C && C
2.2 假設(shè)和依賴
if后面必須有else,不允許單個(gè)if的情況
所有的非終結(jié)符必須是單個(gè)字符
三 程序?qū)崿F(xiàn)
3.1 思路和方法
構(gòu)建符號棧瓶蚂,狀態(tài)棧糖埋,建立 parsing table 在程序當(dāng)中的映射,方便查詢處理
讀入用戶輸入的待分析的表達(dá)式窃这, 依次移動讀頭瞳别, 如果根據(jù)當(dāng)前棧頂?shù)那闆r和讀頭下的符號來決定當(dāng)前的動作。根據(jù)當(dāng)前狀態(tài)棧頂?shù)臓顟B(tài)號和讀頭下的符號查 parsing table杭攻,如果查到的是 Si 即 Shift 操作祟敛,則將讀頭下的符號壓入符號棧,將 i 壓入狀態(tài)棧兆解,移動讀頭到下一個(gè)字符馆铁;如果查到的是 ri 即 Reduce 操作,則將棧頂?shù)乃信c文法表達(dá)式 i右邊相同的部分一次彈出锅睛, 同時(shí)將狀態(tài)棧一起彈出埠巨, 將文法表達(dá)式 i 左邊的符號 X 壓入符號棧,查當(dāng)前狀態(tài)棧棧頂?shù)捻?xiàng) I 在 GOTO 表當(dāng)中的 GOTO(I,X)现拒,將所得的狀態(tài)號壓入狀態(tài)棧辣垒;如果讀到 r0,則分析成功印蔬;如果有其他讀入勋桶,則不合法
在讀入過程中,如果出現(xiàn)查找不到 Action 或者 GOTO 表項(xiàng)侥猬,則報(bào)錯(cuò)例驹,終止語法分析
參考文檔和完整的文檔和源碼下載地址: