LL(1)文法分析器

來源:互聯網
上載者:User

 【實驗目的】
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 />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.