1

ステートメントが EOL で区切られている言語を解析したいと考えています。私はレクサー文法でこれを試しました(ドキュメントの例からコピーされました):

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

そして、これをパーサー文法で使用しました:

stmt_sequence : (stmt EOL)* ;

パーサーは、ステートメントが 1 つ以上の空白行で区切られているコードを拒否しました。

しかし、これは成功しました:

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

stmt_sequence : (stmt EOL+)* ;

私はANTLR初心者です。どちらも機能するはずです。貪欲/非貪欲なレクサースキャンについて理解できないことはありますか?

これを 3.2 と 3.4 の両方で試しました。OS X 10.6の Eclipse Indigo でANTLR IDE を実行しています。

ありがとう。

4

1 に答える 1

0

エラーは元の文法にはありませんでした。しかし、入力データでは。EOL の後にタブを自動的に挿入するエディター (Eclipse 内) を使用していたため、「空白行」は実際には空白ではありませんでした。

文法を次のように修正しました。

fragment SPACE: ' ' | '\t';

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

この文法は期待どおりに機能します。

ここでの教訓は、空白には注意しなければならないということです。lexer は、パーサーが認識しない入力内の空白を検出する場合があります (非表示のチャネルに既に送信されているため)。

于 2012-02-09T21:17:01.677 に答える