簡體   English   中英

LL1語法中的左遞歸消除

[英]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.

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