編譯原理實驗講義
ver 0.4
實驗一 C_minus語言詞法分析器的設計(6學時)
【目的】 設計一個簡單的詞法分析器,從而進一步加深對詞法分析器工作原理的理解。
【要求】
1、該個詞法分析器要求至少能夠識別以下幾類單詞:
a. 關鍵字:else if int return void while共6個,所有的關鍵字都是保留字,並且必須是小寫;
b. 標識符:識別與C語言詞法規定相一致的標識符,通過下列Regex定義:ID = letter (letter | digit)*;
c. 常數:NUM=(+ | - |ε)digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整數,如123, -123, +123等;小數,如123.45, +123.45, -123.45;科學計數法表示的常數,如+1.23e3,-2.3e-9;
d. 專用符號:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */;
2、分析器的輸入為由上述幾類單詞構成的程式,輸出為該段程式的機內表示形式,即關鍵字、運算子、界限符變為其對應的機內符,常數使用二進位形式,標識符使用相應的標識符表指標表示。
3、詞法分析器應當能夠指出來源程式中的詞法錯誤,如不可識別的符號、錯誤的詞法等。
【方法與參考】
首先給出所有單詞的正規式(或正規文法)表示,然後將其轉化為NFA,再將NFA確定化、最小化,得到最簡的c,根據DFA編寫詞法分析器的代碼。
【實驗環境和工具】 本實驗不限定現所使用的開發工具以及運行環境。
實驗二遞迴下降分析器的設計(6學時)
【目的】 使用遞迴子程式法設計一個文法剖析器,理解自頂向下分析方法的原理,掌握手工編寫文法剖析器的方法。
【要求】
1、使用遞迴下降分析演算法分析運算式文法:
exp ::= exp addop term | term
addop ::= + | -
term ::= term mulop factor | factor
mulop ::= * | /
factor ::= (exp) | number
其中number可以是多位的十進位數字串(整數即可),因此這裡還需要一個小的詞法分析器來得到number的值。
2、該詞法分析器以子程式形式出現,當需要進行詞法分析時進行調用;
3、能夠識別正確和錯誤的運算式;
4、在進行文法分析的過程中,計算輸入運算式的值。
【方法與參考】 首先將上述文法改寫成EBNF形式,根據遞迴下降分析演算法基本思想編寫程式。
【實驗環境和工具】 本實驗不限定現所使用的開發工具以及運行環境。
實驗三算符優先分析法分析器的設計(6學時)
【目的】 設計一個算符優先分析器,理解優先分析方法的原理。
【要求】 使用算符優先分析演算法分析下面的文法:
E’ → #E#
E → E+T | T
T → T*F | F
F → P^F | P
P → (E) | i
其中i可以看作是一個終結符,無需作詞法分析。具體要求如下:
1. 如果輸入符號串為正確句子,顯示分析步驟,包括分析棧中的內容、優先關係、輸入符號串的變化情況;
2. 如果輸入符號串不是正確句子,則指示出錯位置。
【方法】 首先構造算符優先關係表,然後根據算符優先分析演算法編寫程式。
【實驗環境和工具】 本實驗不限定現所使用的開發工具以及運行環境。