[英]Computing the FOLLOW sets
我的任務是為以下語法計算FIRST和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) = {'('}
對於以下集合,我計算出:
FOLLOW(P) = $ (or empty)
FOLLOW(C) = {left,right,low,'.'}
FOLLOW(CS) = {'.'}
FOLLOW(S) = {left,right,low}
我嘗試使用第一個和跟隨集生成器來嘗試解決方案,得到的FOLLOW(S)是: FOLLOW(S) = {'.', left, right, low}
。 發電機的解決方案正確嗎?為什么? 我使用以下公式計算了解決方案: FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}
。 有人可以向我解釋為什么我/發電機的解決方案不正確,然后檢查我是否做對了所有其他事情? 我也想知道為什么我沒有int
或int
集合,如果以后無論如何構建解析器都可以。 謝謝
計算FOLLOW集時,必須注意空生產。
在這種情況下, CS
的產量為空,這意味着S
后面可能有一個.
在P → S CS .
。 同樣, C
在C CS
可能是在生產結束,所以C
也跟着一個.
int
只能出現在left
標記或right
標記之后。 它永遠不會出現在標稱終端的開頭或緊接在非終端之后。 因此,完全可以預期它不在任何FIRST或FOLLOW集合中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.