我正在为 C 语言编写一个编译器,我只剩下一个问题需要解决:如何处理悬空的 else。原来的规则是这样的:
A --> if (表达式) 语句 | if (表达式) 语句 else 语句
摆脱左递归后:
A --> if(表达式) 语句 B
B --> else 语句 |空的
问题是“else”位于 B 的第一组和后续组中。我认为这对于这样的示例是有意义的:
if(x>y)
if(x == 10)
printf("x is 10.\n");
else
printf("x<y");
第一个 if 后跟一个 else,第二个 if 后跟同样的 else,因此规则的应用方式存在歧义。我知道我需要将 else 与最接近的 open if 配对,但我不确定如何将其转换为解析器的代码。当我满足规则A时,我会打电话给B,但是然后呢?如果我看到“else”作为下一个标记,我是使用 B --> else 语句还是 B --> EMPTY?
解析器是贪婪的。也就是说,一条语句直到它结束时才结束must结尾。如果某件事可以被解析为当前最内层语句的延续,那么它就是。所以内在if
当else
遇到的原因是它可能包含以下内容else
,因此确实如此。
当解析器遇到else
,它有两个选择——结束内部语句或不结束内部语句。这样的选择总是有利于使声明尽可能大。因此就有了“贪婪”一词。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)