消除左递归文法
2015-04-05 23:39
246 查看
无法根据左递归文法编写出递归下降分析器,因而把左递归文法等价变换为非左递归文法至关重要,以下是变换的算法:
1、消除直接左递归
原文法: E --> E a1 | E a2 | ... | E an | b1 | b2 | ... | bn
消除后: E --> b1 E' | b2 E' | ... | bn E'
E'--> a1 E' | a2 E' | ... | an E' | epsilon
2、消除间接左递归
a) 把所有非终结符号按一定序列排序为E1, E2, ... En;
b) for i=1 to n do /*依次处理每个非终结符号*/
for j=1 to i-1 do /*处理第1个到i-1个*/
若Ei --> Ej r
则改为Ei --> S1 r | S2 r | ... | Sk r
其中Ej --> S1 | S2 | ... | Sk
c) 对Ei消除直接左递归。
注:非终结符的排列顺序不同,结果可能不同。
3、去掉无用符号和无用产生式
转:http://blog.csdn.net/goncely/article/details/627569
1、消除直接左递归
原文法: E --> E a1 | E a2 | ... | E an | b1 | b2 | ... | bn
消除后: E --> b1 E' | b2 E' | ... | bn E'
E'--> a1 E' | a2 E' | ... | an E' | epsilon
2、消除间接左递归
a) 把所有非终结符号按一定序列排序为E1, E2, ... En;
b) for i=1 to n do /*依次处理每个非终结符号*/
for j=1 to i-1 do /*处理第1个到i-1个*/
若Ei --> Ej r
则改为Ei --> S1 r | S2 r | ... | Sk r
其中Ej --> S1 | S2 | ... | Sk
c) 对Ei消除直接左递归。
注:非终结符的排列顺序不同,结果可能不同。
3、去掉无用符号和无用产生式
转:http://blog.csdn.net/goncely/article/details/627569
相关文章推荐
- 编译原理之消除算术表达式文法的左递归
- 自上而下的语法分析,LL(1)文法(消除左递归,提取左因子)
- 消除文法的左递归
- 消除左递归文法
- 消除文法左递归-编译原理
- 编译原理(三) 消除文法的左递归
- 文法改进(消除左递归)
- 消除文法的左递归
- 编译原理(三) 消除文法的左递归
- 消除左递归文法
- 编译原理(三) 消除文法左递归
- 消除左递归文法
- java实现消除文法的左递归
- 文法左递归的消除(直接左递归和间接左递归)
- 消除文法左递归的算法
- 整数划分 ,DP 或者直接递归(备忘录消除重复)
- 2-型文法消除左递归算法(上下文无关文法)
- JavaScript消除与函数名紧密耦合的递归实现方法
- 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树
- 从汉诺塔问题看 函数尾部递归的消除 (C语言版)