Flex和野牛关联性困难
-
20-08-2019 - |
题
使用Flex和野牛,我有一个布尔查询语言,它支持逻辑“和”语法说明书中,“或”,和“非”操作,以及嵌套的子表达式使用“()”。
所有都很好,直到我注意到,像“A和B或C和d”,这我想解析为“(A&B)|(C&d)”的查询实际上正在解释为“A&(乙|(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 { ... }
;
任何人都可以找到漏洞?我看不出为什么野牛不给“或”适当的优先级。
解决方案
从野牛文档:
运算符优先级由下式确定 声明的线排序; 较高的行号 声明(在网页的下方或 屏幕),则优先级越高。
所以你的情况或在屏幕上较低,具有较高的优先级。 的顺序改变为
%left OR
%left AND
(I没有测试它虽然)
其他提示
为什么不分裂的制作,如在从此片段 一个C-ISH语言
logical_AND_expression:
inclusive_OR_expression
| logical_AND_expression ANDAND inclusive_OR_expression
{$$ = N2(__logand__, $1, $3);}
;
logical_OR_expression:
logical_AND_expression
| logical_OR_expression OROR logical_AND_expression
{$$ = N2(__logor__, $1, $3);}
;
我对我自己的实现进行的测试,并从我的测试中,马辛的答案是正确的。如果我定义的优先级如下:
%left OR
%left AND
,则表达式A和B | C&d将减少到((A&B)|(C&d))
如果我定义的优先级如下:
%left AND
%left OR
,则表达式A和B | C&d将减少到((A&(B | C))&d)
一微分表达式是:
true & true | true & false
前者优先定义将呈现此为真,而后者将呈现为假。如所解释我测试这两种情况下两者的工作。
仔细检查您的测试,以确保。另外请注意,它是左边%,%右等的顺序定义的优先级,而不是你定义你自己的规则的顺序头部分定义。如果仍然没有工作,也许它在你的代码中的一些其他地区多数民众赞成搞乱它,或者你的野牛的版本是不同的(我只是在黑暗中在这一点上拍摄)。
不隶属于 StackOverflow