を扱うとき、私はシンプルなANTLR4文法をしました電話を切っ:ANTLR4がEOF
grammar Test;
preprocessing_file: oneline+;
oneline: IDENTIFIER? new_line;
new_line: EOF|CRLF
;
WS: [ \t\f]+ -> channel(2);
CRLF: '\r'? '\n';
IDENTIFIER: (NONDIGIT | DIGIT)+
;
fragment DIGIT: [0-9];
fragment NONDIGIT: [_a-zA-Z] ;
私はCRLFによって終了されていない最後の行を可能に改行ルールを使用する方法をテストしていました。私はANTLR v4.1とv4.5.3で文法をテストしました。
数行のテキストの入力ファイルでANTLR4がフリーズし、しばらくするとOutOfMemoryExceptionが発生しました。 ANTLR4が無限ループに入ったようです。 ANTLR4のバグですか?私は何か悪いことをしましたか?また、私がルールのEOF
を削除しても、すべて正常に動作します。
Thxがない最後の行には一致しません。これは問題です。私は、レクサーがそれを消費し続けると無限に多くのEOFが生成される可能性があることを認識しませんでした。しかし、あなたが提案した解決策はうまくいかないでしょう。実際の原因は、 'oneline'ルールが1つのEOFと無期限に一致し、レクサーが無期限にポンピングを続けるということです。非貪欲な演算子、つまりoneline +?を使用する必要があります余分なEOFに加えて – JavaMan
はい - 回答が更新されました。 – GRosenberg