【发布时间】:2014-01-20 06:44:26
【问题描述】:
我正在用 antlr 和 java 编写编译器。我在 antlr 中编写了解析器,它会生成代码。现在我应该做一个我认为的解析树。谁能帮助我我该怎么做? 这个生成的java代码不是解析树吗?我应该如何在 antlr 中实现这棵树?
【问题讨论】:
标签: java antlr parse-tree
我正在用 antlr 和 java 编写编译器。我在 antlr 中编写了解析器,它会生成代码。现在我应该做一个我认为的解析树。谁能帮助我我该怎么做? 这个生成的java代码不是解析树吗?我应该如何在 antlr 中实现这棵树?
【问题讨论】:
标签: java antlr parse-tree
是的,不是的,antlr 确实为 lexer 和 parser 生成代码,可以根据语法解析输入。 所以是的,antlr 允许生成解析树并允许遍历它。 但是一旦满足生产规则/令牌应该做什么? 这部分取决于您自己的逻辑,而 antlr 对此无能为力。 所以这就是 antlr 停止和您的应用程序启动的地方。
例如(太简单了):假设有一个计算器可以将两个数字相加。 所以我们定义我们的语法 它构建了一个解析器,当我们看到第一个数字、第二个数字和它们之间的符号“+”时,它允许“连接我们的代码”。
但是 antlr 不知道你想对这些数字做什么,也许只是将一个添加到另一个,也许记住以备将来执行,也许将这些数据传输到将很快执行此操作的服务器,谁知道. 所以你应该扩展 antlr 监听器(在 antlr 4 中也有访问者可以更好地控制遍历过程),并覆盖像
这样的方法"onFirstNumber(int number)"
“onPlus”和
"onSecondNumber(int number)"
具体格式取决于您的语法。
现在 antlr 将按照需要的顺序调用方法(这也是从语法中解决的),但您应该按照我上面的描述指定要做什么。
希望这会有所帮助,
标记
【讨论】: