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

标签 c parsing compiler-construction

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

关于c - 你如何解析悬垂的其他东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592063/

相关文章:

c - 我对声明和定义的理解是否正确?

c - 如何从动态字符串中删除换行符

c++ - 关于在 C++ 中将数组存储在 std::vector 中的问题

c++ - 未定义行为是否依赖于 C++ 中的编译器?

C++11 翻译阶段 8 困惑

用于简单计算的 CUDA 加速

objective-c - 在 C for iOS 项目中,我应该使用什么类型的文件名字符串?

python - 请求无法保持登录 session

parsing - 用于解析草率/古怪/"almost structured"数据的背景阅读?

python - 使用 lxml 解析奇怪结构的 XML