[英]LL(1) Parsing Table Error
我首先有這個語法
E -> E + T | T
T -> id | id[] | id[X]
X -> E, E | E
顯然,第一條規則中存在左遞歸,因此我將其刪除以獲取以下內容
E -> TE'
E' -> +TE' | epsilon
T -> id | id[] | id[X]
X -> E, E | E
在這里,我生成FIRST
和FOLLOW
集( id
是單個終端)。
FIRST(TE') = FIRST(E, E) = FIRST(E) = {id}
FIRST(+TE') = {+}
FIRST(epsilon = {epsilon}
FIRST(id) = FIRST(id[]) = FIRST(id[X]) = {id}
FOLLOW(E) = {$}
FOLLOW(E') = {$}
FOLLOW(T) = {$}
FOLLOW(X) = {]}
但是,當我嘗試構造解析表時,最終得到了幾個單元格的多個值。
| id | + | [ | ] | , | $ |
----+-------------------+--------+----------+-----+-----+
E | TE' | | | | | |
E' | | +TE' | | | | ε |
T |id or id[] or id[X]| | | | | |
X |E, E or E | | | | | |
我想念什么嗎? 如何糾正這個問題,以便我可以使用此語法解析id + id[id + id, id[]]
?
即使刪除左遞歸后,您的語法也不是LL(1)。 這些產品有問題:
T -> id | id[] | id[X]
X -> E , E | E
嘗試應用以下轉換:
A -> ab_1 | ... | ab_n ~~~~~~> A -> aA'
A' -> b_1 | ... | b_n
您的情況是:
T -> id T'
T' -> [] | [X] | epsilon
X -> EX'
X' -> , E | epsilon
但是T'
仍然需要再次應用轉換:
T -> id T'
T' -> [ T" | epsilon
T" -> ] | X ]
完整語法:
E -> TE'
E' -> +TE' | epsilon
T -> id T'
T' -> [ T" | epsilon
T" -> ] | X ]
X -> EX'
X' -> , E | epsilon
此外,您應該按照以下方式執行步驟:
1)為所有非終端計算FIRST。
2)為所有非終端計算FOLLOW。
3)計算所有產品的SELECT。 請記住,一個非終結符的SELECT集應該是不相交的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.