【實驗目的】
1. 掌握 EBNF及其在遞迴下降分析子程式構造中的作用。
2. 掌握遞迴下降剖析器的構造方法。
【實驗內容】
文法:E→E+T | T,T→T*F | F,F→(E) | i
根據該文法編寫遞迴下降剖析器:
1. 輸入:任意符號串。
2. 處理:遞迴調用分析輸入串是否合法。
3. 輸出:串是否合法。
【實驗要求】
1. 根據上述文法的產生式規則用EBNF化簡之並繪製相應的文法圖。
2. 任選C/C++/Java 中的一種作為程式設計語言實現遞迴下降分析。
一、用EBNF化簡文法
化簡結果如下:E→T{+T}
F→F{*F}
F→i|(E)
二、程式部分代碼
1.注意,本程式也是以#作為輸入結束標識,否則會分析錯誤
2.程式入口
E();</p><p>if(ip == input.length-1)//說明輸入串已經分析完<br />System.out.println("分析結果:符合文法");<br />else//輸入串沒有分析完就結束<br />System.out.println("分析結果:ERROR不符合文法");
3.核心代碼
public static void E()<br />{<br />T();<br />while(sym == '+')<br />{<br />ip++;<br />sym = input[ip];//advance<br />T();<br />}<br />}</p><p>public static void T()<br />{<br />F();<br />while(sym == '*')<br />{<br />ip++;<br />sym = input[ip];//advance<br />F();<br />}<br />}</p><p>public static void F()<br />{<br />if(sym == 'i')<br />{<br />ip++;<br />sym = input[ip];//advance<br />}<br />else<br />{<br />if(sym == '(')<br />{<br />ip++;<br />sym = input[ip];//advance</p><p>E();</p><p>if(sym == ')')<br />{<br />ip++;<br />sym = input[ip];//advance<br />}<br />else<br />{<br />System.out.println("分析結果:ERROR不符合文法");<br />System.exit(0);<br />}<br />}<br />else<br />{<br />System.out.println("分析結果:ERROR不符合文法");<br />System.exit(0);<br />}<br />}<br />}