[英]Left recursion elimination in an LL1 grammar
我正在嘗試從以下語法摘錄中消除左遞歸-
expression := fragment ( ( + | - | * | / ) fragment )*
fragment := identifier | number | ( + | - ) fragment | expression
問題是表達可以分解,可以表達。 我嘗試了很多消除它的方法,有些看起來像它們在JavaCC中起作用,但是我a)不確定它們的正確性,b)確信我已經通過更改語法結構破壞了關聯性。
我很確定我需要表達',並且有
fragment := identifier | number | ( + | - ) fragment | expression
變成
fragment := identifier | number | ( + | - ) fragment | expressionPrime
但是我不確定形成expressionPrime的方式。 都
expressionPrime := identifier | number | ( + | - ) fragment | {}
和
expressionPrime := ( ( + | - | * | / ) fragment )*
似乎可以工作,但我知道不能兩者兼有。
任何想法都將不勝感激,即使指向正確的方向。
從...開始
expression ::= fragment ( ( + | - | * | / ) fragment )*
fragment ::= identifier | number | ( + | - ) fragment | expression
限定
frag1 ::= identifier | number | ( + | - ) fragment
請注意,fragment等同於frag1 | expression
frag1 | expression
。 到處都用前者代替前者
expression ::= (frag1 | expression) ( ( + | - | * | / ) (frag1 | expression) )*
frag1 ::= identifier | number | ( + | - ) (frag1 | expression)
fragment
不再需要。
分配得到
expression ::= frag1 more | expression more ,
哪里
more ::= ( ( + | - | * | / ) (frag1 | expression) )*
現在您可以看到一個表達式是一個frag1
然后是一個或more
所以
expression ::= frag1 (more)+
您的語法仍然模棱兩可-“ 1 *-2 * 3”有2個解析的發束。 但是至少它不再是遞歸的了。
(如果您在作業中使用此答案,請務必引用此答案,以免最終違反機構的學術不誠實規定。)
我仍然認為您的老師犯了一個錯誤,因為如果您改變
fragment ::= identifier | number | ( + | - ) fragment | expression
至
fragment ::= identifier | number | ( + | - ) fragment | "(" expression ")" ,
您對表達有明智的語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.