2013-10-18 96 views
2

我正在嘗試編寫一個語法來解析文件,其中空白行表示塊的結尾。我有類似於這個幾乎可行的語法。文件末尾的可選標記

file : block+ EOF; 
block : line+ NL; 
line : stuff NL; 

NL : '\r'? '\n'; 

這有效,除了最後一塊有時沒有額外的換行符。當我處於文件末尾時,是否有一種很好的方法可以使塊末尾的NL成爲可選項?

在antlr3,我會做

block : line+ (NL | (EOF) => /* empty */) 

然而,antlr4沒有句法斷言的,所以我不能這樣做。

block : line+ NL? ; 

應該可以工作,但是在文件中間的一個塊可以避免它的最終換行符。我不認爲這是因爲一個區塊只能跟着一個區塊。這意味着沒有尾隨換行符的塊後跟一個塊看起來像是一個單獨的塊,解析器會貪婪地組合它們。但是,它不太清楚結構究竟是什麼。我當然可以想象更復雜的源文件格式,這會導致問題。

有沒有解決這個問題的好方法?

回答

0

嘗試這樣:

file : NL* block (NL+ block)* NL* EOF; 
block : line (NL line)*; 
line : stuff; 

NL : '\r'? '\n'; 

或只是在你輸入的末尾添加一個換行符。

+0

這將工作。它不像我原來的那樣精簡,但它也更加正確。 –