Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Antlr4的翻译器_Java_Sql_Xquery_Antlr_Intermediate Language - Fatal编程技术网

Java 使用Antlr4的翻译器

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并生成一个中间结构,然后使用它生成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项目中

简而言之

  • 写你的语法
  • 编辑你的语法
  • 填写任何侦听器/访问者方法
  • 在Java文件或任何目标语言中,定义一个访问者/树,并通过如下参数将文件传递给它(取决于语言,请参阅python替代文档):

    }

  • 一旦你有了这个基本的应用程序,获取一个输入文件并生成输出,你希望它只输出到你的中间格式中。需要另一个解析器来读取中间代码并最终将其翻译成完整的最终语言

    最后一个注释也是考虑您的特定语言是否需要合并单独文件的解析,即从当前文件中以包含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);