你如何解析悬垂的其他东西?
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".
我正在为 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".