上下文无关文法
- 语法描述
- 上下文无关文法 CFG
- BNF
- 上下文无关文法
- 终结符号
- 非终结符号
- 开始符号
- 产生式
- 推导:,则
- 最左推导: 中不包含非终结符
- 零步或多步推导:
- 一步或多步推导:
- 句型 :
- 句子:不包含非终结符号的句型
- 语言:
CFG 处理
-
二义性:如果一个文法可以为某个句子生成多棵语法分析数,则该文法二义
-
设计文法
- 消除二义性:无较好方法;优先级,结合性消除
- 消除左递归:
- 立即左递归:
- 提取左公因子
-
消除左递归
-
立即左递归的消除
如果有
变换为 和
-
左递归消除算法
输入:无环和产生式的文法 输出:等价的无左递归的文法 算法:非终结符号排序
for i = 1 to n do{ for j = i - 1 do { 将 Ai -> Aj t 替换为 Ai -> s1 t | s2 t | ... | sk t, 其中 Aj -> s1 | s2 | ... | sk } 消除 Ai 立即左递归 }问题:很难找到新文法和旧文法之间的对应关系,很难进行语义分析
-
-
预测分析法:当两个产生式具有相同前缀时无法预测
- 提取左公因子
自顶向下语法分析器
-
关键问题:确定对最左边的非终结符号应用哪个产生式
-
不能处理左递归
-
递归下降语法分析
- 每个非终结符对应一个过程,描述终结符的结构。程序执行从开始符号对应的过程开始
- 发现错误时,进行回溯
-
预测分析法
-
: 可以从 推到的首符号的集合
-
: 可能在某些句型中紧跟在 右边的终结符号的集合
-
将结束标记 $ 放入 FOLLOW 中,按以下规则迭代直到不增长
: FIRST() 中所有非 符号加入 FOLLOW(B)
如果 或 且 FIRST() 包含 ,则 FOLLOW(A) 中所有符号加入 FOLLOW(B)
-
-
-
LL(1) 文法:从左到右,最左推导,向后看一个符号
-
定义:对文法的任意两个产生式 (保证唯一无二义)
不存在终结符号 使得 和 都可以推导出以 开头的串
和 最多只有一个可推导出空串
如果 可推导出空串,则 不能推导出以 FOLLOW(A) 中任意终结符号开头的串
-
等价定义:,
-
-
预测分析表
输入:文法 输出:预测分析表 算法:
对于每个产生式 ,将 为终结符号加入 中;若 则对 中每个符号,将 加入 中
最后所有空白条目填入 error
-
预测分析算法
-
输入:串 ,预测分析表
-
输出:正确输出最左推导,否则报错
-
初始化:输入缓冲区为 \omega\$$,栈中为 S$\omega$ 的第一个符号
- 不断执行(栈顶符号 ,ip 指向当前输入符号 )
if == : 出栈,ip 向前移动
else if 终结符号: error()
else if M[,] 是报错条目: error()
else if M[, ] = : 输出产生式,弹出 , 入栈
-
自底向上语法分析器
- 移入(shift):将下一个输入符号移入栈顶
- 归约(reduce):将句柄归约为相应的非终结符
- 何时归约
- 归约到哪个非终结符
- 句柄:如果 ,则紧跟在 之后的 是 的一个句柄
- 移入归约冲突
- 归约归约冲突
- LR(k) 语法分析:最左扫描,反向构造最右推导,,表格驱动
- LR(0) 项:文法的一个产生式加上在其中某处的一个点
- 增广文法:增加新开始符号 ,产生式
- 项集闭包 CLOSURE:如果 是文法 的一个项集
- 中各项加入 CLOSURE(I)
- 在 CLOSURE(I) 中且 是一个产生式, 不在 CLOSURE(I) 中,则迭代加入
- GOTO 函数:I 是项集,X 是文法符号,GOTO(I,X) 为 I 中所有形如 的项所对应的 项的闭包
- 计算 LR(0) 项集规范组的算法:从初始项集闭包开始,不算计算各种可能的后继,直到生成所有的项集
- LR(0) 自动机
- LR(0) 语法分析器
- ACTION: 状态,终结符号
- GOTO: GOTO[,A]=, 则 GOTO[,A]=
- 格局: (s_0s_1\cdots s_m,a_ia_{i+1}\cdots a_n\)s_ma_i$]
- LR(0) 分析表
- SLR(1) 语法分析表
- 在 ,且 GOTO,则 ACTION=(移入 j)
- 在 中,那么对 FOLLOW() 中所有 ,ACTION=按 规约
- 如果 在 中,则 ACTION[$i,$$] 设为接受
- GOTO()=, GOTO[i,A]=j
- 如果 SLR 分析表没有冲突,则该文法为 SLR
- LR 方法:将期望向前看符号加入项中(LR(1)项集,状态太多)
- LALR 方法
- SLR(1) 语法分析表
- LR(1) 项:,为向前看符号
- 增广文法:[S'\rightarrow S,\]$
- 闭包:存在 ,则 FIRST()
- GOTO: ,则
- LR(1) GOTO 图
- LR(1) 语法分析表
- 在项集中,且 GOTO(,a)=,那么 ACTION[]=移入
- 在项集中,ACTION[i,a]=按 规约
- [S'\rightarrow S,\] 在项集中,ACTION[i,\]=接受
- LALR(1) 语法分析
- 原 LR(1) 中无冲突,则合并后只有归约冲突
- LALR(1) 分析表构造算法:对于 LR 每个核心,合并具有该核心的项集
- 处理正确输入时,LR 与 LALR 处理一样
- 处理错误输入时,LALR 会多处理一些归约
语法错误处理
- LL 语法错误的处理:恐慌模式,短语层次恢复
- 恐慌模式:忽略输入中的一些符号直到出现由设计者选定的某个同步词法单元
- 非终结符:FOLLOW(A) 中所有符号放入 A 的同步集合;高层次非终结符号加入较底层;FIRST(A) 加入 A 的同步集合;A 可以推导空串,将该产生式当做默认值
- 终结符:栈顶终结符号匹配错误,可以直接弹出该符号,并且发出消息称已经插入
- 短语层次恢复:空白条目中插入错误处理例程
- 恐慌模式:忽略输入中的一些符号直到出现由设计者选定的某个同步词法单元
- LR 语法错误处理
- 恐慌模式:假定当前试图规约到 A 但碰到了语法错误,因此设法扫描完包含语法错误的 A 的子串,假装找到了 A 的一个实例
- 短语层次的恢复
语法分析器生成工具
- YACC/Bison
- YACC 中的冲突处理
- 缺省处理方法
- 规约/移入冲突:总是移入
- 规约/规约冲突:选择列在前面的产生式
- 确定终结符号优先级
- 缺省处理方法
- YACC 的错误恢复:error
- bison: LALR(1)
- bison + %glr-parser: LR(1)
- ANTLR: LL(*)