3

私は次のANTLR文法を持っています:

grammar mygrammar;

ASSIGNMENT 
    :   ID '=' INT
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

ASSIGNMENTルールのみが実際に私のものであり、残りはANTLRWorks1.4.3によって追加されたデフォルトです。

インタプリタで文法を試してみると、「a = 5」などの文字列は成功しますが、「b [space] = [space] 6」などの文字列は失敗します。スペースが原因で、MismatchedTokenExceptionが発生します。

MismatchedTokenExceptionのあるインターフェースの画像

ANTLRのウェブサイトを読んでから、そして

ルールを無視する:WS
{$ channel = HIDDEN}
テキスト/文法規則では、空白は無視する必要があるようですが、そうではありません。

私は何が間違っているのですか?

4

1 に答える 1

6

あなたはすでに答えを見つけたと思いますが、なぜASSIGNMENTそれをassignment解決するために変更するのかを説明させてください。

大文字で始まるルールはレクサールール(つまりトークン)であるためです。{skip();}または、{$channel=HIDDEN;}レクサールールからではなく、パーサールールからレクサールールをスキップ(または非表示)させます。

そのため、ASSIGNMENT(レクサールール)は空白を受け入れず、assignment(パーサールール)は空白を無視します。

于 2011-10-26T04:52:12.987 に答える