2012-07-12 131 views
3

我有2個問題:ANTLR - 如何使用生成的AST樹?

在我ANTLR解析器,我有這樣的重寫規則:

msg: msg_content (COMMA msg_content)* -> ^(MSG_CTS msg_content+); 

在我的樹語法,我怎麼可以利用收集到的msg_content令牌? $ msg_content.text正在返回空例外。


更一般地說,你能爲我提供一些指導,關於我如何使用我生成的AST樹?我基本上想要遍歷節點併爲例如不同的事物創建Java類。

我有這個簡單的樹會打印:

(MSG (AGENTS A B) (MSG_CTS x y)) 

我想有一些Java類「信息」與「代理商」字段包含A,B,這將持有X的一些內容領域,Y.

我已經通過ANTLR權威指南,但沒有參考如何使用組合的標記,甚至,如何瀏覽樹,就像我想要的。就好像每個ANTLR教程都有關於表達式評估者!

我見過:ANTLR在線手冊中的「AST與Java的接口」和「表達式評估器」,但我不太清楚如何將這些應用到我的問題中。如果你能提供一個簡單的例子,它會非常有幫助!

請幫助...謝謝!

回答

1

$ msg_content.text返回一個空例外

這是不可能的評論沒有看到所有相關的規則和代碼。你可以編輯你的問題,幷包括一個獨立的例子,我或其他人,可以運行,再現錯誤/異常?

(MSG(AGENTS AB)(MSG_CTS XY))

我想有一些Java類 「消息」 與 「代理」 字段含有A,B和將容納一些內容字段X,Y.

看看這個教程列表:https://stackoverflow.com/questions/278480/antlr-tutorials,並非所有的都是關於表達式評估器。 My tutorial演示如何在樹沃克中使用自定義節點類。

另請參閱this Q&A也顯示如何在樹沃克中使用自定義節點類。

+0

我通讀了你的教程Bart Kiers,但它仍然是一個表達式評估器。我想知道如何解決我的特殊問題。例如,我想創建一個「代理」對象,將其附加到「消息」對象。然後,向下移動並創建一個「內容」對象,再次將它附加到同一個消息等...我怎麼做到這一點? – 2012-07-12 18:16:15

+0

@ Inf.S,不,它不是一個表達式求值器:它是一個帶'for','while'和'if'語句,函數等的小型語言。就像我解釋的:在樹步行者中,我展示到底如何創建自定義節點類,這是你看起來像是在後面。 – 2012-07-12 18:20:14

+0

讓我回頭再讀一遍教程,然後閱讀Scopes。如果我仍然陷入困境,我會在這個問答中回覆你。謝謝! – 2012-07-12 19:02:16