这个语法是递归还是因素?

时间:2013-06-15 04:03:08

标签: parsing compiler-construction left-recursion

我对左递归和左保理这个话题不熟悉,请帮我确定这个语法是递归还是留下因素,如果是为什么呢?

S-> aAd | bBd | aBe | bAe | cA |的cB

1 个答案:

答案 0 :(得分:0)

是左递归吗?答:不。

根据定义,“如果我们能找到一些非终端A,最终会得到一个以自身为左符号的句子形式,那么语法是左递归的。”

例如: 立即左递归发生在表单

的规则中
A -> Aa | b

其中 a b 是非终端和终端的序列, b 不以 A 开头

显然不是这样的情况:

S-> aAd | bBd | aBe | bAe | cA |的cB

是否留下了因素?答:是的。

根据定义,在左分解中,不清楚选择哪两种替代生产,扩展非终端。

当您有两个以相同终端/非终端开头的替代生产时,会出现这种歧义。 在你的情况下,我可以看到三个,两个替代路径:

S-> aAd | aBe 

S-> bBd |  bAe 

S-> cA | cB

如果我删除左分解,则语法变为:

S-> aA'

A'-> Ad | Be

S-> bB'

B'-> Bd | Ae

S-> cC'

C'-> A | B

这个slide用更简单的词语解释了相同的内容