编译原理笔记 2

Posted CD Yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理笔记 2相关的知识,希望对你有一定的参考价值。

语法分析 (Syntactic Analysis / Parsing)

识别程序语法结构,构造抽象语法树(Abstract Syntax Tree)

  1. 自顶向下
  • 递归下降算法(Recursive Descent Parsing)
    • 下降:语法分析的过程中,上级文法嵌套下级文法。
    • 递归:上下文无关文法。

算术表达式在简单情况下,使用类似于词法分析用到的正则文法可以解析(如 "int a = 1")。
但在复杂情况下("1+2*3""1*2+3" 等),难以穷尽各种组合,需要抽象出一种通用的规则:乘除法 看作 加减法 的子规则,生成 AST 时,乘除法节点就一定是加减法的子节点,从而达到排列优先级的效果。

function add = multiply | (add + multiply)
function multiply = numericLiteral | (multiply * numericLiteral)

上面的定义方式转换为算法时,会出现 左递归 的情况(add 递归调用 add)
将 add 交换到加号右侧:

function add = multiply | (multiply + add)
function multiply = numericLiteral | (numericLiteral * multiply)

这样就能解决无限递归的问题了,但此时又会出现 "1+2+3" 优先计算了 2+3 的问题(从右向左计算,改变了加法的结合性)

  1. 自底向上
    回溯的次数较少

以上是关于编译原理笔记 2的主要内容,如果未能解决你的问题,请参考以下文章

编译原理学习笔记错误处理

黑马公开课——运行原理与GC学习笔记

编译原理笔记 2

编译原理让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 2.)(python/c/c++版)(笔记)

编译原理笔记 1

Java学习笔记:java编译跨平台运行原理