使用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

前者优先定义将呈现此为真,而后者将呈现为假。如所解释我测试这两种情况下两者的工作。

仔细检查您的测试,以确保。另外请注意,它是左边%,%右等的顺序定义的优先级,而不是你定义你自己的规则的顺序头部分定义。如果仍然没有工作,也许它在你的代码中的一些其他地区多数民众赞成搞乱它,或者你的野牛的版本是不同的(我只是在黑暗中在这一点上拍摄)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top