1

まず第一に、私はANTLRに不慣れです。私が求めていることは、他の皆さんにとっては些細なことかもしれませんが、あなたの助けが必要です。

ストリーム内のすべての修飾名を照合し、ストリームの残りの文字を無視したいと思います。

私は次のことを試しました:

findAllQualifiedNames
    :   qualifiedName+
    ;

qualifiedName 
    :   IDENTIFIER
        ('.' IDENTIFIER)*
    ;

IDENTIFIER
    :   ('_'
    |   '$'
    |   ('a'..'z' | 'A'..'Z'))
        ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$')*
    ;
AnyOtherChar
    :   . 
    {$channel=HIDDEN;}
    ;

しかし、それは私が期待したようには機能しません。入力の場合、修飾された名前としてa.b.c;d.e.f;のみ一致します。a.b.cそして、私はエラーを受け取ります:

で実行可能な代替手段はありません。

編集:

上記の文法では、次の入力を試しました。abc; def; .. {xy;}

a.b.c, d.e.fと一致することを期待していましx.yたが、次のようになります。

Eclipseプラグインインタープリター

4

1 に答える 1

3

入力 abc;def; の場合、修飾名として abc のみに一致します。そして、私はエラーを受け取ります: ...

私はそれを再現できません。

ANTLRWorks 1.4.3 のデバッガーを使用すると、次の解析ツリーが得られます。

ここに画像の説明を入力

(ご覧のとおり、出力画面 (左下隅) にエラー/警告は表示されません)

もちろん、修飾名のように「見える」文字列リテラルとコメント内のテキストを考慮する必要がありますが、以前の Q&A で示しました(この最後の発言は、将来の読者がJava ソース ファイルからすべての修飾名簡単に取得できます)。

編集

a.b.c; d.e.f; .. {x.y;}エラーが発生するのは、そこに 2 つの.'s (ドット) があるためです。ドットは、トークンとしてではなく、個別にトークン化されていAnyOtherCharます。

パーサー ルール内でリテラル トークンを定義しても ( in で行ったよう'.'qualifiedName) 、これらのトークンがそれらのパーサー ルールでのみ作成されるわけではありません。次の 2 つの文法は同一です。

1

qualifiedName : IDENTIFIER ('.' IDENTIFIER)*;
IDENTIFIER    : ('_' | '$' | 'a'..'z' | 'A'..'Z')+;

2

qualifiedName : IDENTIFIER (DOT IDENTIFIER)*;
IDENTIFIER    : ('_' | '$' | 'a'..'z' | 'A'..'Z')+;
DOT           : '.';
于 2012-04-23T21:17:34.517 に答える