2013-10-31 26 views
1

Antlr4生成的代碼是否包含類似解析器的任何東西,它們可以使用語法和解析器樹來重構原始源代碼?如果它存在,我將如何調用它?我問,因爲它可能在某些應用程序和調試中很有用。如何使用Antlr作爲Unparser

回答

0

這真的取決於你想達到什麼。請記住,放在HIDDEN頻道上的Lexer令牌(如註釋和空格)並且根本不會被解析。 我用的方法是在詞法記號類

  • 使用額外的用戶特定信息
  • 分析源代碼,並獲得AST
  • 退詞法分析器(令牌源),並遍歷所有Lexem-ES,其中包括隱藏的人
  • 對於每個隱藏詞位,追加參照對應AST葉
  • 所以每AST葉「知道」哪些空白詞位跟隨它
  • 遞歸TR厭惡AST並打印所有Lexemes
+0

如果你使用' - > channel(HIDDEN)',那麼這是真的,但如果你使用' - > skip',則是這樣。 'skip'命令完全抑制了詞法分析器規則的標記生成,因此標記流將不包含任何有關這些規則文本的信息。 –

+0

我想我明白這一點,但是有沒有關於如何將這些空白節點附加到分析樹的示例?如何將包含HIDDEN標記的標記流與解析樹同步以知道在哪裏添加缺少的標記? –

+1

我是用C++做的,我假設你需要Java的例子。查看這些鏈接:http://www.antlr.org/wiki/pages/viewpage.action?pageId=1844或查看TokenLabelType語法選項http://www.antlr.org/wiki/display/ANTLR3/Grammar+選項。首先你需要做的是爲Token類子類並在其中添加額外的屬性。如何做到這一點至少有兩種方法。 – ibre5041

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

另外,令牌還包含行號和偏移量,如果你想與那些擺弄。