Antlr4生成的代碼是否包含類似解析器的任何東西,它們可以使用語法和解析器樹來重構原始源代碼?如果它存在,我將如何調用它?我問,因爲它可能在某些應用程序和調試中很有用。如何使用Antlr作爲Unparser
1
A
回答
0
這真的取決於你想達到什麼。請記住,放在HIDDEN頻道上的Lexer令牌(如註釋和空格)並且根本不會被解析。 我用的方法是在詞法記號類
- 使用額外的用戶特定信息
- 分析源代碼,並獲得AST
- 退詞法分析器(令牌源),並遍歷所有Lexem-ES,其中包括隱藏的人
- 對於每個隱藏詞位,追加參照對應AST葉
- 所以每AST葉「知道」哪些空白詞位跟隨它
- 遞歸TR厭惡AST並打印所有Lexemes
0
是的! ANTLR的基礎設施(通常)使原始源數據可用。
在默認情況下,您將使用CommonTokenStream。這繼承了BufferedTokenStream,它提供了一整套獲取東西的方法。
方法getHiddenTokensOnLeft(和...右)將得到您未出現在DEFAULT流中的標記列表。這些令牌將使用getText()來顯示其源文本。
我發現更加方便的是BufferedTokenStream.getText(interval),它會給你一個Interval上的文本(包括隱藏),你可以從你的樹元素(RuleContext)中獲得這些文本。
爲了使用您的CommonTokenStream及其方法,您只需將它從創建它的位置傳遞出去,並將解析器設置爲檢查解析樹的任何類,例如您的XXXBaseListener - 我只是給我的聽衆一個將CommonTokenStream存儲爲實例字段的構造函數。
所以,當我想爲一個規則CTX完整的文本,我用這個小方法:
String originalString(ParserRuleContext ctx) {
return this.tokenStream.getText(ctx.getSourceInterval());
}
另外,令牌還包含行號和偏移量,如果你想與那些擺弄。
相關問題
- 1. 如何使用ANTLR
- 2. antlr:使用antlr-treewalker作爲字符串提取子樹
- 3. 如何使用antlr 4 TokenStream作爲可迭代流?
- 4. ANTLR如何使用遞歸
- 5. 如何使用Antlr與antlr3
- 6. 使用ANTLR
- 7. ANTLR:如何使用的String.format內行動
- 8. ANTLR - Ç目標:如何使用矢量
- 9. ANTLR如何使用至無窮遠
- 10. 如何使用ANTLR獲得此編碼?
- 11. ANTLR - 如何使用生成的AST樹?
- 12. 如何使用ANTLR解析XML文檔
- 13. 如何使用ANTLR 4在線解析?
- 14. ANTLR如何執行其角色操作?
- 15. 使用ANTLR C目標,我如何使用動作來打印令牌?
- 16. 如何爲ANTLR指定目標包?
- 17. antlr返回值作爲鍵值
- 18. 如何使一個ANTLR 3在VS 2010中工作?
- 19. 使用ANTLR淺解析
- 20. 在ANTLR中使用@header
- 21. 使用antlr刪除死碼
- 22. 什麼時候使用ANTLR
- 23. 的QuickBasic語法使用ANTLR
- 24. 你如何用ANTLR生成Delphi輸出?
- 25. 如何配置Antlr語法
- 26. 在Intellij的generated-src/antlr中使用gradle antlr插件複製dagger2
- 27. 使用ANTLR和Antlr CSharp目標構建DSL的編譯器
- 28. Antlr 4 c#目標不起作用
- 29. ANTLR的語法用單引號加倍作爲運營商
- 30. 如何使用ANTLR語法排除字符/符號?
如果你使用' - > channel(HIDDEN)',那麼這是真的,但如果你使用' - > skip',則是這樣。 'skip'命令完全抑制了詞法分析器規則的標記生成,因此標記流將不包含任何有關這些規則文本的信息。 –
我想我明白這一點,但是有沒有關於如何將這些空白節點附加到分析樹的示例?如何將包含HIDDEN標記的標記流與解析樹同步以知道在哪裏添加缺少的標記? –
我是用C++做的,我假設你需要Java的例子。查看這些鏈接:http://www.antlr.org/wiki/pages/viewpage.action?pageId=1844或查看TokenLabelType語法選項http://www.antlr.org/wiki/display/ANTLR3/Grammar+選項。首先你需要做的是爲Token類子類並在其中添加額外的屬性。如何做到這一點至少有兩種方法。 – ibre5041