python - 识别语义错误
问题描述
import printf, printf;
void foo(int x, int y) {
return 0;
}
int a = food(1, -2.0, 5);
我需要编写一个解决方案来识别上述代码中的所有语义错误。我有一个提供的编译器。
解决此问题的最佳方法是什么。
解决方案
ANTLR 是关于语法(不是特别关于语义)。您可以有语义谓词,但如果存在歧义(可能有其他原因),则其目的是指导语法的解释。
可以在动作中处理一些语义处理,但这很快就会导致 ANTLR 语法,在这种语法中,很难在所有动作的噪音中找到语法。我认为这是一种反模式(特别是在手工制作语法中)。
在语法中编写语法,使用生成的代码生成 ParseTree。然后,您可以使用侦听器或访问者编写自己的代码来进行任何语义验证。这种关注点分离也将有助于保持代码库更易于管理。
在 SO 答案中深入了解听众和访问者有点多,但是有很多关于使用它们的文章。
因此,在您的示例中,ANTLR 可以为该foo
函数生成一个完全有效的 ParseTree,并从中生成一个解析树。在函数上下文的侦听器中,您可以检测到函数说它的返回类型是void
,然后检查函数的主体(在解析树中)以查看它是否包含任何 `return 语句。这些在语法上是“正确的”但在语义上是无效的,因此您会将其识别为错误。
简而言之,ANTLR 非常擅长为您提供准确表示解释输入流的唯一方法的数据结构。并且它提供了带有监听器和访问者的实用功能,使得分析该解析树以搜索语义问题变得非常简单(或者如果您愿意,甚至可以使用访问者生成解释器来执行代码)。
推荐阅读
- android - 带重力顶部的包装链
- c# - Kubernetes 未找到兼容版本 (dotnet)
- mule - 从 mule 4 中的数组中删除键值对
- python - Pandas 数据框:如何删除以任意数字开头的行
- javascript - 简化和优化代码时的功能问题
- python - 拆垛时,出现错误“ValueError:索引包含重复条目,无法重塑”
- android - 当我在 ViewModelComponent 中使用 @Singleton 时,Hilt 如何保留实例
- qt - Qt android app build(clang ++没有这样的文件或目录错误:无法找到与应用程序同名的.so文件)
- node.js - 安装后“bash:gulp:找不到命令”
- reactjs - 打字稿类型绑定问题