簡體   English   中英

在bison中應如何定義二元運算符?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM