2011-02-04 29 views
1

HI,從生產具有非終結卸下左遞歸

我有以下形式的生產:

Expr ---> Primary | UnaryOp Expr | Expr BinOp Expr | id=Expr | id[Expr]=Expr. 

誰能幫助通過刪除我轉換成LL這(1)形式左遞歸??。我撞了我的哈德針對這一點,但我仍然不能得到它:(。以下是我的嘗試。


Expr ---> Primary Expr' | UnaryOp Expr Expr' | id=Expr Expr' | id[Expr]=Expr Expr' 

Expr' ---> BinOp Expr Expr' | epsilon 

是上述轉換正確??我在做什麼從這裏?

我用我在wikipedia發現了以下一般規則


A ---> Ab | B 

轉換時:

A' ---> aA' 
A ---> BA' 

回答

0

龍書很好地解釋瞭如何從LR(0)轉換爲LL(1),以及哪些語法不是LL(1)等等。如果你熱衷於學習這一點,你應該看看這本書的解釋。

+0

爲什麼你覺得寫一個解析器的功課?我爲自己和我的開源項目寫了大量的東西。編輯:我把它從你的答案中刪除。隨意恢復,如果你堅持:) – leppie 2011-02-04 06:01:23

0
Expr ---> Primary Expr' | UnaryOp Expr | id=Expr | id[Expr]=Expr 
Expr' ---> BinOp Expr | epsilon 

包含左遞歸語法是Expr ---> Expr BinOp Expr 什麼已經做的是,從

檢查移除左遞歸是否這是正確的與文章

http://en.wikipedia.org/wiki/Left_recursion

0
Expr ---> Primary | UnaryOp Expr | Expr BinOp Expr | id=Expr | id[Expr]=Expr 
比較

這樣很容易想到左遞歸移除。 您在第三個表達式「Expr BinOp Expr」中出現了左複製。你知道在某個時間點左邊的'Expr'項將被其他終端和表達式取代(這是我們如何避免左遞歸)。所以讓我們做到這一點 - >更換有問題的術語與其他表達式,

Expr ---> Primary BinOp Expr | UnaryOp Expr BinOp Expr | id=Expr BinOp Expr | id[Expr]=Expr BinOp Expr | (Primary | UnaryOp Expr | id=Expr | id[Expr]=Expr) 

我們看到「BinOp Expr的」入門重複。將其解壓縮到另一個語法,這裏的最終結果

Expr' --> e | BinOp Expr 

Expr -- > Primary Expr' | UnaryOp Expr Expr' | id=Expr Expr' | Primary Expr' | id[Expr]=ExprExpr' 

附註e:它說的表達也可以是任何主要的,UnaryOp Expr的等