2

在编译器设计的悬空 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

还是有其他方法可以做到这一点?据我所知,这是从悬空的 else 中消除歧义的唯一方法。

4

2 回答 2

0

事实证明,处理由 LL(1) 中的悬空 else 引起的歧义的一个好方法是在解析器中处理它。重写语法也是另一种处理方式,就像在语法中添加“开始”和“结束”一样:

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

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

S:声明

我:如果

E:表达

t:那么

一:开始

z:结束

S':声明'

e: 否则

其他:任何其他产品

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

如果有什么不对的地方,请告诉我,我会改正的。

于 2017-11-29T00:19:07.083 回答
0

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

[在左分解并使其明确之后]

让其他=一个

S -> iEtT | 一个

T -> S | AES

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

指出是否有任何错误。

谢谢你。

于 2018-09-20T15:11:36.143 回答