ANTLRWorks2中的TestDriver似乎有點挑剔,它會在什麼時候接受一個沒有和明確的文法,以及什麼時候不會。 你好在ANTLR4 Getting Started Guide語法不使用EOF
任何地方,所以我推測,如果可能的話,最好避免顯式EOF
。何時在ANTLR 4中需要EOF?
使用EOF
的最佳做法是什麼?你什麼時候需要它?
ANTLRWorks2中的TestDriver似乎有點挑剔,它會在什麼時候接受一個沒有和明確的文法,以及什麼時候不會。 你好在ANTLR4 Getting Started Guide語法不使用EOF
任何地方,所以我推測,如果可能的話,最好避免顯式EOF
。何時在ANTLR 4中需要EOF?
使用EOF
的最佳做法是什麼?你什麼時候需要它?
每次嘗試解析整個輸入文件時,都應在輸入規則末尾包含明確的EOF
。如果你不包含EOF
,這意味着你沒有試圖解析整個輸入,並且如果它意味着避免語法錯誤,只解析一部分輸入是可以接受的。
例如,請考慮以下規則:
file : item*;
這條規則的意思是「解析爲許多item
元素可能,然後停止。」換句話說,這個規則將會從來沒有試圖從語法錯誤中恢復,因爲它總是假設語法錯誤是超出了規則file
範圍的某些語法結構的一部分。語法錯誤甚至不會被報告,因爲解析器將會停止。
相反,如果我有以下規則:
file : item* EOF;
在指「一個文件由準確的零或更多的item
元件的序列組成」。如果在解析item
元素時達到語法錯誤,則此規則將嘗試從(並報告)語法錯誤中恢復並繼續,因爲EOF
是必需的且尚未到達。
對於規則下,如果只嘗試解析輸入的一部分,ANTLR 4常工作,但並非總是如此。以下問題描述了一個技術問題,如果省略了EOF
,ANTLR 4並不總是做出正確的決定。
https://github.com/antlr/antlr4/issues/118
不幸的是這種變化對性能的影響是相當大,所以直到解決會有優勢的情況下,你想到的是不規矩。
我意識到這是一條古老的線索,但希望人們仍在觀看。我的問題是,在語法開始時是否有與EOF相同的標記。我發現我可以在文本文件的開頭有任意的垃圾,直到找到第一個合法的標記。 – David