5

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

4

1 回答 1

5

这取决于你想做什么以及你想用什么语言来做。现在你有了你的语法,你应该研究你希望用哪种语言为该语言开发解析器。Antlr4 有 Java、javascript 和 python 的运行时。

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

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

笔记

你真的应该阅读ANTLR 文档以了解如何继续使用 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);
    

    }

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

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

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

于 2016-09-19T12:01:17.413 回答