[英]LL(1) grammar verification
令G
為這樣的語法:
S -> aBa
B -> bB | \epsilon
其中\\epsilon
代表空字符串。
在計算FIRST
和FOLLOW
,是否有一種方法可以在不訴諸解析表的情況下確定G
是否為LL(1)
?
計算后FIRST
和FOLLOW
集的變量G
,可以計算出長度1先行設置LA(1)
為變量和規則G
。 如果滿足以下條件,則G
為強LL(1)
:
LA(1)(A -> wi) partition LA(1)(A) for each variable A such that A -> wi is a rule.
或者,您可以從強LL(k)
語法的定義中證明G
是強LL(1)
,而無需計算FIRST
和FOLLOW
集。 這通常比對像G
這樣的小語法進行FIRST
和FOLLOW
計算要容易得多,也不會那么乏味。
我沒有一本書,因此其中某些定義或計算可能有誤。 但這就是我要解決的問題。 計算FIRST
和FOLLOW
集可得出:
FIRST(1)(S) = trunc(1)({x : S =>* x AND x IN Σ*})
= trunc(1)({ab^na : n >= 0})
= {a}
FIRST(1)(B) = trunc(1)({x : B =>* x AND x IN Σ*})
= trunc(1)({b^n : n >= 0})
= {ε,b}
FOLLOW(1)(S) = trunc(1)({x : S =>* uSv AND x IN FIRST(1)(v)})
= trunc(1)({x : x IN FIRST(1)(ε)})
= trunc(1)(FIRST(1)(ε))
= {ε}
FOLLOW(1)(B) = trunc(1)({x : S =>* uBv AND x IN FIRST(1)(v)})
= trunc(1)({x : x IN FIRST(1)(a)})
= trunc(1)(FIRST(1)(a))
= {a}
計算變量和規則的長度為1的超前集可得出:
LA(1)(S) = trunc(1)(FIRST(1)(S)FOLLOW(1)(S))
= trunc(1)({a}{ε})
= trunc(1){a}
= {a}
LA(1)(B) = trunc(1)(FIRST(1)(B)FOLLOW(1)(B))
= trunc(1)({ε,b}{a})
= trunc(1){a,b}
= {a,b}
LA(1)(S -> aBa) = trunc(1)(FIRST(1)(a)FIRST(1)(B)FIRST(1)(a)FOLLOW(1)(S))
= trunc(1){a}
= {a}
LA(1)(B -> bB) = trunc(1)(FIRST(1)(b)FIRST(1)(B))
= trunc(1){b}
= {b}
LA(1)(B -> ε) = trunc(1)(FIRST(1)(ε)FOLLOW(1)(b))
= trunc(1)({ε}{a})
= {a}
由於LA(1)(B -> ε)
和LA(1)(B -> bB)
LA(1)(B)
和LA(1)(S -> aBa)
簡單的分區LA(1)(S)
, G
是強LL(1)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.