3語法分析方法及分析表設計
3.1語法分析法——LL(1)法
3.1.1基本思想
LL(1)法師一種自頂向下的分析方法。從文法的開始符號出發,根據當前的輸入符號(單詞符號)唯一的確定選用哪個產生式替換相應非終結符以往下推導,或如何構造一棵相應的語法樹。該方法的關鍵是要確定唯一的候選式。
LL(1)的含義是:第一個L表明自頂向下分析是從左向右掃描輸入串;第二個L表明分析過程中將用最左推導,1表明只需向右看一個符號便可決定如何推導即選擇哪個產生式進行推導。
3.1.2分析步驟
1 首先要判斷該文法是否是LL(1)文法,需要計算該文法中的非終結符的First集,Follow集,從而計算出產生式的Select集,如果同一個非終結符定義的不同產生式的Select集之間交集為空,就唯一的確定下一個產生式,這樣就不會出向二義性,確保了能夠正確的完成語法分析。
2 構造文法的預測分析表,本文法的預測分析表在下面給出。
3 詞法分析輸出的單詞已經映射成一個個字符,對這些字符構成的字符串進行預測分析。
3.2根據文法得到的預測分析表
While ( ) i n < = > + - * / #
S S->While
(B)
A=G
B B->EYE B->EYE B->EYE
A A->i
G G->E G->E G->E
Y Y->< Y->= Y->>
E E->(E)M E->iM E->nM
R R->+ R->- R->* R->/
M M->ε M->REM M->REM M->REM M->REM M->ε
4中間代碼形式的描述及中間代碼序列的結構設計
4.1三地址代碼的描述
在本程序中用到了三地址語句的輸出包括以下的種類:
賦值語句:x:= y Y z
復制語句:x:= y
條件判斷語句: x Y y R z Y q
其中Y代表算術運算符,R代表比較運算符。
4.2本程序中的三地址代碼
S -> while (B) A=G L0:=if (B) goto L1 else goto Lnext
A -> i A:= i
B -> E Y E B:= E1 Y E2
Y -> < Y:= <
Y -> = Y:= =
Y -> > Y:= >
E -> (E)M E1:= (E2) M
E -> iM E:= i M
E -> nM E:= n M
M -> +EM M1:= +E M2
M -> -EM M1:= -E M2
M -> *EM M1:= *E M2
M -> /EM M1:= /E M2
M ->ε M:= ε
G ->E G:= E
5簡要的分析與概要設計
5.1簡要分析
首先要進行詞法分析,將.txt文件中得字符串讀出來,分離成一個個的單詞。為了在后面的分析中能夠吧一個單詞當作一個字符來看,詞法分析中要用結構來保存分析出來的單詞。
LL(1)分析方法就是根據文法得出的預測分析表,來確定當棧頂符號遇到符號串的首字符是是否有產生式,用哪個產生式,并要保證唯一性,否則就不是LL(1)文法了。這需要先將 # 和文法開始符號 S 壓入符號棧中,然后判斷棧頂符號和符號串的首字符是否相同。如果相同就消除該符號和字符;否則就著到它們在預測分析表中確定的項(產生式)。將產生式的右部逆序壓入棧中來替換左部(該符號),字符串的當前指針也向后移動一個字符,來表示剩余字符串,然后重新比較棧頂符號和符號串的首字符,只到棧中只剩下#,這時如果剩余符號串中也只剩下#就表示該字符串語法正確。然后根據符號串的屬性,分析的結果和符號之間的優先關系按三地址形式輸出。
當然while語句中式可以還有嵌套的while語句的。但這不影響該方法的分析過程的。另外在分析過程中,用一定的格式輸出分析過程,每分析一步就輸出一次,出錯就報告錯誤,這樣就很容易在結果顯示屏幕上看出錯誤發生在哪個地方。
5.2程序的概要設計
本程序的是此案需要依次經過詞法分析,語法分析,語義分析,輸出這些步驟,且每部分的輸出是下個部分的輸入。那我就按該過程來設計程序。用一個函數來進行詞法分析,一個函數進行語法分析,一個函數進行屬性分析以輸出三地址碼。當然還要有讀取文件和輸出的函數,主函數。還要定義個結構來存取單詞的屬性,另外要有單詞的映射函數。
6詳細的算法描述
6.1程序的整體流程:在main()主函數的描述
Void main() mian()流程圖:
{
open();
lexical();
pasring();
output();
close();
}