24

次のような空白処理を使用する多くの ANTLR 文法を見てきました。

WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);

したがって、空白はそれぞれ破棄され、非表示のチャネルに送信されます。

このような文法で:

grammar Not;

start:      expression;
expression: NOT expression
          | (TRUE | FALSE);

NOT:    'not';
TRUE:   'true';
FALSE:  'false';
WS: [ \n\t\r]+ -> skip;

有効な入力は、' not true ' または ' not false ' ですが、望ましい結果ではない' nottrue ' もあります。文法を次のように変更します。

grammar Not;

start:      expression;

expression: NOT WS+ expression
          | (TRUE | FALSE);

NOT:    'not';

TRUE:   'true';
FALSE:  'false';

WS: [ \n\t\r];

問題は修正されましたが、各ルールで空白を手動で処理したくありません。

一般に、いくつかの例外を除いて、各トークンの間に空白を入れたいと考えています (たとえば、' !true ' の間に空白は必要ありません)。

これを行う簡単な方法はありますか?

4

1 に答える 1

24

IDENTIFIERキーワードではない単語を処理するレクサー ルールを追加します。

IDENTIFIER : [a-zA-Z]+;

テキストは、パーサーが の個別のキーワードの代わりに受け入れないnottrue単一のトークンです。IDENTIFIERnot true

が他のキーワードのIDENTIFIERに​​定義されていることを確認してください。lexer は、 と の両方が text に一致することを検出し、文法に最初に現れるものにトークン タイプを割り当てます。NOTIDENTIFIERnot

于 2013-03-19T15:29:50.310 に答える