2013-04-07 68 views
1

例如編譯器的設計和消除左遞歸

E -> E+T | T 

E -> T E' 
E' -> +T E' | null 

如果我有生產

B -> B == C | C 

將這些是正確的作品?

B -> C B' 
B' -> ==C B' | null 

,我遇到的麻煩另一家運營商是「!」,我知道它是高於一切的優先級在我的語法,除了「()」 我想出了這個,但我不知道這是否是正確。

T -> U T' 
T' -> *U T' | /U T' | null 
U -> ! ident | F 
F -> (A) | idlit | ftncall 
ftncall -> ident(params) 

回答

0

我認爲兩者都是除了你必須定義paramsid-list以及第二個是正確的。

類似於:

params - > id | id,params

爲了弄清楚一個語法是否有一個(模棱兩可的)左遞歸,最簡單的方法是將語法提供給野牛,解析生成器,如果語法不明確,它將發出警告/錯誤消息。

正如@ibid所提到的,非模糊左遞歸文法通過野牛正確分析。 有幾個在線教程(開始你可以使用:http://alumni.cs.ucr.edu/~lgao/teaching/bison.html

+1

野牛不會警告左遞歸 - 事實上,對於野牛,你想使用左遞歸自然出現的地方。 – ibid 2013-04-08 07:51:10

+0

@ibid,我很抱歉,我被曖昧左遞歸語法混淆。 – 2013-04-09 04:20:32