2017-06-13 63 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.barfoo.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。爲什麼是這樣?

回答

0

我相信你無法比擬的空規則/令牌(namedMethodInvocationStub)在ANTLR(或任何其他詞法分析器)

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

相關問題