2013-07-24 32 views
13

ANTLRWorks2中的TestDriver似乎有點挑剔,它會在什麼時候接受一個沒有和明確的文法,以及什麼時候不會。 你好ANTLR4 Getting Started Guide語法不使用EOF任何地方,所以我推測,如果可能的話,最好避免顯式EOF何時在ANTLR 4中需要EOF?

使用EOF的最佳做法是什麼?你什麼時候需要它?

回答

13

每次嘗試解析整個輸入文件時,都應在輸入規則末尾包含明確的EOF。如果你不包含EOF,這意味着你沒有試圖解析整個輸入,並且如果它意味着避免語法錯誤,只解析一部分輸入是可以接受的。

例如,請考慮以下規則:

file : item*; 

這條規則的意思是「解析爲許多item元素可能,然後停止。」換句話說,這個規則將會從來沒有試圖從語法錯誤中恢復,因爲它總是假設語法錯誤是超出了規則file範圍的某些語法結構的一部分。語法錯誤甚至不會被報告,因爲解析器將會停止。

相反,如果我有以下規則:

file : item* EOF; 

在指「一個文件由準確的零或更多的item元件的序列組成」。如果在解析item元素時達到語法錯誤,則此規則嘗試從(並報告)語法錯誤中恢復並繼續,因爲EOF是必需的且尚未到達。


對於規則下,如果只嘗試解析輸入的一部分,ANTLR 4常工作,但並非總是如此。以下問題描述了一個技術問題,如果省略了EOF,ANTLR 4並不總是做出正確的決定。

https://github.com/antlr/antlr4/issues/118

不幸的是這種變化對性能的影響是相當大,所以直到解決會有優勢的情況下,你想到的是不規矩。

+0

我意識到這是一條古老的線索,但希望人們仍在觀看。我的問題是,在語法開始時是否有與EOF相同的標記。我發現我可以在文本文件的開頭有任意的垃圾,直到找到第一個合法的標記。 – David