2011-05-31 28 views
0

我們使用GPPG(本質上是Bison的bison)來爲編程語言生成解析器。除了一個真正討厭的位,一切都很好。我們解析的語言有一種「隱式比較」規則,其中「表達式表達式」應該被解釋爲「表達式==表達式」。GPPG(野牛) - 如何實現「表達式」概念

例如,這是一個完全有效的語句:

If SomeValue False Then 
EndIf 

這顯然介紹解析器生成過程中的種種矛盾。我第一次嘗試解決這些問題是沿着這些方向發展的(爲簡潔起見)。我試圖對規則進行一些重構,而且似乎不再模棱兩可,但我必須忽略一些明顯的東西。

這裏是一個非常小的語法,顯示我有衝突,以及如何我試圖解決這個問題,不能正常工作,雖然

%start program 
%token <Token> Plus 
%token <Token> Times 
%token <Constant> Constant 

%left Plus 
%left Times 
%left IMPLICIT_COMPARISON 

%% 

program: expression; 

expressionBase: Constant 
    | expression Plus expression 
    | expression Times expression; 

expression: expressionBase 
    | expression expressionBase %prec IMPLICIT_COMPARISON; 

%% 

任何幫助,將不勝感激

回答

1

如何:

program: expression; 

expressionBase: Constant 
    | expressionBase Plus expressionBase 
    | expressionBase Times expressionBase; 

expression: expressionBase 
    | expressionBase expression; 

您需要從底層構建語法頂部,而不是混合的低層次的概念(如expressionBase)AMD高層的人(如expression)。高層次的是用低層次的。如果你需要它周圍的其他方式,你必須清楚地界定與括號或一些這樣高層次的概念,象下面這樣:

expressionBase: Constant 
    | expressionBase Plus expressionBase 
    | expressionBase Times expressionBase 
    | LeftParen expression RightParen; 

實際的規則相當複雜,但這應該讓你開始。

+0

除了你的解決方案的優先順序是錯誤的(不知道在我的例子中是否錯誤,沒有檢查,sry)。某些二元運算符的綁定比隱式比較低。例如,2 3 == True可以作爲(2 == 3)== True,而不是2 ==(3 == True) – LorenVS 2011-05-31 05:51:54

+0

hm ...如果我真的可以使它工作,在3個級別做...一秒鐘,去嘗試 – LorenVS 2011-05-31 05:54:24

+0

嘿謝謝你,只是有事情的工作。只需要將事物分成三個層次,即高綁定二元運算符,隱式比較,然後是低綁定二元運算符......謝謝,只是需要考慮更好:) – LorenVS 2011-05-31 06:00:13