用ANTLR解析Java代码“需求概念”

2023-12-07

我正在尝试使用 ANTLR 进行程序编译,我使用 Java 编程语言作为目标,问题的核心是开发 Intent Regornizer 来纠正错误并改进源代码(如果源代码不符合)语法。 在 ANTLR 的教程和书籍上,我看到如何编译一个简单的代码,假设我已经制作了词法分析器和解析器,源代码如下:

int main(){
     int a,b;
     c=20;
}

程序如何检测变量“C”之前未声明的错误?

我尝试按照如何使用 ANTLR 进行编译的说明来应用它,但 ANTLR 生成器的代码被认为是有效的,因为它符合表达式的语法规则。但实际上变量 c 是未知的。

或者如何制作一个可以在其中实现面向对象概念的语法?我尝试过使用 ANTLR 语法,但结果仍然无法解释 OOP 的概念。

public class Hello {
}

public class HelloTwo {
    Hello hl = new HelloWrong();
}

如果我编译代码,结果是有效的,因为按照语法。但是看看 HelloWrong 类确实没有。它还与我的第一个问题上的前一个变量的写入有关。

对不起我的英语。 我希望你能帮助我解决问题。 谢谢你


'c' 是否已被声明不是语法的一部分。
解析器输出一个抽象语法树,编译器采用 AST 并执行语义分析在上面。正是在这个阶段,生成了编译器错误,例如“变量 c 在该范围内不存在”。

ANTLR 为您生成 AST,然后就完成了。下一阶段(语义分析和编译以及生成可执行文件)由编译器的另一部分完成。


我用来产生您正在寻找的行为的方法是遍历 AST,在每个节点上进行“语义分析”。 AST 的外观完全取决于用于生成它的语法,但您的第一个程序可能如下所示:

PROGRAM
|- FUNCTION_DEC "main"
   |- ARGS <none>
   |- SCOPE 1
      |- LOCAL_DEC "a", "b"
      |- EXPRESSION_STMT
         |- ASSIGNMENT
            |- VARIABLE "c"
            |- LITERAL 20

语义分析可以做这样的事情:
1)将“main”添加到符号表中作为全局可访问的函数
2)将main函数作用域内的作用域1添加到符号表中
3) 将“a”和“b”添加到符号表中作为范围 1 内的局部变量
4) 在符号表中查找作用域 1 内的变量“c”,失败,在“main”的父作用域中查找,失败,在全局作用域中查找,失败,产生错误消息:找不到变量“c”。

据我所知,这是一个相当典型的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用ANTLR解析Java代码“需求概念” 的相关文章

随机推荐