我想創建一個從SQL到XQuery的翻譯器。
我想解析SQL並生成一箇中間結構,然後用它來生成XQuery查詢。
(注意:我希望使用中間表示法,因爲我期待將來將SQL翻譯爲其他查詢語言)
但是我一直不清楚如何在語法定義完成後生成翻譯器。我想使用ANTLR並確實已經創建了語法。我現在用語法文件卡住了,然後繼續建立翻譯器,因爲我不知道生成一個翻譯器的下一步是什麼。使用Antlr4的翻譯器
1
A
回答
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項目中。
因此,在短期:
- 寫你的語法
- 編譯你的語法
- 填寫任何監聽器/訪問者方法。
在你的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等形式從當前文件內鏈接的文件,因爲您必須在其自己的類中開發解析器併爲每個被鏈接的文件調用一個新的實例。
無論如何,希望這有助於你的項目,並祝你好運!
相關問題
- 1. 重寫AST動作翻譯爲ANTLR4
- 2. 使用翻譯
- 3. Laravel在翻譯字符串中使用翻譯器
- 4. 將java翻譯爲antlr4中的python python3目標
- 5. 翻譯使用angularjs
- 6. 翻譯使用python
- 7. 翻譯使用mediaelementjs
- 8. 在GADT上使用翻譯解釋器
- 9. 使用Antlr/Stringtemplates編寫翻譯器
- 10. 如何在角度翻譯中使用翻譯值屬性中的過濾器
- 11. 使用現有的人工翻譯來幫助機器翻譯成新語言
- 12. Rails的翻譯 - 正確的使用HTML安全翻譯
- 13. 角度翻譯 - 翻譯翻譯值attr
- 14. 如何使用角度翻譯翻譯頁面標題的值?
- 15. 我可以使用Google翻譯翻譯我的網站嗎?
- 16. 翻譯使用的許多組件NG2-翻譯
- 17. AngularJS翻譯使用角度翻譯的多元化
- 18. 翻譯文件,使用此代碼谷歌翻譯的Java API
- 19. 使用DoctrineExtensions翻譯的克隆Doctrine實體可翻譯
- 20. 使用微軟翻譯API翻譯的測試的使用限制
- 21. Codeigniter的多翻譯器
- 22. 使用Monodroid翻譯.NET DLL
- 23. 翻譯使用Qt Linguist?
- 24. 翻譯不能使用symfony2.1
- 25. 翻譯使用SPARQL與Babelnet
- 26. 使用PHP語言翻譯
- 27. 沒有使用gettext翻譯
- 28. 翻譯使用jQuery和CSS3
- 29. 使用Box2d翻譯d3dxsprites?
- 30. VB.net使用谷歌翻譯
嗨@ Dean219。感謝您的回答,第一個鏈接也很有用。我已經下載了這本書,而且我正在讀一點點。 我的目標語言是java,我已經編譯語法並獲取生成的文件(監聽器和訪問者) 我很困惑(如何使用監聽器/訪客) – Great
基本上,監聽器或訪問器類包含生成的方法從你的語法中,只要你的語言的一部分被解析出來,與你的規則相匹配,就會調用每個方法。所以說你有一個導入規則,當antlr讀取你的文件並發現一個import語句時,java文件中包含的listener/visitor方法被調用,然後你可以處理你想要處理的文件 – D3181
再次感謝@ Dean219。解析後的生活是一個如此充滿活力的領域,我真的不知道如何開始,我找不到一些簡單的例子可以簡化我的任務。有時候,我在理解沒有例子的新東西方面如此緩慢 – Great