2
我正在嘗試編寫一個語法來解析文件,其中空白行表示塊的結尾。我有類似於這個幾乎可行的語法。文件末尾的可選標記
file : block+ EOF;
block : line+ NL;
line : stuff NL;
NL : '\r'? '\n';
這有效,除了最後一塊有時沒有額外的換行符。當我處於文件末尾時,是否有一種很好的方法可以使塊末尾的NL成爲可選項?
在antlr3,我會做
block : line+ (NL | (EOF) => /* empty */)
然而,antlr4沒有句法斷言的,所以我不能這樣做。
block : line+ NL? ;
應該可以工作,但是在文件中間的一個塊可以避免它的最終換行符。我不認爲這是因爲一個區塊只能跟着一個區塊。這意味着沒有尾隨換行符的塊後跟一個塊看起來像是一個單獨的塊,解析器會貪婪地組合它們。但是,它不太清楚結構究竟是什麼。我當然可以想象更復雜的源文件格式,這會導致問題。
有沒有解決這個問題的好方法?
這將工作。它不像我原來的那樣精簡,但它也更加正確。 –