语法分析
词法分析器
词法分析的任务是:从左往右逐个字符地扫描源程序,产生一个个的单词符号。也就是说,它会对输入的字符流进行处理,再输出单词流。执行词法分析的程序即词法分析器,或者说扫描器。
词法分析的成果就是由一系列单词符号构成的单词流。单词符号其实就是 token,一般有6类:
- 关键字:例如
while
,if
,int
等 - 标识符:变量名、常量名、函数名等
- 常数:例如,
100
,'text'
,TRUE
等 - 运算符:例如
+
,*
,/
等 - 界符:逗号,分号,括号,点等
- 系统函数名 如 scanf、printf、getc等
词法分析器的输出时一个二元式:(单词种别,单词符号的属性值)
。
单词种别通常用整数编码表示
若一个种别只有一个单词符号,则种别编码就代表该单词符号。假定基本字、运算符和符都是一符一种。
若一个种别有多个单词符号,则对于每个单词符号,给出种别编码和自身的值。
标识符单列一种:标识符自身的值表示成按机器字节划分的内部码
常数按类型分种;常数的值则表示成标准的二进制形式。
词法分析器设计
词法分析器的设计工具---状态转换图
状态转换图
状态转换图的实现
正规式与正规集
运算性质
e*=e﹢|⊱
确定有限自动机
状态转换矩阵:状态\字符
化简
非确定有限自动机
为正规式构造NFA
状态转换图
子集构造法确定化
DFA和NFA区别
语法分析
- 语法分析方法
- 自下而上:算符优先分析法、LR分析法
- 自上而下:递归下降分析法、预测分析程序
自上而下分析:
面临的问题
- 回溯问题
- 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的
- 因此如果在后续匹配中出错的话,不得不“回溯”
- 文法左递归问题
- 𝑃→𝑃𝛼,匹配过程会无限循环下去
消除左递归
- 核心思想:左递归变右递归
- 例题
消除间接左递归
消除回溯
提取左公共因子
LL(1)文法:
构造不带回溯的自上而下分析算法:
消除文法的左递归
提取左公共因子,克服回溯
从左到右扫描
最左推导
每一步只需向前查看一个符号
LL(1)分析法
构造FIRST、FOLLOW集合
FIRST(a):首终结符集。a能够推出的所有终结符串中位于串首的那些终结符构成的集合
FLLOW(a): 可以在某句型中紧跟在a后边的终结符构成的集合
例
G[E]:
E-------> TE’
E’------> +TE’ | ε
T--------> FT’
T’----------> *FT’ | ε
F ------------>(E) | i
先求出first集合
答案
first(E) { ( , i }
first(E’) { + , ε }
first(T) { ( , i }
first(T’) { *, ε }
first(F) { (, i }
再求follow集合
答案
follow(E) {#,)}
follow(E’) {#,)}
follow(T) {+,#,)}
follow(T’) {+,),#}
follow(F) {*,+,),#}
预测分析程序
构造预测分析表:
一般来说, 预测分析表可以用矩阵M表示:
(1)矩阵的行表示非终结符号
(2)列表示终结符号和#(结束符号)
(3)矩阵元素M(U,a)表示非终结符号U+输入符号a时,向下推导所应该采取的产生式。
构造预测分析表的步骤
(1)对每个终结符a∈FIRST(a),将A->a加到M[A,a]中。
(2)如果ε∈FIRST(a),则对于任何b∈FOLLOW(A),将A->a加到M[A,b]中。
(3)表格填完后仍然空缺的位置表明没有对应的产生式,即:非终结符号U+输入符号a无法继续向下推导,所以将空缺的位置填写错误信息。(一般默认,可以不写)
自下而上:
基本思想
从输入串开始,逐步归约,直到文法的开始符号
归约:根据文法的产生式规则,把串中出现的产生式的右部替换成左部符号
从树叶节点开始,构造语法树
语法树
短语
直接短语:只有一层孩子节点
素短语:1、直接短语2、至少包含一个终结符3、除它自身外不包含任何更小的素短语
句柄:最左直接短语
算符优先分析法
则运算的优先规则 先乘除后加减,同级从左到右
优先关系
构造优先关系表
例:
LR分析法
规范规约:句柄作为可规约串
从左到右
逆向完成,最右推导,向右查看输入串符合的个数
内容来源
编译原理学习笔记-3:词法分析(一)基本过程、正规式和有限自动机-腾讯云开发者社区-腾讯云 (tencent.com) 编译原理_中国大学MOOC(慕课) (icourse163.org)
[编译原理] 期末复习,求FIRST集和FOLLOW集。简单易懂,例题讲解。_first和follow求法例题-CSDN博客