编译原理 语法分析
语法分析负责检查是否符合语法,并转换为语法树。
如图所示,根据语法规则,检查记号流是否符合语法,并输出语法树。
上下文无关文法:
针对左边蓝框中的每一条,都对应一条产生式规则。
BNF范式:非终结符<> 终结符用下划线标记
最左推导:每次总是选择最左侧的符号进行替换
语法分析:
根据文法G(蓝框)是否能完成对句子S的推导
图中的语法规则即是上下文无关文法。
判断是否可以推出,可以则生成语法树,不可以则指出错误的位置。
分析树和二义性
语法分析树 parse tree
最终的边界就是parse tree的叶子节点
可以存在不同的最左推导:
在第二个图的推导中,先计算3+4,因而不正确。
分析树的含义取决于树的后序遍历。
E表达式T term 项 F Factor因子 终结符 atom 原子
先算乘法,后算加法,确保了计算的正确。
先计算3+4再计算+5,保留了加法的左结合性(最左推导对应了左结合)
递归下降算法:
对于每一个非终结符,提供一个函数。
针对每一个非终结符都存在一个函数,进行判断
注意i++,每次出去第i个元素后,将i++。然后将产生式中的字符与前看符号比对。
B和D是非终结符,也对应着递归调用的函数。
如果是终结符,那么就比对,如果不是,就调用相应的函数。
如果第一条是aBcD,第二条是aBdD,那么也可能需要回溯。如下图所示:
3是num,可以匹配E+T,也可以匹配T。
当parse E时,不决定是E+T还是T,而是parse E之后,根据是否+符号,来判断是E还是T