04-语法分析
自顶向下
从文法的开始符号出发,通过推导和归纳,逐步推导出句子的结构
对应先序遍历:从根节点出发,先访问根节点,然后递归访问左右子树
递归下降
可能出现的问题
回溯:当一种匹配方式失败时,需要回溯到之前的状态,用其他方式解析
左递归:无限循环
A -> Aa | b
左递归的解决方案
变换公式:
任何语法都能转换为不包含环和 production的等价语法
解决环:代入消除环
解决 production
枚举的时候,的格式
增加一个新的开始符号,
例:
例:
(最左边无法匹配,可直接消除)
预测分析法
无需回溯
适用于:LL(1) 文法
L:从左到右扫描
L:从最左推导
1:使用 1 个符号的前瞻,决定使用哪个产生式
特点:没有左递归,没有歧义
可以对每一个输入字符,构建预测表
构建预测表
构建预测表需要 和 集合
:一系列能作为开头的终结符
若是终结符,
若,
若,
:一系列能跟在后面的终结符
若为开始符号,
或
构造规则:
若,填充
若,填充
根据表格匹配唯一的规则,若为空则匹配错误
LL(1) 文法的 正式定义
对于文法
不能存在相同的首终结符:不存在,使得能同时推导出开头的串()
不能同时推导出空串
无二义性:如果能推出空串,则不能推导出 里的终结符
递归/非递归预测分析
递归:递归下降
非递归:显式地维护一个栈,用于存储当前的状态,相当于 PDA
自底向上 非重点
使用后序遍历建立语法树
不断将输入符号入栈,直到产生产生式右侧的符号
一旦栈顶符号序列和某个产生式右侧相同时,就不断规约,直至无法规约,随后继续入栈
问题
应该规约还是继续入栈
如果有多条匹配的规则,如何选择
LR(0) 文法
在语法分析时不用做选择
定义
L:从左到右扫描符号流
R:从右到左规约
0:不需要向前看任何符号,即可完成规约
表达式右边:可以使用 DFA 表示
表达式左侧:初始状态
状态转移:右侧的每一个符号
可以用变换,连接和状态转移的非终结符相同的初始状态
最后更新于