2009-06-04 16 views
0

我試着去建模EBNF表達幫助移動/減少衝突 - 嘗試模型(XA)*(XB)*

("declare" "namespace" ";")* ("declare" "variable" ";")* 

我已經建立了YACC(即時通訊使用MPPG)語法,這似乎來表示這一點,但它不符合我的測試表達式。

測試情況下,我試圖匹配是

declare variable; 

從詞法記號流是

KW_Declare 
KW_Variable 
Separator 

語法解析說,有一個「移進/歸約衝突,國家6在KW_Declare上「。我試圖用「%left PrologHeaderList PrologBodyList」來解決這個問題,但這兩種解決方案都無法解決。

Program      : Prolog; 
Prolog      : PrologHeaderList PrologBodyList; 

PrologHeaderList   : /*EMPTY*/ 
          | PrologHeaderList PrologHeader; 
PrologHeader    : KW_Declare KW_Namespace Separator; 

PrologBodyList    : /*EMPTY*/ 
          | PrologBodyList PrologBody; 
PrologBody     : KW_Declare KW_Variable Separator; 

KW_Declare KW_Namespace KW_Variable隔板用值的所有令牌 「聲明」, 「naemsapce」, 「可變」, 「;」。

回答

3

自從我使用了類似yacc的東西以來已經很長時間了,但這裏有幾條建議可能會幫助或者不會幫助。

在這種情況下,您似乎需要一個2-token預測。解析器獲得最後PrologHeader,並且它必須決定下一步的結構是否是PrologHeaderPrologBody,它不能告訴大家,從KW_Declare。如果在這種情況下有一個增加前瞻的指令,它可能會解決問題。

你也可以引入文脈融入你的行動:而不是定義PrologHeaderListPrologBodyList,定義PrologRuleList並有如果頭一個身體後出現的動作拋出一個錯誤。醜陋的,但有時你必須這樣做:在語法中出現簡單的東西在生成的解析器中可能並不簡單。

一個hackish的辦法可能是令牌結合:不是KW_DeclareKW_Variable,有你的詞法分析器識別的空間和使用KW_Declare_Variable。既然都是關鍵字,那麼你就不會碰到名稱空間碰撞問題。

+0

這是我最後採用的方法。我想我可以在代碼中進行驗證。 – Sprotty 2009-06-04 17:17:20

0

頂部的語法是規則的,所以IIRC可以將其繪製爲DFA(或NDA並將其轉換爲DFA),然後將DFA轉換爲語法。這是一段時間的豆腐,所以我會把這項工作留給讀者作爲練習。