2016-04-17 19 views
1

我們從哪裏開始從頭開始手動構建CST?或者ANTLR4總是要求lex/parse過程作爲我們的輸入步驟?ANTLR4 - 從非文件輸入生成代碼?

我的程序中有一些視覺元素代表代碼結構。

例如一個正方形表示一個類,而嵌入在該正方形內的圓代表一種方法。

現在我想把它們變成代碼。我如何在運行時(使用ANTLR4.js)使用ANTLR4來做到這一點?大多數ANTLR示例似乎都依賴lexing和解析現有代碼來獲取語法樹。因此,而不是:

input code->lex->parse->syntax tree->output code (1)

我想

manually create syntax tree->output code (2)

(後來,隨着用戶添加代碼到類及其方法,然後ANTLR將在 (1)使用。)

編輯也許我誤解了這一點。我是否創建一些自定義數據結構,然後通過它運行解析器?即write structures to some in-memory format->parse->output code (3)

+0

ANTLR4不創建任何AST,它只能創建一個CST。如果你想自己建立一個CST,究竟是什麼阻止你這樣做呢? –

+0

@LucasTrzesniewski對不起,我是新手。通過CST,我認爲你的意思是ANTLR稱之爲分析樹。我想要一個AST,因爲這可以讓我使用相同的源碼樹以2種語言(C&JS)讀/寫源文件。但是我不需要同時使用這些項目......一個項目將被寫入另一個項目中......所以沒有什麼能夠阻止我讀取當前項目的源代碼(C _或_ JS),然後輸出因此。 –

+0

@LucasTrzesniewski我可以安全地假設沒有辦法在ANTLR4中手動構建樹(而不是3)嗎?因此,我們必須改爲解析某些字節流以構建它? –

回答

3

IIUC,你可以直接使用StringTemplate。

通過背景的方式,Antlr本身構建了一個內存分析樹,然後遍歷它,逐步調用StringTemplate來輸出由相應的分析樹節點數據限定的代碼片段。 Antlr使用內部分析樹僅僅是簡化步行的便利(因爲Antlr是使用Antlr構建的)。

如果您擁有自己的數據結構,無論其具體實現如何,都可以對其進行程序化處理,逐步調用ST模板以發出相應的代碼。而且,如果他們滿足您的要求,您可以直接使用Antlr使用的相同模板(JavaScript.stg)。當然,如果你的數據結構具有可以被解析/解析成標準Antlr解析樹的特性,那麼你可以使用一個標準的Antlr訪問者來調用和填充特定於節點的模板。

+0

這引發了我的快樂追逐,期間我發現ANTLR4沒有C.stg(有ANTLR3;我仍在考慮這個選項)。編寫.stg是一項特別的核心任務,不建議用於ANTLR4或代碼目標語言的新手。所以這是ANTLR3或其他方式。謝謝。另外,你是什麼意思的「節點特定模板」? –

+0

數據結構中對應於正方形的節點將與類模板相關聯;循環到方法模板。 C.stg並不特定於Antlr3或4.它特定於StringTemplate的版本。不要以爲StringTemplate的語法在一段時間內會發生實質性的變化。 – GRosenberg

+0

呃,我能理解ANTLR在這些級別上使用模板嗎?如果是這樣的話,將會有一些好處,以便我可以去查找它。 –