私は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
を削除したかどうかにかかわらず、前と同じ方法を解析します。どうしてこれなの?
しかし、namedMethodInvocationStubの有無にかかわらず起こっているようです。 –
あなたが提供した場所でパターン "表現引数"が見つかりませんでした。https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L497-L538 –
申し訳ありませんが、私は微調整しましたそれをもっと綺麗にするためのコード。 'arguments'は、' '(' expressionList? ')と同義語のもう一つの非終端記号(ここではhttps://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L604-L606)です。 ''。 –