[英]How should binary operators be defined in bison?
我正在用bison用C語言編寫一個解析器,盡管到目前為止,在所有情況下它似乎都可以正常工作,但是我在二進制運算符上收到了一堆移位/減少警告(在我的一元NOT運算符上得到了警告)好)。
binary_op :
PLUS { }
| MINUS { }
| TIMES { }
| SLASH { }
| POWER { }
| AND { }
| OR { }
| LE { }
| LT { }
| GE { }
| GT { }
| EQ { }
| NE { }
| MOD { }
;
unary_op :
NOT { }
;
expr :
...
| unary_op expr { }
| expr binary_op expr { }
當我通過野牛--verbose運行.y文件時,我看到:
state 51
11 set_existence: expr . IN set
12 | expr . NOT IN set
34 expr: expr . binary_op expr
34 | expr binary_op expr .
...
NOT shift, and go to state 26
AND shift, and go to state 27
OR shift, and go to state 28
....
NOT [reduce using rule 34 (expr)]
AND [reduce using rule 34 (expr)]
OR [reduce using rule 34 (expr)]
我看不到任何實際解析二進制運算符的問題,但是看來我應該還是應該解決移位/減少問題。 我不知道沖突在哪里-set_existence生產似乎完全無關。 我最好的猜測(在黑暗中拍攝)是可能與EQ用作二進制運算符(相等比較)以及賦值(例如,“ foo = bar = baz;”)有關的事實根據bar和baz是否相等將foo設為true / false)。 如果我將相等比較更改為==(“ foo = bar == baz;”),則我的解析器將按預期方式運行,但仍然具有相同的移位/減少沖突。
編輯 :我確實指定了關聯性:
%left OR
%left AND
%left NOT
%left LT LE GT GE NE EQ
%left PLUS MINUS
%left TIMES MOD SLASH
%left POWER
有兩種方法可以避免這種情況。 第一種是使用%left
, %right
和%nonassoc
命令指定優先級(請參閱手冊 )。
我個人更喜歡的另一種選擇是將優先級直接編碼為語法。 例如,以下是用於簡單算術表達式的BNF:
expr ::= term | expr + term
term ::= factor | term * factor
factor ::= number | ( expr )
這消除了語法級別的歧義解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.