使用 Flex 和 Bison,我有一个布尔查询语言的语法规范,它支持逻辑“与”、“或”和“非”操作,以及使用“()”的嵌套子表达式。
一切都很好,直到我注意到像“A和B或C和D”这样我想解析为“(A&B)|(C&D)”的查询实际上被解释为“A&(B |( C&D))”。我几乎可以肯定这是一个关联性问题,但似乎无法在任何地方找到适当的解释或示例——否则我错过了一些重要的东西。
来自 boolpars.y 的相关信息:
%token TOKEN
%token OPEN_PAREN CLOSE_PAREN
%right NOT
%left AND
%left OR
%%
query: expression { ... }
;
expression: expression AND expression { ... }
| expression OR expression { ... }
| NOT expression { ... }
| OPEN_PAREN expression CLOSE_PAREN { ... }
| TOKEN { ... }
;
谁能找到漏洞?我不明白为什么 Bison 没有给予“或”适当的优先级。