保健哥的编译原理学习笔记

编译器是一个程序,他的核心功能是把源代码翻译成目标代码

编译器结构:

语法分析检查是否合法 ,然后在内存当中建立一个AST抽象语法树(对程序语法的一个抽象表示),对语法树的合法性做处理(一个变量使用之前是否被声明),

这2个图是对词法进行解析.

词法分析器主要通过手工编码和生成器实现(一个比较麻烦,但是性能效率比较高,第二个的话方便快速,但是比较难控制细节),

手工构造的话主要要理解转移图.

语法分析器的话主要是对输入的记号流以及所使用的编程语言的语法规则进行处理,然后生成一个抽象语法树.(平常报错就是这里);

再然后就是了解上下文无关文法,

显然看一眼就明白了什么叫上下文无关文法.

再需要了解的一个知识点就是分析树和二义性文法

显然匹配同一个句子也会产生两颗不同的分析树,分析树的含义要从树的后续遍历来查看.

给定文法G,如果存在句子G,使得产生两颗不同的分析树,那么G就是二义性文法.(会导致程序运行结果不唯一)

语法分析器面临的一个问题就是给定文法G和句子S,回答S是否能从G推导出来,

第一个实现算法是自顶向下分析的算法思想,从G的开始符号出发,随意推导某个句子t,比较t和s,也就是通过暴力遍历回溯的方法来进行,他对应于分析树自顶向下的构造顺序,

第二个算法是递归下降分析算法

他把一个句子能否推导成功的运算进行分治求解(N V N 分别能否推导出 g d w)

LL(1)分析算法:

注意是从右向左压栈

ANTLR的底层算法实现

猜你喜欢

转载自blog.csdn.net/qq_38835878/article/details/82355616