gpt4 book ai didi

java - 使用 ANTLR "need concept"解析 Java 代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:24 26 4
gpt4 key购买 nike

我正在尝试使用 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'是否被声明不是语法的一部分。
解析器输出 Abstract Syntax Tree ,编译器采用该 AST 并执行 semantic analysis在上面。正是在那个阶段生成了编译器错误,例如“该范围内不存在变量 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函数范围内的Scope 1添加到符号表
3) 将“a”和“b”作为作用域 1 内的局部变量添加到符号表
4) 在作用域 1 中查找变量“c”的符号表,失败,在“main”的父作用域中查找,失败,在全局作用域中查找,失败,产生错误消息:未找到变量“c”。

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

关于java - 使用 ANTLR "need concept"解析 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com