我的任務是計算FIRST和FOLLOW集以下語法:計算的FOLLOW集
P ::= S CS .
S ::= (int , int)
CS ::= C CS | epsilon
C ::= left int | right int | low C
我得到了以下第一組:
FIRST(S) = {'('}
FIRST(C) = {left,right,low}
FIRST(CS) = {left,right,low,epsilon}
FIRST(P) = FIRST(S) = {'('}
對於以下組I計算:
FOLLOW(P) = $ (or empty)
FOLLOW(C) = {left,right,low,'.'}
FOLLOW(CS) = {'.'}
FOLLOW(S) = {left,right,low}
我試着用我的解決方案,使用第一套和跟隨套發電機,我跟隨(S)得到的是:FOLLOW(S) = {'.', left, right, low}
。發電機解決方案是否正確,爲什麼?我使用公式計算了我的解答:FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}
。有人可以解釋我爲什麼我的/發電機的解決方案不正確,並檢查我是否有一切正確的?我也想知道爲什麼我沒有在第一個或隨後的集合中使用int
,並且如果這對於稍後構建解析器來說可以。謝謝
謝謝:)我想我現在完全理解FIRST和FOLLOW的工作方式。我只有一個問題。根據這些規則,如何確定FOLLOW集,我看不到任何包含'。'的規則。進入我的FOLLOW(S)集...我是否必須小心這樣的空白作品,或者實際上有一條規則決定了這一點? – Luki
這是我在我的答案第二段中指定的規則,「P→S CS。」。如果CS是空的,那麼點緊跟在S.或者我不明白你的意思。非終結符的FOLLOW集合是一組令牌,它可以在接下來的n次輸入之後來到我的非終結符的實例之後。 – rici