使用ANTLR解析Java代码;“需要概念”;

使用ANTLR解析Java代码;“需要概念”;,java,oop,antlr,Java,Oop,Antlr,我试图使用ANTLR编译程序,我使用Java编程语言作为目标,问题的核心是开发Intent Regornizer,以便在源代码不符合语法的情况下纠正错误并改进源代码。 在关于ANTLR的教程和书籍中,我看到了如何编译一个简单的代码,假设我制作的lexer和parser以及如下的源代码: int main(){ int a,b; c=20; } 程序如何检测变量“C”以前未声明的错误 我试图通过遵循有关如何使用ANTLR编译的说明来应用它,但ANTLR生成器的代码被认为是有效

我试图使用ANTLR编译程序,我使用Java编程语言作为目标,问题的核心是开发Intent Regornizer,以便在源代码不符合语法的情况下纠正错误并改进源代码。 在关于ANTLR的教程和书籍中,我看到了如何编译一个简单的代码,假设我制作的lexer和parser以及如下的源代码:

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
程序
|-功能_DEC“main”
|-ARGS
|-范围1
|-本地_DEC“a”、“b”
|-表达式
|-分配
|-变量“c”
|-文字20
语义分析可以这样做:
1) 将“main”作为全局可访问函数添加到符号表中
2) 将主功能范围内的范围1添加到符号表中
3) 将“a”和“b”作为范围1内的局部变量添加到符号表中
4) 在符号表中查找范围1内的变量“c”,失败,查找“main”的父范围,失败,查找全局范围,失败,生成错误消息:未找到变量“c”


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

Okayyy任务。。。现在我明白了。我知道ANTLR是干什么的谢谢budie。。。那个么你们能给我一个解决方案吗?如何做到这一点?或者如何将异常信息翻译成其他语言?如何进行语义分析?好的,我为你添加了一个链接和一个概述,但这是一个很大的主题。通常,您会将内容添加到符号表中,然后使用符号表查找内容。oke任务。。非常感谢。。。你知道如何将java程序添加到语法中吗?例如,我用java构建了一个程序,向语法中写入一些文本..s如果我在文本区域中包含一个程序,程序将扫描源代码如果源代码有一个变量,那么该变量将在语法中包含automatich。你知道如何做吗?嗯,不能动态修改语法。语法用于生成解析器和词法分析器,然后它们用于解析输入。即使您确实更改了语法,也不可能更改当前运行的解析器。您可能需要阅读一些有关编译器的知识,然后在这里问另一个问题。希望有帮助。