【實驗目的】
1. 瞭解 LL(1)文法分析是如何根據文法規則逐一分析詞法分析所得到的單
詞,檢查語法錯誤,即掌握文法分析過程。
2. 掌握 LL(1)文法分析器的設計與調試。
【實驗內容】
文法:E→TE’,E’→+TE’|ε,T→FT’,T’→*FT’|ε,F→(E) | i
針對上述文法,編寫一個 LL(1)文法剖析器:
1. 輸入:諸如 i+i*i 的字串,以#結束。
2. 處理:基於分析表進行 LL(1)文法分析,判斷其是否符合文法。
3. 輸出:串是否合法。
【實驗要求】
1. 在編程前,根據上述文法建立對應的、正確的預測性分析表。
2. 設計恰當的資料結構儲存預測性分析表。
3. 任選 C/C++/Java 中的一種作為程式設計語言,要求所編程式結構清晰。
while(flag)<br />{<br />if(X == 'i' || X == '+' || X == '*' || X == '(' || X == ')' )//當棧頂為終結符(此時僅有以上這些)<br />{<br />if(X == a)<br />{<br />//將終結符X從stack棧頂逐出<br />stack[X_pointer] = ' ';<br />X = stack[--X_pointer];<br />//讓a_pointer指向下一輸入符號<br />a = input[++a_pointer];</p><p>//計算當前的符號棧和輸入串<br />String nowStack = "" ,nowInput = "";<br />for(int i=0;i<=X_pointer;i++)<br />{<br />nowStack += stack[i];<br />}<br />for(int j=a_pointer;j<input.length;j++)<br />{<br />nowInput += input[j];<br />}<br />//輸出預測性分析步驟<br />System.out.println(++num+"/t/t"+nowStack+"/t/t"+nowInput+"/t/t"+" ");<br />}<br />else<br />{<br />System.out.println("*****************************************");<br />System.out.println("分析結果為:"+str+" 不符合文法");<br />flag = false;<br />}<br />}<br />else if(X == '#')//當棧頂為#<br />{<br />if(X == a)<br />{<br />//宣布成功,停止分析過程<br />System.out.println("*****************************************");<br />System.out.println("分析結果為:"+str+" 符合文法");<br />flag = false;<br />}<br />else<br />{<br />System.out.println("*****************************************");<br />System.out.println("分析結果為:"+str+" 不符合文法");<br />flag = false;<br />}<br />}<br />else if(X == 'E' || X == 'Ё' || X == 'T' || X == 'Г' || X == 'F')//當棧頂為非終結符(此時僅有以上這些,E'用Ё表示,T'用Г表示)<br />{</p><p>int row = 0;//分析表的行號<br />if(X == 'E') row = 0;<br />else if(X == 'Ё') row = 1;<br />else if(X == 'T') row = 2;<br />else if(X == 'Г') row = 3;<br />else if(X == 'F') row = 4;</p><p>int col = 0;//分析表的列號<br />if(a == 'i') col = 0;<br />else if(a == '+') col = 1;<br />else if(a == '*') col = 2;<br />else if(a == '(') col = 3;<br />else if(a == ')') col = 4;<br />else if(a == '#') col = 5;</p><p>//將終結符X從stack棧頂逐出<br />stack[X_pointer] = ' ';<br />X = stack[--X_pointer];</p><p>char[] element = table[row][col].toCharArray();<br />try{</p><p>if(element[3] == 'ε')//什麼也不推進棧<br />{</p><p>}<br />else//反序一一推進stack棧<br />{<br />for(int k=element.length-1;k>2;k--)<br />{<br />++X_pointer;<br />stack[X_pointer] = element[k];<br />}<br />//更新棧頂指標和棧頂元素<br />X = stack[X_pointer];<br />}</p><p>//計算當前的符號棧和輸入串<br />String nowStack = "" ,nowInput = "";<br />for(int i=0;i<=X_pointer;i++)<br />{<br />nowStack += stack[i];<br />}<br />for(int j=a_pointer;j<input.length;j++)<br />{<br />nowInput += input[j];<br />}<br />//輸出預測性分析步驟<br />System.out.println(++num+"/t/t"+nowStack+"/t/t"+nowInput+"/t/t"+table[row][col]);</p><p>}catch(Exception e){</p><p>}</p><p>}<br />else<br />{<br />System.out.println("*****************************************");<br />System.out.println("分析結果為:"+str+" 不符合文法");<br />flag = false;<br />}<br />}