2016-09-19 105 views
1

我想創建一個從SQL到XQuery的翻譯器。
我想解析SQL並生成一箇中間結構,然後用它來生成XQuery查詢。
(注意:我希望使用中間表示法,因爲我期待將來將SQL翻譯爲其他查詢語言)
但是我一直不清楚如何在語法定義完成後生成翻譯器。我想使用ANTLR並確實已經創建了語法。我現在用語法文件卡住了,然後繼續建立翻譯器,因爲我不知道生成一個翻譯器的下一步是什麼。使用Antlr4的翻譯器

回答

2

這取決於你想要做什麼以及你想要做什麼語言。現在你已經有了你的語法,你應該看看你想用哪種語言來開發該語言的解析器。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文件或任何目標語言,定義訪問者/樹,這樣從一個參數傳遞的文件(取決於語言,看到蟒蛇的替代文件):

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

    }

一旦你有這個基本的應用程序獲取輸入文件併產生輸出,你希望它只輸出到你的中間格式。另一個解析器將需要讀取您的中間代碼並將其翻譯成完整的最終語言。

最後一個注意事項還要考慮您的特定語言是否需要合併解析單獨的文件,即以include等形式從當前文件內鏈接的文件,因爲您必須在其自己的類中開發解析器併爲每個被鏈接的文件調用一個新的實例。

無論如何,希望這有助於你的項目,並祝你好運!

+0

嗨@ Dean219。感謝您的回答,第一個鏈接也很有用。我已經下載了這本書,而且我正在讀一點點。 我的目標語言是java,我已經編譯語法並獲取生成的文件(監聽器和訪問者) 我很困惑(如何使用監聽器/訪客) – Great

+0

基本上,監聽器或訪問器類包含生成的方法從你的語法中,只要你的語言的一部分被解析出來,與你的規則相匹配,就會調用每個方法。所以說你有一個導入規則,當antlr讀取你的文件並發現一個import語句時,java文件中包含的listener/visitor方法被調用,然後你可以處理你想要處理的文件 – D3181

+0

再次感謝@ Dean219。解析後的生活是一個如此充滿活力的領域,我真的不知道如何開始,我找不到一些簡單的例子可以簡化我的任務。有時候,我在理解沒有例子的新東西方面如此緩慢 – Great