簡體   English   中英

LL(1)語法驗證

[英]LL(1) grammar verification

G為這樣的語法:

S -> aBa
B -> bB | \epsilon

其中\\epsilon代表空字符串。

在計算FIRSTFOLLOW ,是否有一種方法可以在不訴諸解析表的情況下確定G是否為LL(1)

計算后FIRSTFOLLOW集的變量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) ,而無需計算FIRSTFOLLOW集。 這通常比對像G這樣的小語法進行FIRSTFOLLOW計算要容易得多,也不會那么乏味。

我沒有一本書,因此其中某些定義或計算可能有誤。 但這就是我要解決的問題。 計算FIRSTFOLLOW集可得出:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM