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

Par*_*eod 3 c compiler-construction parsing

我正在为C语言编写一个编译器,我还有一个问题要解决:如何处理悬空的其他问题.原始规则如下:

A - > if(表达式)语句| if(表达式)语句else语句

摆脱左递归后:

A - > if(表达式)语句B.

B - >其他声明| EMPTY

问题是"else"在第一组和后两组中.我认为这对于这样的例子是有意义的:

if(x>y)
     if(x == 10)
          printf("x is 10.\n");
else
     printf("x<y");
Run Code Online (Sandbox Code Playgroud)

第一个if后跟一个else,第二个if后跟相同的else,因此规则的应用方式存在歧义.我知道我需要将else配对最近的,打开if,但我不确定如何转换为解析器的代码.当我达到规则A时,我会打电话给B,但那么呢?如果我将"else"视为下一个标记,我是否使用B - > else语句或B - > EMPTY?

Dav*_*rtz 6

解析器很贪心.也就是说,声明在它必须结束之前不会结束.如果可以将某些东西解析为当前最内层语句的延续,那就是.所以内部if不会在else遇到时结束,因为它可以包含以下内容else,因此它确实如此.

当解析器遇到时else,它有两个选择 - 结束内部语句或不结束内部语句.这些选择总是得到解决,有利于使声明尽可能大.因此,术语"贪婪".