我正在尝试使用 ANTLR 编译程序,我使用 Java 编程语言作为目标,问题的核心是开发 Intent Regornizer 以纠正错误并改进源代码,如果源代码不符合语法。在关于 ANTLR 的教程和书籍中,我看到了如何编译一个简单的代码,假设我已经制作了词法分析器和解析器以及像这样的源代码:
int main(){
int a,b;
c=20;
}
Run Code Online (Sandbox Code Playgroud)
程序如何检测变量“C”之前未知已声明的错误?
我尝试按照有关如何使用 ANTLR 进行编译的说明来应用它,但是 ANTLR 生成器的代码被认为是有效的,因为它符合表达式的语法规则。但实际上变量 c 是未知的。
或者如何制作一个可以在其中实现面向对象概念的语法?我已经尝试使用 ANTLR 语法,但结果仍然没有解释 OOP 的概念。
public class Hello {
}
public class HelloTwo {
Hello hl = new HelloWrong();
}
Run Code Online (Sandbox Code Playgroud)
如果我编译代码,结果是有效的,因为按照 Grammar.but 看那个类 HelloWrong 真的没有。它也与在我的第一个problems 上写入前一个变量有关。
对不起我的英语。我希望你能帮助我的问题。谢谢你
是否声明了 '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
Run Code Online (Sandbox Code Playgroud)
语义分析可以做这样的事情:
1)将“main”作为全局可访问的函数
添加到符号表中2)将主函数作用域内的作用域1添加到符号表中
3)添加“a”和“b” " 到符号表作为范围 1 内的局部变量
4) 在符号表中查找范围 1 内的变量“c”,失败,查找“main”的父范围,失败,查找全局范围,失败,产生错误消息:未找到变量“c”。
据我所知,这是一个相当典型的过程。
| 归档时间: |
|
| 查看次数: |
1117 次 |
| 最近记录: |