我正在使用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? ')'
):
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'是另一個非終結符([here](https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L604-L606))與''('expressionList?'同義) 「'。 –