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?
解析器很贪心.也就是说,声明在它必须结束之前不会结束.如果可以将某些东西解析为当前最内层语句的延续,那就是.所以内部if不会在else遇到时结束,因为它可以包含以下内容else,因此它确实如此.
当解析器遇到时else,它有两个选择 - 结束内部语句或不结束内部语句.这些选择总是得到解决,有利于使声明尽可能大.因此,术语"贪婪".