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

时间:2016-02-24 02:18:32

标签: c parsing compiler-construction

我正在为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?

1 个答案:

答案 0 :(得分:6)

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

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