编译原理:如何消除左递归,提取公共左因子

来源:互联网 发布:证件照软件 编辑:程序博客网 时间:2024/04/30 23:08

自上而下的语法分析(消除左递归,提取左因子)  


自上而下的语法分析:(推导)

由根节点到叶节点


※最左推导和最右推导

(每一步替换最左边的非终结符/每一步替换最右边的非终结符),最右推导称为规范推导。最右推导对应于最左规约(规范规约)

例:

文法:

S--->AB

A--->a|t

B---->+CD

C--->a

D---->a

最右推导:

S--->AB---->A+CD--->A+Ca---->A+aa----->a+aa

最左推导:

S---->AB----->aB--->a+CD--->a+aD----->a+aa


自上而下文法设计所要注意的:


※※左递归:

左递归会使分析进入到无限循环之中


直接左递归和间接左递归

直接左递归:如果Aα,则称文法G是直接左递归的


消除左递归

消除简单的左递归:

对于含有左递归的产生式 Aαβ

可用下面的非左递归的产生式 代替:

                A→ β A

                A’ → αAε



消除左递归例

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子

 

一般情况消除左递归:


对于一般情况而言,若某一文法G的产生式具有如下形式:

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子

则可用如下方法消除左递归:

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子

 

间接左递归:

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子
 

SQcRbcSabc,出现了左递归



消除以上文法的间接左递归:

1.将非终结符排序为RQS

2.R不存在左递归,将R代入Q

      Q → Sab|ab|b

3. Q不存在左递归,将Q代入S

     S→ Sabc|abc|bc|c

4.消除直接左递归后,得文法:

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子
 

化简得:

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子
 




※※提取左因子:

(如果最左边的是一样的,就不明确下一步应该走哪条路)

比如文法:→(Q|aP|a

遇到a,是PaP,还是Pa



提取左因子的算法:

自上而下的语法分析(消除左递归,提取左因子) - 小镜子~ - 菜园子
原创粉丝点击