我正在为 C 语言编写一个编译器,我只需要解决一个问题:如何处理悬垂的 else。原始规则如下所示:
A --> if (expression) statement | if (expression) statement else statement
去掉左递归后:
A --> if(expression) statement B
B --> else statement | EMPTY
问题是“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?
最佳答案
解析器是贪婪的。也就是说,一个语句只有在它必须结束时才会结束。如果某些东西可以被解析为当前最内层语句的延续,它就是。所以内部 if
在遇到 else
时不会结束,因为它可以包含以下 else
,因此它会结束。
当解析器遇到else
时,它有两个选择——结束内部语句或不结束内部语句。这样的选择总是有利于使声明尽可能大。因此,术语“贪婪”。
关于c - 你如何解析悬垂的其他东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592063/