1 回答

TA貢獻1877條經(jīng)驗 獲得超6個贊
每當非終結(jié)N
符出現(xiàn)在生產(chǎn)中時
M → α N β
我們有
FIRST(α) ? FOLLOW(N)
如果
β
可以為空,那么FOLLOW(M) ? FOLLOW(N)
如果 β 為空(即N
在產(chǎn)生式末尾)或 β 中的第一個符號不可為空,則您的代碼可以正常工作。在其余情況下,您的代碼有錯誤:
如果 β 中的第一個符號可以為空,則將 FIRST(β) 計算為 β 中前兩個符號的 FIRST 集的并集。由于您從不檢查第二個(或后續(xù))符號是否可為空,因此您可能會錯過 FIRST(β) 中的符號。
僅測試下一個符號的可空性的另一個結(jié)果是您不計算 NULLABLE(β); 相反,您使用 β 中第一個符號的可空性。所以你可能會錯過
FOLLOW(M)
.
我不相信這些錯誤中的任何一個都是由您的實際語法觸發(fā)的。但下一個是;
如果您的(不充分的)測試表明 β 可以為空,請使用
FIRST(M)
而不是FOLLOW(M)
.一個密切相關(guān)的問題是,如果已經(jīng)達到生產(chǎn)的結(jié)尾,則計算
la
哪個提議作為下一個符號。term
這將導致使用FIRST(term)
而不是FOLLOW(term)
,但當然這永遠不會發(fā)生,因為使用的唯一代碼分支在生產(chǎn)結(jié)束時la
不會執(zhí)行。N
既然如此,la
其實是沒有必要的。
添加回答
舉報