2017-06-13 4 views
0

私はANTLR v4のJava文法(hereが利用可能です)を使用してJavaコードを解析しています。作品の一つは、次のようになります。なぜこのパターンはこのANTLR製作では一致しませんか?

expression 
    : primary 
    | expression '.' Identifier 
    | expression '.' 'this' 
    | expression '.' 'new' nonWildcardTypeArguments? innerCreator 
    | expression '.' 'super' superSuffix 
    | expression '.' explicitGenericInvocation 
    | expression '[' expression ']' 
    | expression arguments 
    | // Lots of other patterns... 
    ; 

expression '.' Identifierは、単純なメンバーのアクセスと一致し、expression argumentsは、メソッド呼び出しと一致します。このプロダクションの完全なソースはhereです。

構文の強調表示のために、という名前のメソッド呼び出しを検出するために追加の冗長パターンを導入したいbar()またはfoo.bar()は、メソッドの名前であるbarを持つ名前付きメソッド呼び出しとしてカウントされます。そのような表現については、識別子が通常は白く塗られていても、barを緑色にしたいと思っています。ただし、foo.barまたはfoo.bar[0]()には何も緑色で表示されません。前者ではbarはメソッドを呼び出さず、後者ではbar[0]は有効な識別子ではありません。

私はexpression arguments(注:argumentsは、元のソースコードに'(' expressionList? ')'と同義である):前に、これら2つの追加のパターンを追加しました

expression 
    : // ... 
    | expression '[' expression ']' 
    | Identifier arguments namedMethodInvocationStub // Detect bar() 
    | expression '.' Identifier arguments namedMethodInvocationStub // Detect (some().complicated().expression()).bar() 
    | expression arguments 
    | // ... 
    ; 

namedMethodInvocationStub 
    : 
    ; 

は(ここで、namedMethodInvocationStubは、私が追加した余分なダミーの生産であるという考え。私はVisitExpressionをオーバーライドして最後の子がnamedMethodInvocationStubであるかどうかを調べることができます。そうであれば、名前付きメソッドの呼び出しに一致したので、タイプIdentifierの直接の子をすべて調べ、緑色にします。つまり、私の質問には直接関係しません。)

foo.bar()は、以前は(expression '.' Identifier) argumentsとして解析されていましたが、今度はexpression '.' Identifier arguments namedMethodInvocationStubと解析されると予想されます。しかし、それは私がnamedMethodInvocationStubを削除したかどうかにかかわらず、前と同じ方法を解析します。どうしてこれなの?

答えて

0
私はあなたがANTLR(または任意の他のレクサー)に空のルール/トークン(namedMethodInvocationStub)と一致しないことができると信じて

ANTLR: empty condition not working

What is the equivalent for epsilon in ANTLR BNF grammar notation?

あなたはANTLRコード中にエラー/警告を参照しています世代段階?

+0

しかし、namedMethodInvocationStubの有無にかかわらず起こっているようです。 –

+0

あなたが提供した場所でパターン "表現引数"が見つかりませんでした。https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L497-L538 –

+0

申し訳ありませんが、私は微調整しましたそれをもっと綺麗にするためのコード。 'arguments'は、' '(' expressionList? ')と同義語のもう一つの非終端記号(ここではhttps://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L604-L606)です。 ''。 –

関連する問題