2016-07-08 58 views
0

我有以下語法:使用Mid規則操作 - 野牛解析器

expr : FUNC '(' expr ')' { ... } 
    | FUNC '(' expr ',' expr ')' { ... } 
    | expr '+' expr { ... } 
    | expr '-' expr { ... } 
    | NUM { ... } 

而且我想進入EXPR,根據不同的規則之前執行的FUNC規則不同中旬規則行動。

含義:

expr : FUNC { DO_ACTION_1 } '(' expr ')' { ... } 

expr : FUNC '(' { DO_ACTION_1 } expr ')' { ... } 

和在另一種情況下:

expr : FUNC { DO_ACTION_2 } '(' expr ',' expr ')' { ... } 

expr : FUNC '(' { DO_ACTION_2 } expr ',' expr ')' { ... } 

,但我一直在減少/減少錯誤,而$ 1(或$ 2,取決於上述用法)永遠不會減少。

回答

0

此問題在bison documentation中描述,解決歧義的機制也是如此。

含糊不清是由於野牛需要承諾兩個規則中的哪一個在解析過程中提前申請,並且在行動階段它不能說明。

當它匹配:

FUNC 

FUNC '(' 

甚至

FUNC '(' expr 

它可能仍然是三個語法規則,因而行動是模糊的。

消除不確定性可以附加到所述終端符號的動作(無論FUNC'(')或使一個規則,以包含該操作的前同步碼:

func : FUNC { DO_ACTION1 } ; 
bra : '(' { DO_ACTION1} ; 

func_open : FUNC '(' expr { DO_ACTION1 }; 
expre : func_open | func_open ',' expr | etc 
+0

Tompsett - 這並不能解決我的問題。我可以使用類似於你所建議的FUNC MIDAC'('expr')'和FUNC MIDAC'('expr','expr')',但這對兩個規則都意味着相同的動作。使用MIDAC規則不會發生衝突。在我的問題中,我指出我需要不同的行動。如果規則與func 1 arg匹配,我需要在進入expr之前執行操作A.如果func 2參數匹配,我需要在進入expr之前執行操作B.這是問題。 –