我正在为C语言编写一个编译器,我还有一个问题要解决:如何处理悬空的其他问题。原始规则如下:
A - > if(表达式)语句| if(表达式)语句else语句
摆脱左递归后:
A - > if(表达式)语句B
B - >其他声明| EMPTY
问题是"否则"是第一个和后面的B.我认为这对于这样的例子是有道理的:
if(x>y)
if(x == 10)
printf("x is 10.\n");
else
printf("x<y");
第一个if后跟一个else,第二个if后跟相同的else,因此规则的应用方式存在歧义。我知道我需要将else配对最近的,打开if,但我不确定如何转换为解析器的代码。当我达到规则A时,我会打电话给B,但那又是什么?如果我看到&#34;否则&#34;作为下一个标记,我使用B - &gt; else语句或B - &gt; EMPTY?
答案 0 :(得分:6)
解析器很贪心。也就是说,语句在必须结束之前不会结束。如果可以将某些东西解析为当前最内层语句的延续,那就是。因此,当遇到if
时,内部else
不会结束,因为它可以包含以下else
,因此它会。{/ p>
当解析器遇到else
时,它有两个选择 - 结束内部语句或不结束内部语句。这些选择总是得到解决,有利于使声明尽可能大。因此,术语&#34;贪婪&#34;。