編譯原理-TEST語言詞法分析
原始碼
分析程式碼:
{ /*This a test program.*/ int abc; int 1203; int [email protected]; int i; int n; int b,c; int 2a; int a2; read n; n = 012345; for (i=1;i<=n; i= i+1) { abc=abc+i; } if(i!=n) n = n+i; if (!n) b = b+c; /*The loop ended write abc; }
報錯資訊
設計詞法分析程式
一、實驗目的
1、根據 TEST 語言的詞法規則,分別寫出每條詞法規則對應的正則表示式; 2、將每一個正則表示式轉換為 NFA; 3、將多個 NFA 合併後進行確定化並化簡; 4、根據化簡後的 DFA 畫出流程圖; 5、參閱在實驗語言部分給出的 TEST 語言語法規則,確定單詞分類、單詞輸出方案; 6、編寫詞法分析程式; 7、對下面的 TEST 語言源程式進行詞法分析,將合法單詞存入 lex.txt,並報告詞法錯 誤及其位置。
二、實驗設計
1、寫出TEST語言每條詞法規則對應的正則文法或者正則表示式 識別符號 (a|…|z|A|…|Z)( a|…|z|A|…|Z|0|…|9)* 保留字 <if>|<else>|<for>|< while>|< do>|< int>|< write>|< read> 無符號整數 (1|…|9)(0|…|9)|0 分界符 ( | ) | ; | { | } 運算子 +|-|
2、對每個文法或者正則表示式分別構造NFA
3.將NFA合併,確定化,化簡得到最終的DFA。
1、設計的詞法分析程式是否滿足最長匹配原則?如果滿足請給出實現方案。如果不滿 足請給出改進方案。 最長匹配原則定義:指識別出的單詞有混淆時,按長度最長的來決定。例如,“<=”是 一個符號串,而不是分開成“<”和“=”單個字元。 我組設計的詞法分析程式符合最長匹配原則。 實現方案:畫出DFA和狀態表之後,按照表驅動進行編寫程式,達到目的。詳細實現方 案請看原始碼和狀態轉移圖。
2、給出單詞分類方案,並說明理由。 根據TEST語言可將單詞分為六類: ① 識別符號:字母開頭,後可接任意字母或數字; ② 保留字:識別符號的子集,包括:if、else、for、while、do、int、write、read; ③ 無符號整數: 由數字組成,但最高位不能為0,允許一位的0; ④ 分界符: (、 ) 、; 、{ 、} ⑤ 運算子:+、-、、/、=、<、>、>=、<=、!=、== ⑥ 註釋符: / 、 */
3、構建詞法分析程式一般過程是怎樣的?