学习编译原理的第三天
2.3 语法制导翻译
(注:龙书上第二章的部分知识点,只是挑选了一些基本定义)
- 定义:语法制导翻译时通过向一个文法的产生式附加一些规则或程序片段而得到的。
-
相关概念:
- 属性:属性表示与某个程序构造相关的任意的量
- (语法制导翻译的)翻译方案:是一种将程序片段附加到一个文法的各个产生式的表示法。
-
综合属性:
- 语法制导定义把:
- (1)每个文法符号和一个属性集合相关联;
- (2)每个产生式和一组语义规则(用于计算与该产生式中符号相关联的属性值)相关联
- 求值方式:对于一个给定的输入串x,构建x的一棵语法分析树。然后按照 应用语义规则来计算语法分析树中各个节点的属性。
- 定义:如果某个属性在语法分析树结点N上的值是由N的子节点以及N本身的属性值确定的,那么这个属性称为综合属性。
- 语法制导定义把:
-
简单语法制导定义
- 定义:具有只用将产生式头部体中各非终结符号的翻译结果按照他们在非终结符号中的出现顺序连接起来,并在其中穿插一些附加的串即可得到代表产生式头部的非终结符号的翻译结果的字符串 性质的语法制导定义即为 简单语法制导翻译。
第三章 词法分析
3.1 词法分析的作用
- 词法分析是编译的第一阶段。
- 词法分析器的主要任务是 读入输入字符串,将它们组成词素,生成并输出一个词法单元,每个词法单元对应一个词素。
- 与符号表进行交互:当发现一个标识符的词素时,要将这个词素添加到符号表中(还可读取标识符信息以便确定向语法分析器传送的词法单元)
- 任务:
- (1)过滤源程序中的注释和空白(空格,制表符,换行符以及在输入中用于分隔的符号)。
- (2)将编译器生成的错误消息与源程序的位置联系起来。
-
两个级联的处理阶段:
- (1)扫描阶段 主要负责一些不需要生成词法单元的简单处理(删除注释和将连续多个空白字符压缩成一个字符)。
- (2)语法分析阶段 处理扫描阶段的输出并产生词法单元。
-
将编译过程划分为词法分析和语法分析阶段的原因:
- 1) 简化编译器设计。分离使得至少能简化其中一项。
- 2)提高编译器效率。
- 3)增强编译器的可移植性。
-
基本术语:
- 词法单元:由一个词法单元名(是由语法分析器处理的输入符号)和一个可选的属性值组成。是一个表示某种语法单位的抽象符号。
- 模式 描述了一个词法单元的词素可能具有的形式。
- 词素 是源程序中的一个字符序列,和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。
3.2 输入缓冲
3.2.1 缓冲区对
- 原因:由于在编译一个大型源程序时需要处理大量字符,需要大量时间。
- 解决方式:使用两个交替读入的缓冲区。每个缓冲区的容量都是N(通常是一个磁盘块的大小)个字符。
- 维护了两个指针:
- 1)lexemeBegin 指针:指向当前词素的开始处。
- 2)forward 指针:指向词素的结尾字符,(首先检查是否到达缓冲区末尾,如果到达,指向新缓冲区的头部)一直向前扫描,直到发现某个模式被匹配为止
3.3 正则表达式(RE)
- 概念:正则表达式是一种用来描述正则语言的更紧凑的表示方式
- 正则表达式可以由 较小的正则表达式 按照特定队则 递归 地构建。每个 正则表达式r定义(表示)一个语言,记作L(r)。这个语言也是根据r的 子表达式所表示的语言递归定义 的。
-
定义:
- 空串是一个RE,L() = {}
- 如果a,则a是一个RE,L(a) = {a};
- 假设r和s都是RE,表示的语言分别是L(r)和L(s),则
- 选择:r|s是一个RE,L(r|s) = L(r)L(s)
- 连接:rs是一个RE,L(rs) = L(r)L(s)
- 闭包:r* 是一个RE,L(r) = (L(r))
- (r)是一个RE,L((r)) = L(r)
- 运算的优先级:闭包(*), 连接,选择(|)
-
正则文法和正则表达式等价
- 对任何正则文法G,存在定义同一语言的正则表达式r。
- 对任何正则表达式r,存在生成同一语言的正则文法G。
3.4 正则定义
- 定义:
- 正则定义 给一些RE命名,并在之后的RE中像使用字母表中的服啊后一样使用这些名字。
3.5 有穷自动机
- 有穷自动机(FA)是一类处理系统(具有一系列 离散的输入输出信息和 有穷数目的内部状态(状态:概括对过去输入信息处理的状况))建立的数学模型。
- 系统只需要根据 当前所处的状态和 当前面临的输入信息 就可以决定系统的 后继行为。每当系统处理了当前的输入后,系统的内部状态也就发生了改变。
-
典型例子:电梯控制装置
-
FA模型:
- 输入带:用来存放输入符号串。
- 读头:从左至右逐个读取输入符号,不能修改(只读),不能往返移动。
- 有穷控制器:具有有穷个状态数,根据 当前的状态 和 当前输入符号 控制转入 下一状态。
-
FA的表示:
-
转换图
-
结点:FA的状态
- 初始状态(开始状态):只有一个,由start箭头指向。
- 终止状态(接收状态):可以有多个,用双圈表示。
-
带标记的 有向边: 如果对于输入a,存在一个从状态q的转换,就在p,q之间画一条有向边,并标记上a.
-
-
-
FA定义(接收)的语言
- 给定输入串x,如果存在一个对应于串x的从初始状态 到 某个 终止状态的转换序列,则称串x被该FA 接收。
- 由一个有穷自动机M接收的所有串构成的集合称为是该FA定义(或接收)的语言,记作L(M).
-
最长子串匹配原则
- 当输入串的 多个前缀与一个或多个模式匹配时,总是 选择 最长的前缀 进行匹配。
- 在到达某个终态之后,只要输入带上还有符号,就继续前进,以便寻找尽可能长的匹配。
-
FA的分类
- 确定的FA(DFA)
- 可以用转换表来表示DFA
- 算法实现
- 非确定的FA(NFA)
- 带有空边的NFA:即从一个状态到另一个状态不用任何字符即可到达。
- 不带有空边的NFA
- 不带有空边的NFA和带有空边的NFA具有等价性
- DFA和NFA具有等价性
- 区别:
- (1)多(单)值映射
- (2)(非)空转移
- 确定的FA(DFA)
从正则表达式到有穷自动机
例子
从NFA到DFA的转换方法
- 算法:子集构造法
识别单词的DFA
-
词法分析阶段的错误处理
- 单词拼写错误
- 非法字符
- 词法错误检测
- 如果当前状态与当前输入符号在转换表对应项中的信息为空,则报错,调用错误处理程序。
-
错误处理方式:
- 查找已扫描字符串的最后一个对应于某终态的字符
- 如果找到了,将该字符与其前面的字符识别成一个单词。然后将输入指针退回到该字符,扫描器重新回到初始状态,继续识别下一个单词。
- 如果没找到,则确定出错,采用错误恢复策略。
- 最简单的错误恢复策略:“恐慌模式”恢复
- 从剩余的输入中不断删除字符,直到词法分析器能够在剩余输入的开头发现一个正确的字符为止。
- 最简单的错误恢复策略:“恐慌模式”恢复
- 查找已扫描字符串的最后一个对应于某终态的字符
附上其他视频中的要点: