使用Antlr4的翻译

时间:2016-09-19 11:39:18

标签: java sql xquery antlr intermediate-language

我想创建一个从SQL到XQuery的翻译器 我想解析SQL并生成一个中间结构,然后用它来生成XQuery查询 (注意 - 我想使用中间表示,因为我期待将来将SQL翻译成其他查询语言)
但是一旦确定了语法,我就不确切知道如何制作翻译。我想使用ANTLR并且确实已经创建了语法。我现在卡在语法文件中并继续构建翻译器,因为我不确切知道生成翻译器的下一步是什么。

1 个答案:

答案 0 :(得分:3)

这取决于您想要做什么以及您想要使用哪种语言。现在你已经掌握了语法,你应该研究你希望用哪种语言开发该语言的解析器.Antlr4具有Java,javascript和python的运行时。

因此,您可以将语法编译为其中一种输出语言:

Java -jar yourgrammar.g4 
Java -jar -Dlanguage=Python2 yourgrammar.g4 
Java -jar -Dlanguage=Python3 yourgrammar.g4 

注意

您真的应该阅读ANTLR documentation了解如何继续使用ANTLR或完整教程,包括terence parr撰写的书。

但是一旦你编写了你的​​语法,你就可以通过填写一个监听器或访问者方法来开始构建你的翻译器,这种方法会产生你在决定语法元素时所做出的决定。默认情况下,您将拥有一个名为" yourGrammarListener"的空侦听器。其中您的语法是.g4文件的名称,并在其末尾附加了侦听器。对于您定义的任何规则,此文件将包含许多空白方法。

您选择哪种语言作为目标因此定义您是应该扩展此文件还是将您的功能实现到生成的侦听器中。

在确定项目包含指向应用程序所需的任何ANTLR运行时的链接后,您应该能够运行应用程序的任何方法,再次默认为Java运行时,并且通常是最常用的这意味着将ANTLR.jar文件包含到Java项目中。

所以简而言之

  1. 写你的语法
  2. 编译你的语法
  3. 填写任何听众/访客方法。
  4. 在您的Java文件或任何目标语言中,定义访问者/树并从这样的参数传递文件(取决于语言,请参阅python替代文档):

    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);
    

    }

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

    最后要注意的是,还要考虑您的特定语言是否需要合并单独文件的解析,即以包含等形式从当前文件中链接的文件,因为您必须在自己的类中开发解析器,为随后链接的每个文件调用一个新实例。

    无论如何,希望这对你的项目有所帮助并祝你好运!