编译原理-词法语法理论
第二章创建一个简单的语法指导器里面设计了很多理论知识,暂时只记录关键概念。这一章看的很困,外面阳光明媚,只能通过打字来压制一下困意😂😂😂
关键概念
-
语法制导翻译器
语法制导翻译器是用于构建语法翻译器的程序 -
语法的定义
一种用于描述程序设计语言语法的表示方法 - “上下文无关文法”,这种文法用于前端编译器
- 语法分析器
语法分析是决定如何通过一个文法生成一个终结符号的过程。语法分析有两个过程,分别是自顶向下、自底向上两种方法,指的是语法分析对语法分析的构造顺序。
词法分析器
词法分析是编译的第一个阶段.主要是将输入的源代码生成一个词法单元序列,每个词法单元对应一个词素
如下图所示:
@TODO
词法分析器还会完成一些辅助功能例如过滤空白字符、记录源代码行号
词素的识别
源代码是由不同的字符组成的,在进行编译时首先要将输入的字符串进行拆分,拆分成为不同的词素。
对于无法识别成为词素的字符,其实可以通过变化字符来进行匹配,但是这种方案代价太高,不值得使用。我赞同这种观点,编译器的功能就是编译代码而不是尝试对代码进行修复,也是单一职责的表现
-
加载源代码是否会使用完缓冲区?.
不会,词素只需要根据前后一两个字符就可以确定了,因此只需要数千个字节就可以完成这个工作了. -
如何鉴定语言的保留字?
通过在初始化时将各个保留字填入符号表中,符号表会标识这些保留字不是普通的标识符,并且会指向他们说代表的词法单元去
词素识别工具
- Lex/Yacc
Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码。扫描器是一种识别文本中的词汇模式的程序。 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义。一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。 它一次读入一个输入字符,直到找到一个匹配的模式。 如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。 另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。
也就是通过Lex来生成一个’正则表达式’,并进行后续操作
语法分析器
下图所示的是语法分析器在编译器中的过程
@TODO
小结
这一章主要是关于前端编译器的两个部分’词法分析器’和’语法分析器’的一些理论知识的介绍