消除LL(1)语法的悬空引起的歧义

时间:2017-11-27 01:12:17

标签: ambiguous ll compiler-construction dangling-else

对于编译器设计的悬空问题,是否有理由在消除歧义之前留下因素呢?

我们正在将CFG转换为LL(1)语法,因此我的教授要求我们首先消除递归,然后留下因子,然后从语法中消除歧义。但是,根据我所读到的内容,通常会首先消除歧义。我不确定如何在保留左分解后消除歧义。

这就是我在考虑之后得到的结果:

S -> i E t S S' | other
S' -> e S | epsilon

但是,正如我所理解的那样,消除歧义需要重写语法,因此语法总是会产生与此类似的结果吗?

S -> U | M
M -> i E t M e M | other
U -> i E t U'
U' -> M e U | S

还是有其他办法吗?据我所知,这是消除悬空其他模糊性的唯一方法。

2 个答案:

答案 0 :(得分:0)

事实证明,处理由LL(1)中的悬空其他引起的歧义的一种好方法是在解析器中处理它。重写语法也是处理它的另一种方法,就像在语法中添加'begin'和'end'一样:

S -> i E t a S z S' | other
S' -> e S | epsilon

虽然对某些人来说可能是直观的,但对于其他初学者来说,这就是符号的含义:

S:声明

我:如果

E:表达

t:然后

a:开始

z:结束

S':声明'

e:else

其他:任何其他作品

注意:小写字母代表终端;大写字母代表变量。

如果有任何问题,请告诉我,我会更正。

答案 1 :(得分:0)

我认为这可能是一个答案:

[经过左因子分解并明确后]

让其他= a

S-> iEtT |一个

T-> S | aeS

我先生成所有 if ,然后将 else 与最近未关联的 如果 。 如果必须得到 ,我应该消除在当前版本之间获得新的 if 的可能性。未关联的 if 和相应的 else
但是,我允许在生成相应的 else 之后获得 if 的可能性。

指出是否有错误。

谢谢。