• 前端编译原理 笔记 -- BISON


    前面总结的差不多了,这边记录下,零碎的相关阅读可以备忘的一些知识点

         Bsion文档,下面是中文的地址  https://blog.csdn.net/chinamming/article/details/16974571

    一. 3.4 递归规则-Recursive Rules

       上面的是左递归,下面的是右递归,推荐的是尽量左递归的写法

    .3.7.2 操作符优先级-Operator Precedence

       使用%left,%right或者%nonassoc 可以一次声明一个记号并指明它的优先级和结合性. 这些被称做优先级声明(precedence declarations)

    • 操作符的结合性决定了如何重复使用嵌套的操作符: `x op y op z' 是先组合xy,还是先组合yz%left指明左结合性(先组合xy)而 ,%right指明了有结合性(先组合yz) .%nonassoc指明了无结合性,即`x op y op z' 被认为是一个语法错误.
    • 一个操作符的优先级决定了它如何与另外的操作符嵌套使用. 在一个优先级声明中声明的所有记号有相同的优先级, 如何嵌套使用它们取决于它们的结合性. 当两个记号在不同的优先级声明中,稍晚声明的拥有更高的优先级,并且先被组合.

      解决中冲突的方法是比较正在考虑的规则和超前扫描记号的优先级. 如果超前扫描记号的优先级更高,那么选择移进. 如果规则的优先级更高,那么选择归约. 如果它们有相同的优先级, 那么靠那个优先级的结合性来作出选择

    .5.2 移进/归约冲突-Shift/Reduce Conflicts

        

      这里我们假定IF,THENELSE是用来指定关键字的终结符.

      当ELSE被读入成为超前扫描记号, 栈中的内容(假定输入是有效的)刚好可以由第一个规则进行归约. 但是移进ELSE也是合法的, 因为这最终将会导致由第二个规则进行的归约.

      这种情况,移进或者归约都是有效的,被称为移进/归约冲突(shift/reduce conflict). Bison被设计成选择移进来解决这些冲突, 除非有其它的操作符优先级的指导

     四.5.4 上下文依赖优先级-Context-Dependent Precedence

       一个操作符的优先级通常依赖于上下文. 这最开始听起来很古怪,但它的确很常见.一个负号操作符有比一元操作符更高的优先级并且比二进制操作符的优先级稍低(低于乘法). 

    五.5.7 神秘的归约/归约冲突-Mysterious Reduce/Reduce Conflicts

    没怎么看明白,主要是2种状态不能区分,要么就是修改语法看看能不能更完善,要么就是下面的推荐

    当问题产生时, 你通常可以通过指明两个被混淆的分析器状态 并且添加使它们看起来截然不同的额外的东西 来修补它, 在上面的例子中, 如下地向return_spec添加一个规则会消除这个问题:

    这样做改正这个问题, 因为在return_spec开始部分ID后的上下文中引进了一个可能的额外的活动规则. 这个规则在param_spec相应的上下文中并不是活动的, 所以两个上下文接受了不同的分析器状态. 只要yylex永远不产生记号BOGUS, 新增的规则就不能改变分析输入的实际方法.

  • 相关阅读:
    spring websocket 记录
    mysql-enum
    再问jvm内存管理
    video相关参数、操作和事件
    监听页面关闭和刷新的总结
    VUE路由新页面打开的方法总结
    VUE的一个数据绑定与页面刷新相关的bug
    element-ui笔记
    Vue笔记(props和 mounted)
    Python总结(二)
  • 原文地址:https://www.cnblogs.com/legu/p/11352641.html
Copyright © 2020-2023  润新知