※遞歸下降法:
簡而言之,就是比如文法是
S→T,T→FM, F→+M,M→a
用僞代碼表示這個文法
則首先要寫 procedure S
BEGIN
T;
END
然後寫 procedure T
BEGIN
F;
M;
END
Procedure F
BEGIN
+M;
END
Procedure M
BEGIN
匹配a
END
這樣的過程是遞歸下降的過程。遞歸下降方法僅表示一種思路,沒有特別的
※LL(1)預測分析法:
第一個L表示從左到右掃描輸入串
第二個L表示最左推導
1表示分析時每步只需向前查看一個符號
考慮First集和FOLLOW集:
First集,FIRST( α)是由α推導出的所有的第一個終結符號組成的集合
FOLLOW集:FOLLOW(A)是由所有句型中緊跟在A後面的終結符a組成的集合
引入FOLLOW集的意義是,在有空轉換的文法裏,有時候不能確定是否把這個非終結符變成空,這就要看看這個非終結符跟着的元素,是否有可能匹配下一個元素。如果能匹配,那麼就可以把它變成空
※※預測分析表
例
文法:
各個非終結符的first集合:
關於follow集合我們只要考慮有可能變成空轉換的非終結符:
根據FIRST集和FOLLOW集可以生成一張LL(1)文法的預測分析表:
預測分析表法的分析過程:
要以表格的形式,列出分析棧的變化,輸入,和輸出動作:
以下是上面的文法對於id+id*id串的分析過程
錯誤恢復:同步符號
有時候輸入的串可能有點小錯誤摻雜了一些不該有的符號,可以利用同步符號synch跳過這些符號,使語法分析能夠繼續:
這就要考慮所有非終結符的FOLLOW集合:
以上面的文法的預測分析表做例子
FOLLOW集合:
加入錯誤處理的預測分析表:
串 )id+*id 的分析過程: