Java 使用Antlr4的翻译器
我想创建一个从SQL到XQuery的转换器。Java 使用Antlr4的翻译器,java,sql,xquery,antlr,intermediate-language,Java,Sql,Xquery,Antlr,Intermediate Language,我想创建一个从SQL到XQuery的转换器。 我想解析SQL并生成一个中间结构,然后使用它生成XQuery查询。 (注意-我想使用中间表示,因为我期待着将来将SQL翻译成其他查询语言) 但我不知道一旦语法定义好了,怎么翻译。我想使用ANTLR,并且确实已经创建了语法。我现在被语法文件卡住了,继续构建翻译程序,因为我不知道生成翻译程序的下一步是什么。这取决于你想做什么以及你想用什么语言来做。现在您已经掌握了语法,您应该研究您希望用哪种语言为该语言开发解析器。Antlr4有Java、javascri
我想解析SQL并生成一个中间结构,然后使用它生成XQuery查询。
(注意-我想使用中间表示,因为我期待着将来将SQL翻译成其他查询语言)
但我不知道一旦语法定义好了,怎么翻译。我想使用ANTLR,并且确实已经创建了语法。我现在被语法文件卡住了,继续构建翻译程序,因为我不知道生成翻译程序的下一步是什么。这取决于你想做什么以及你想用什么语言来做。现在您已经掌握了语法,您应该研究您希望用哪种语言为该语言开发解析器。Antlr4有Java、javascript和python的运行时 因此,您可以将语法编译为以下输出语言之一:
Java -jar yourgrammar.g4
Java -jar -Dlanguage=Python2 yourgrammar.g4
Java -jar -Dlanguage=Python3 yourgrammar.g4
注意
您真的应该阅读关于如何继续使用ANTLR的教程,或者包括作者所写的书在内的完整教程
但是一旦你编译了你的语法,你就可以开始构建你的翻译器,方法是填充一个listener或visitor方法,当遇到语法元素时,它将产生你决定的任何东西。默认情况下,您将有一个名为“yourGrammarListener”的空侦听器,其中您的语法是.g4文件的名称,并将侦听器附加到末尾。对于您定义的任何规则,此文件将有许多空白方法
因此,无论您选择哪种语言作为目标,都会定义您是应该扩展此文件还是将您的功能实现到生成的侦听器中
在确保项目包含应用程序所需的任何ANTLR运行时的链接后,填充任何方法后,您都应该能够运行应用程序,默认的是Java运行时,也是最流行的,因此通常这意味着将ANTLR.jar文件包含到Java项目中
简而言之:
最后一个注释也是考虑您的特定语言是否需要合并单独文件的解析,即从当前文件中以包含ETC的形式链接的文件,因为您必须在其自己的类中开发解析器,并为随后链接的每个文件调用一个新实例。
无论如何,希望这对你的项目有所帮助,祝你好运 你好@Dean219。谢谢你的回答,第一个链接也很有用。这本书我已经下载了,我正在一点一点地阅读。我的目标语言是java,我已经编译了语法并得到了生成的文件(listener和visitor)我当时很困惑(如何使用listener/visitor)基本上listener或visitor类包含了从ur语法生成的方法,每当解析与某个规则匹配的语言部分时,就会调用每个方法。因此,假设您有一个导入规则,当antlr读取您的文件并找到一个导入语句时,java文件中包含的listener/visitor方法被调用,然后您可以处理您想对遇到的TextThank@Dean219执行的任何操作。解析后的生活是一个非常复杂的领域,我真的不知道如何开始,我找不到一些简单的例子来简化我的任务。有时候我对新事物的理解太慢了,没有例子。我不担心,实际上如果你想更深入地讨论,我们可以用私人信息,我可以试着更直接地回答你的问题。那太棒了。感谢您抽出时间@Dean219
private void main(String[] args) {
// Get our lexer
yourGrammarLexer lexer = new yourGrammarLexer(new ANTLRInputStream(args[0]));
// Get a list of matched tokens
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Pass the tokens to the parser
yourGrammarParser parser = new yourGrammarParser(tokens);
// Specify our entry point
yourGrammarContext yourGrammarContext = yourGrammarRule.drinkSentence();
// Walk it and attach our listener
ParseTreeWalker walker = new ParseTreeWalker();
yourGrammarListener listener = new yourGrammarListener();
walker.walk(listener, yourGrammarContext);