野牛默认优先解决方案

时间:2014-08-02 14:08:01

标签: parsing bison

我正在编写一个受Bison启发的解析框架,而且在Bison手册中有一些我不太了解的内容。

从Bison手册5.3.5优先顺序如何运作:

  

...每个规则都优先于组件中提到的最后一个终端符号。

  

并非所有规则都有优先权。如果规则或前瞻令牌没有优先权,则默认为移位。

据我所知,这归结为:

  • 令牌具有优先权,规则不具有 - >移
  • 规则优先,令牌没有 - >移
  • 两者都没有优先权 - >移
  • 两者都有优先权:
    • 令牌具有更高的优先级 - >移
    • 规则具有更高的优先级 - >减少
    • 等同优先权 - >使用优先级的关联性来确定操作

但是,这不意味着一个不包含任何具有声明优先级的终端符号的规则永远不会减少吗?我错过了什么?

例如,以下语法: S -> E + E E -> foo1 E -> foo2

给出七个州的dfa,前两个是:

  • 状态0
    • 产品:
      • S' - > 。 S $
      • S - > 。 E + E
      • E - > 。 foo1
      • E - > 。 foo2的
    • 边缘:
      • E - > 3
      • S - > 4
      • foo1 - > 1
      • foo2 - > 2
  • 州1
    • 产品:
      • E - > foo1。 lookahead:+,$

解析字符串foo1 + foo2时,解析器移动令牌foo1并最终处于状态1.下一个先行令牌是+,而不是' +'也不是规则E - > foo1有任何声明的优先级,这意味着解析器应该移位,但状态1中没有这样的边缘,这导致解析器返回语法错误。

提前致谢

1 个答案:

答案 0 :(得分:3)

优先规则仅适用于含糊不清的情况;也就是说,如果存在转变/减少冲突。如果没有任何冲突,解析器将根据语法进行移位或缩小。