【问题标题】:Identifying semantic errors识别语义错误
【发布时间】:2021-12-10 22:06:44
【问题描述】:
import printf, printf;
void foo(int x, int y) {
 return 0;
}
int a = food(1, -2.0, 5);

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

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

【问题讨论】:

  • 解析器如何发现语义错误?它只能检测语法错误。你能给我们举个例子来说明你希望在这个例子中检测到的语义错误吗?

标签: python antlr4 semantics


【解决方案1】:

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

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

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

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

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

简而言之,ANTLR 非常擅长为您提供准确表示解释输入流的唯一方法的数据结构。它还为 Listeners 和 Visiters 提供了实用功能,可以非常简单地分析解析树以查找语义问题(如果您愿意,甚至可以使用访问者生成解释器来执行代码)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多