加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

搜索 – Flex和Bison Associativity难度

发布时间:2020-12-15 01:46:49 所属栏目:百科 来源:网络整理
导读:使用Flex和Bison,我有一个布尔查询语言的语法规范,它支持逻辑“和”,“或”和“非”操作,以及使用“()”的嵌套子表达式. 一切都很好,直到我注意到像“A和B或C和D”这样的查询我想解析为“(A B)|(C D)”实际上被解释为“A( B |(C D))“.我几乎可以肯定这是一
使用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没有给出“或”适当的优先权.

解决方法

来自野牛文档:

Operator precedence is determined by
the line ordering of the declarations;
the higher the line number of the
declaration (lower on the page or
screen),the higher the precedence.

所以在你的情况下,OR在屏幕上较低并且具有更高的优先级.
将订单更改为

%left OR
%left AND

(我还没有测试过)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读