2011-04-29 34 views
2

我是ANTLR的初學者,我有它的創作者的2本書,我正在閱讀很多博客/論壇帖子,但似乎我只是不明白現在。如何在ANTLR中實現流量控制(*執行* if-else,for ... while ....)?

我能找到的所有語法代碼都是這樣的,而樹語法代碼就是這樣,但我無法理解一個控制流是如何完成的。

因爲我想,我不能把我的問題要問你不夠清楚,讓我這樣說:

能否請你告訴我一切必要的代碼,在傳遞給解析器

for (i=0; i!=3; i=i+1) { 
    if (i==2) print i; 
    else print "not 2"; 
} 

將輸出:

not 2 
not 2 
2 

最好在Java中。

編輯:我發現在code.google.com上託管的一個使用ANTLR的小項目,基於此,我明白了我的問題是多麼的愚蠢! :)

+3

你所要求的是**很多**不僅僅是解析。你也要求編譯和執行。解析器將源代碼作爲輸入並生成AST(抽象語法樹)。它不運行代碼。 – 2011-04-29 21:04:47

+0

格雷格,我的意思是詢問究竟是在哪裏發生,如果 - 其他和......發生,我不知道我是否必須在解析器中放置某些東西,或者它應該在我的訪問者中。 – name 2011-04-29 21:06:41

+0

您可能不需要編譯和執行,但至少需要「解釋」程序以模擬程序語義的效果。 ANTLR讓你有一個解析和更多的努力,AST是撰寫這樣一位翻譯的重要基礎。在AST上編寫的口譯員通常不是很難,但ANTLR只是簡單地將AST交給你,讓你實現你想要的(一個解釋器或編譯器,只要你喜歡)。 – 2011-04-29 22:00:38

回答

2

作爲一個掃描儀/解析器,Antlr只實現了我們所謂的編譯器的前端。 Antlr的任務是採用自由形式的文本,並將其轉變爲易於編程的數據結構,特別是編譯器後端 - 以便使用。

寫這個編譯器後端(或解釋器,或其他)仍然是你的工作,恐怕!

+0

我看到了:)我很困惑,因爲Terence Parr在書中的一個例子有一個for循環,其中包括聲明部分中的「first」和for中的「inc」,我認爲這代表遞增,我沒有在代碼中找到這些「第一」和「inc」的任何聲明,並且它們在AntlrWorks中以斜體文本顯示,所以我認爲它們是內置的,並且以某種方式用於實際的循環。 – name 2011-04-29 21:10:44

相關問題