2011-03-15 113 views
4

我必須編寫一個JavaCUP規範,並且我已經獲得了EBNF語法。但是,我不知道如何在兩者之間進行轉換。我已經聽到了基本的想法,但我並不真正瞭解我需要改變什麼,「終端」是什麼等等。將EBNF語法轉換爲上下文無關語法

任何人都可以解釋如何從一個轉換到另一個,或者如果有某個地方我可以在哪裏讀到它?

回答

4

EBNF語法與正常的BNF類似,但具有一些額外的功能(類似於正則表達式運算符)作爲語法糖。既然你沒有表現出你的語法,我只能猜測你需要desugar轉換爲正常BNF什麼零件,但在這裏是最常見的(像JavaCUP一個LALR發生器):

B* becomes Bstar, defined as Bstar ::= epsilon; Bstar ::= Bstar B 
B+ becomes Bplus, defined as Bplus ::= B; Bplus ::= Bplus B 
B? becomes Bquestion, defined as Bquestion ::= epsilon; Bquestion ::= B 
B | C becomes BorC, defined as BorC ::= B; BorC ::= C 

epsilon標識符這裏是你的解析器生成器表示空字符串。

+0

你需要添加:X:=(A | B)變成trwo規則:X:= A和X:= B – 2011-03-15 03:41:46

+0

@Ira:謝謝你的建議 - 我把它放進去。 – 2011-03-15 03:49:51

+0

@Jeremiah:I不要以爲你做得對。我的轉變擺脫了EBNF運營商「|」通過將其減少到兩個單獨的語法規則。您的重鑄定義了「|」用「|」表示;這有什麼幫助? – 2011-03-15 04:02:57