首页 > 解决方案 > 识别语义错误

问题描述

import printf, printf;
void foo(int x, int y) {
 return 0;
}
int a = food(1, -2.0, 5);

我需要编写一个解决方案来识别上述代码中的所有语义错误。我有一个提供的编译器。

解决此问题的最佳方法是什么。

标签: pythonantlr4semantics

解决方案


ANTLR 是关于语法(不是特别关于语义)。您可以有语义谓词,但如果存在歧义(可能有其他原因),则其目的是指导语法的解释。

可以在动作中处理一些语义处理,但这很快就会导致 ANTLR 语法,在这种语法中,很难在所有动作的噪音中找到语法我认为这是一种反模式(特别是在手工制作语法中)。

在语法中编写语法,使用生成的代码生成 ParseTree。然后,您可以使用侦听器或访问者编写自己的代码来进行任何语义验证。这种关注点分离也将有助于保持代码库更易于管理。

在 SO 答案中深入了解听众和访问者有点多,但是有很多关于使用它们的文章。

因此,在您的示例中,ANTLR 可以为该foo函数生成一个完全有效的 ParseTree,并从中生成一个解析树。在函数上下文的侦听器中,您可以检测到函数说它的返回类型是void,然后检查函数的主体(在解析树中)以查看它是否包含任何 `return 语句。这些在语法上是“正确的”但在语义上是无效的,因此您会将其识别为错误。

简而言之,ANTLR 非常擅长为您提供准确表示解释输入流的唯一方法的数据结构。并且它提供了带有监听器和访问者的实用功能,使得分析该解析树以搜索语义问题变得非常简单(或者如果您愿意,甚至可以使用访问者生成解释器来执行代码)。


推荐阅读