你如何解析悬垂的其他东西?

How do you parse a dangling else?

我正在为 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时,它有两个选择——结束内部语句或不结束内部语句。这样的选择总是有利于使声明尽可能大。因此术语 "greedy".