消除左递归在编译原理中的应用
4星 · 超过85%的资源 需积分: 16 90 浏览量
更新于2024-09-16
1
收藏 142KB DOC 举报
"消除左递归的实现和算法"
消除左递归是编译原理中的一种重要技术,用于消除语法中的左递归,以便于语法分析和解析。左递归是指在语法规则中,某个非终结符的规则可以由该非终结符自身推导出来,这种情况下,语法分析器将陷入死循环无法 termination。
在消除左递归时,可以使用两种方法:直接左递归的消除和间接左递归的消除。
**直接左递归的消除**
直接左递归是指在语法规则中,某个非终结符的规则可以由该非终结符自身推导出来,但该非终结符不以自身开头。例如,假设非终结符P的规则为P→Pα/β,其中,β是不以P开头的符号串。那么,我们可以把P的规则改写为非直接左递归形式:P→βP’,P’→αP’/ε。这两条规则和原来的规则是等价的,即两种形式从P推出的符号串是相同的。
例如,考虑简单表达式文法G[E]:
E→E+T/T
T→T*F/F
F→(E)/I
经消除直接左递归后得到如下文法:
E→TE’
E’→+TE’/ε
T→FT’
T’→*FT’/ε
F→(E)/I
**间接左递归的消除**
间接左递归是指在语法规则中,某个非终结符的规则可以由该非终结符自身推导出来,但该非终结符以自身开头。例如,设有文法G[S]:
S→Qc/c
Q→Rb/b
R→Sa/a
虽不具有左递归,但S、Q、R都是左递归的,因为经过若干次推导可以显现出其左递归性。消除间接左递归的方法是,把间接左递归文法改写为直接左递归文法,然后用消除直接左递归的方法改写文法。
**消除左递归算法**
如果一个文法不含有回路,即形如P[pic]P的推导,也不含有以ε为右部的产生式,那么就可以采用下述算法消除文法的所有左递归。
1.把文法G的所有非终结符按任一顺序排列,例如,A1,A2,…,An。
2.for(i=1;i<=n;i++)
for(j=1;j<=i-1;j++)
{把形如Ai→Ajγ的产生式改写为Ai→Aj’,Aj’→γAj’/ε}
通过这种算法,可以消除文法中的所有左递归,从而提高语法分析的效率和可靠性。
消除左递归是编译原理中的一种重要技术,通过消除左递归,可以提高语法分析的效率和可靠性。同时,消除左递归也可以应用于其他领域,如自然语言处理、机器学习等。
1121 浏览量
2451 浏览量
865 浏览量
343 浏览量
156 浏览量
1782 浏览量
674 浏览量
2989 浏览量
fanchu1
- 粉丝: 0
- 资源: 1
最新资源
- bash脚本编写教程
- WSC/ADL:Web Services组合系统体系结构描述语言
- 常用开源软件说明手册
- 高质量c++编程指南
- map reduce by google inc
- bigtable by google inc
- U-BOOT 在S3C2410的移植
- 《计算机组成原理》第一章课件
- Practical Apache Struts 2 Web 2.0 Projects.pdf
- ACM+算法集--常用ACM算法
- 华为电路设计规范,得到很多人的认可
- sq安装步骤,安装问题
- linux下建立DNS
- Arcgis开发宝典
- 是个IC资料 PDF型的
- 办公自动化EXECL(提高操作EXECL的能力)