2012-02-08 14 views
1

文がEOLで区切られた言語を解析したい。 複数のEOLを1つとして扱うANTLR?

EOL : ('\r'? '\n')+ ; // any number of consecutive linefeeds counts as a single EOL 

、次いでパーサ文法でこれを使用する:私は(ドキュメントの例からコピーされた)字句解析文法でこれを試みた

stmt_sequence : (stmt EOL)* ; 

パーサーは、1つまたはによって分離されたステートメントでコードを拒否しましたより多くの空白行。

しかし、これは成功した:私はANTLRの初心者だ

EOL : '\r'? '\n' ; 

stmt_sequence : (stmt EOL+)* ; 

。両方がうまくいくように思える。私が理解していない欲張り/非ドキドキのレクサースキャンに関する何かがありますか?

私はこれを3.2と3.4の両方で試しました。 EclipseのANTLR IDEを実行していますインディゴOS X 10.6

ありがとうございました。

答えて

0

エラーは元の文法にはありませんでした。しかし、入力データに含まれています。私はEOLの後にタブを自動的に挿入するエディタ(Eclipseで)を使用していたので、私の "空白行"は本当に空白ではありませんでした。

次のように私は文法を修正:

fragment SPACE: ' ' | '\t'; 

EOL : ('\r'? '\n' SPACE*)+; 

を期待通り、この文法は動作します。

ここでの教訓は、空白に注意する必要があることです。レクサーは、パーザが見えない入力の空白を(隠しチャネルにすでに送られているため)見ることができます。

関連する問題