识别语义错误

Posted

技术标签:

【中文标题】识别语义错误【英文标题】: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);

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

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

【问题讨论】:

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

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

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

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

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

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

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

【讨论】:

以上是关于识别语义错误的主要内容,如果未能解决你的问题,请参考以下文章

用Kotlin开发android平台语音识别,语义理解应用(olamisdk)

语音识别,语义理解一站式解决之二(android,olami)

计算机视觉图像分类目标检测人脸比对人脸识别语义分割实例分割图像搜索

人工智能与深度学习CNN案例:邮政编码识别器人脸检测与语义分割

天池赛题解析:零基础入门语义分割-地表建筑物识别-CV语义分割实战(附部分代码)

如何用opencv在一周内实现人物行为语义识别