学习 bison 原理(四)

2023-10-27

学习 bison 原理(四)

第5步: 转变第 4 步的状态机为确定的 LALR 状态机.

在(三)中我们已经看到 LR0 状态机很可能有 r/r 冲突, s/r 冲突,
那这关键的第5步就是用 lookahead(LA) 符号来试图解决 LR0 文法的
不足而导致的冲突.

程序实现在 Lalr.cs 中, 要理解这部分程序, 必须要先理解论文1给出的
概念和算法. 包括如下几个主要概念:
  Direct Read 关系 (DR)
  reads 关系
  includes 关系
  digraph -- 通过高效算法计算传递闭包(Transitive Closure)

主入口函数为 Lalr.lalr(), 其主要步骤如下:
   1. 为计算 lalr 做准备工作: 建立 states[] 等数组.
   2. 初始化需要 LA 的状态, 规则的数组. 建立 goto 数据,
      即 (p, A) -- 从状态 p 经非终结符 A 的转移.
   3. 构造 F[,] 矩阵, 根据 Direct Read, reads 关系计算出 Read.
      结果在 F[,] 中.
   4. 构造 includes, lookback 关系(以稀疏矩阵方式存储).
   5. 根据 F, includes 关系计算出每个 (p, A) 的 FOLLOW[] 集合.
   6. 根据 FOLLOW[], lookback 关系计算出每个(p, A->w) 的 LA[] 集.

再次强调的是, 要细读论文1, 因为 bison 这里使用的算法就是该文中的算法.
我刚看这里代码的时候, 无法和编译原理龙书上的东西对照起来, 以至于即使
看懂了每行代码, 可还是不能理解在做什么, 直到找到了该论文. 这里再给出链接:
 http://3e8.org/pub/scheme/doc/parsing/Efficient%20Computation%20of%20LALR(1)%20Look-Ahead%20Sets.pdf


这里描述的几种关系, 矩阵, 图算法在论文中都有详细的说明, 我能理解部分,
但没有能力转述出来, 所以还是请参见原文. 另就是看看我写的代码注解, 也许
能帮助理解一点.

程序中, digraph() 函数给出了一种图的求传递闭包的高效算法, 是值得学习的.
另程序中 Warshall.TC(), Warshall.RTC() 也是求传递闭包的, 但是时间复杂度
是 O(n^3), 所以可以参照对比来学习的.
 
在求取出 LA 之后, 剩下的问题是解决仍然存在的冲突了, 位于文件 Conflicts.cs 中.
那里 %prec 指定的优先级, %left, %right, %nonassoc 指定的结合性就在那里发生效用,
尤其是对表达式中的各种运算符. 这里能够帮助我们理解为何会产生冲突, 而解决方法则
可以建立在对冲突的本质原因的深刻理解的基础上.

在之后, 程序输出可能的冲突提示/解决信息, 及或一个解析器的代码. 这些略(cs 中也没有
写这些了). 需要了解的要去看 bison c 的源代码. 但我略略的看了一下 bison 2.65
似乎里面还可以输出状态的图形化表示? 以及 xml, json 格式的? 实在没有仔细了解.
但是如果真能如此, 那真是更方便了使用者了, 真是又进几大步了......

下面给出我改写的 c# 的代码, 供大家参考. 如果前后有不一致的地方, 请多谅解, 因为
看前面的时候总有不理解的地方, 就会打问号乱理解的...

     http://vdisk.weibo.com/s/kebem

转载于:https://my.oschina.net/u/232554/blog/94874

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习 bison 原理(四) 的相关文章

随机推荐

  • 在IOS手机safari浏览器的无痕模式下,localStorage不起作用

    无痕模式是黑色风格 正常模式是白色风格 在无痕模式中 使用localStorage setItem 会报错 但在window对象下确实有localStorage setItem方法 if typeof localStorage object
  • 记lombok插件builder模式的一个坑

    使用lombok的builder模式时 如果属性有指定的默认值 不能使用静态的builder build 创建对象 正解见下文 一个坑 最近接手了一套代码 代码中的数据库表id用了UUID 有如下一个实体 import java util
  • BiLSTM官方示例(Tensorflow版)

    A Bidirectional Recurrent Neural Network LSTM implementation example using TensorFlow library This example is using the
  • 四步搭建自己的专属 ChatGPT(附开源代码)

    在未来 ChatGPT将成为人工智能应用领域的支柱 推动人机交互 智能客服和在线教育等领域的发展 使用ChatGPT能够轻松应对各种语言任务 提高工作效率 带来更多的便利和创新 软件架构 java后台技术采用renren框架 springb
  • pnpm在多项目和单项目下的使用问题解答

    pnpm 是一个管理多个项目依赖的工具 它使用类似于 yarn 的方式来处理多个项目之间的依赖 可以按照多项目的workspace方式管理依赖 也可以进行单个项目的依赖管理 pnpm workspace的文件夹标准结构 一个 pnpm wo
  • ajax中response与responseText的区别

    ajax中response与responseText的区别 1 response与responseText的区别 1 response与responseText的区别 1 1 responseType属性 在客户端通过代码告诉请求代理对象
  • java executor 例子_Java ExecutorService四种线程池的例子与说明

    1 new Thread的弊端 执行一个异步任务你还只是如下new Thread吗 new Thread newRunnable Overridepublic voidrun TODO Auto generated method stub
  • PHP判断密码强弱级别

    1 div class form group 2 i class icons icon pwd2 i 3 div
  • 全网最全面的西门子1500硬件冗余项目,博图15.1

    全网最全面的西门子1500硬件冗余项目 博图15 1 非常全面 CAD图纸 合同 上位机软件是intcohid 644593395557
  • 序列检测器

    序列检测器 目标检测连续的三个1 6 6 4章节 第一种方法是采用状态机 第二种方法是用移位寄存器来存储输入值 并检测寄存器的值是否和预设的序列相匹配
  • Linux系统gdb调试常用命令

    GDB GNU调试器 是一款常用的调试工具 用于调试C C 等编程语言的程序 以下是一些常用的GDB命令 1 启动程序 gdb
  • jQuery笔记 (完整详细版)

    2018 9 17 星期一 jQuery 第一章 初识jQuery 第二章 jQuery的事件和API 第三章 jQuery中的动画 第一章 初识jQuery 一 jQuery简介 1 什么是jQuery jQuery是一个优秀的JavaS
  • VUE高德地图实现根据移动覆盖点获得经纬度坐标和详细地址及根据经纬度确定覆盖点

    经纬度手动定位 输入经纬度 显示详细地址 async handleMapPositioning const result await this api getProductLocation this unionId this reMap n
  • C++类

    一个简单的类 定义一个类 class MyClass 类名 public 访问修饰符 MyClass 构造函数 MyClass 析构函数 void function 成员函数 也叫成员方法 private int m data 成员数据 不
  • C++ 计算代码运行时间

    在算法比较中 耗时是一个重要的指标 每次都要去搜别人的博客 今天摘抄一下askunix hjh的博客 感谢博主 原文记录了三种办法 我选择了其中比较易懂的 GetTickCount是函数 GetTickCount返回 retrieve 从操
  • k8s部署Dashboard可视化插件

    DashBoard可视化插件 可以给用户提供一个可视化的Web界面来查看当前集群的各种信息 一 下载Dashboard所需的yaml文件 wget https raw githubusercontent com kubernetes das
  • 关闭虚拟机的防火墙

    CentOS6 切换至root用户 然后输入 service iptables stop 命令即可关闭防火墙 CentOS7 切换至root用户 先输入 systemctl stop firewalld 命令关闭防火墙 然后输入 syste
  • dataclass的作用

    dataclasss的作用 from dataclasses import dataclass dataclass class Person name str age int gender str unknown init 方法用于初始化对
  • HTML转义字符大全

    1 常用转义字符 转义字符串 Escape Sequence 也称字符实体 Character Entity 在HTML中 定义转义字符串的原因有两个 第一个原因是像 lt 和 gt 这类符号已经用来表示HTML标签 因此就不能直接当作文本
  • 学习 bison 原理(四)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 学习 bison 原理 四 第5步 转变第 4 步的状态机为确定的 LALR 状态机 在 三 中我们已经看到 LR0 状态机很可能有 r r 冲突 s r 冲突 那这关键的