当前位置: 首页 > news >正文

【编译原理】看书笔记

参考书籍:《编译系统透视_图解编译原理》

1. 词法分析

1.1 如何理解上下文无关法?

编译器用生成式来对代码进行词法和语法解析,只需要使用生成式约定的规则,就可以从一串文本中,确定一个符合语法的语句后,就可以明确这个语句的含义,不需要这条语句前面的内容(即上文),和下面的内容(即下文)来确定这条语句所表达的含义,也就是说语句所表达的含义不会有歧义。

这里容易误解的是,根据生成式解析代码的过程中,是需要查看一定的上下文的,因为我们需要根据已经解析的符号,加上后面出现的符号,来判断语句的类型和内容,这个过程本身就是一种上下文分析的过程,只不过这个上下文范围很小。一旦根据生成式解析出来一条语句,这条语句的含义就确定了,不存在歧义,这条语句的所有想表达的信息,都可以由自身表达出来,不依赖上下文去确定其含义,其含义也不会受到上下文内容的影响。关于这一点,大家要仔细揣摩,加深理解。

这样公式化的解析方式,实现起来很简单,有利于编译器的设计和实现。

1.2 词法分析

词法解析是编译的第一步,它的规则相对来说比较简单,它是语法解析的基础。语法解析在词法解析结果的基础上,又增加了很多灵活的语法规则。这种设计可以看做是对系统的分层设计。

词法分析分析出来的词,一般叫做 token。也就是说,词法分析,会把源码文本流,转为token流。

不管词法分析还是语法分析,都是根据生成式描述的规则去解析的。只要满足生成式的规则,就能100%确定一个token的类型和内容,不依赖于其他内容(上下文无关)。试想一下,如果依赖于其他内容,那我们是不是要把整个源码全部读取出来以后,才能确定其中某个部分的真实含义?如果这样设计编译器,编译器会非常复杂,而且设计出来的编程语言,需要根据语境去判断代码含义,很容易出现歧义,这是工程上我们不想看到的,我们需要稳定安全的机制,保证产品的稳定安全。

生成式在我们前面的文章中有讲解过。简单来说,一个token或一条语句的生成式就是:

语句 = 起始符 + 中间内容 + 结束符。

其中,中间内容又可以包含其他语句,形成嵌套结构。

根据以上思路去编写代码,只需要:

  1. 先根据起始符号,判断语句可能是哪种类型,这一步缩小了判断的范围,便于后续的解析;
  2. 再持续向下解析,进一步判断语句的类型以及获取语句的成分,内容;
  3. 最后判断解析结束符,明确语句的边界,完成语句解析。

有些教材大篇幅讲BNF,看得头疼。亲自写一写能更好地理解。

《编译系统透视_图解编译原理》书中的状态转移图相对于生成式更好理解,建议采用书中的状态转移图去画生成式。


http://www.mrgr.cn/news/29157.html

相关文章:

  • 【Pikachu】目录遍历实战
  • Mac的极速文件搜索工具,高效管理文件
  • uniapp使用scroll-view下拉刷新与上滑加载
  • CSS多列布局:打破传统布局的束缚
  • PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级
  • 新Activity启动时Task的位置(分屏场景)
  • C++和OpenGL实现3D游戏编程【目录】
  • WebMagic:强大的Java网络爬虫框架
  • Python绘制基频曲线——实例解析与应用探讨
  • 最新腾讯高精度动作模仿模型MimicMotion分享
  • golang学习笔记27——golang 实现 RPC 模块
  • Golang | Leetcode Golang题解之第414题第三大的数
  • JavaScript:驱动现代Web应用的关键引擎及其与HTML/CSS的集成
  • 一天认识一个硬件之显示器
  • 如何在Java服务中实现数据一致性:事务与锁机制的综合应用
  • 【技术分享】走进Docker的世界:从基础到实战全面解析(Docker全流程)
  • golang学习笔记26——golang 实现节点筛选与负载均衡
  • Windows目录监控部署
  • Qt容器类控件——QGroupBox和QTabWidget
  • pythonnet python图像 C# .NET图像 互转
  • C++ 类的默认成员函数-构造函数
  • 操作系统----操作系统引导
  • 71、Python之函数式编程:不能定义常量,Python如何支持不可变性?
  • 每日学习一个数据结构-FST数据结构与算法
  • rust快速创建Tauri App ——基于create-tauri-app
  • 变电站缺陷数据集8307张,带xml标注和txt标注,可以直接用于yolo训练