2012-04-29 94 views
2

在ANTLR,我有一個MismatchedTokenException,定義如下:匹配雙令牌

type : IDENTIFIER ('<' (type (',' type)*) '>')?; 

而且下面的測試:

A<B,C<D>> 

解析第一>時出現的異常。 ANTLR試圖一次解析'>>',並且失敗。

隨着無聲空白信道,以下測試確實工作:

A<B,C<D> > 

在其ANTLR被明確指示單獨地處理每個令牌。

我該如何解決這個問題?

回答

2

我無法重現。所產生的解析器:

grammar T; 

type  : IDENTIFIER ('<' (type (',' type)*) '>')?; 
IDENTIFIER : 'A'..'Z'; 

解析輸入A<B,C<D>>(無空格)到以下分析樹:

enter image description here

您需要提供導致此輸入產生一個語法MismatchedTokenException。也許你正在使用ANTLRWorks的解釋器(或Eclipse的ANTLR-IDE,它使用相同的解釋器)?在這種情況下,可能是問題所在:它是臭名昭着的越野車。不要使用它,但使用ANTLRWorks的調試器:它很棒(上面公佈的圖像來自調試器)。

拉茲洛博寧寫道:

明白了。我有一個定義的令牌< <。很快,有沒有辦法將令牌識別優先於另一種?

不,詞法分析器只是試圖儘可能匹配。因此,如果它可以創建與<<(或>>)相匹配的標記,則它將這樣做以支持兩個單一的標記<(或>)。只有兩個(或更多)詞法分析器規則匹配相同數量的字符時,纔會進行優先級排序:首先定義的規則將隨後在文法中定義的規則中「勝出」。

+0

明白了。我定義了一個'>>'標記。很快,有沒有辦法將令牌識別優先於另一種? – Lazlo

+0

@LazloBonin,看我編輯的答案。 –