2010-05-03 57 views
1

我在語法文件以下詞法規則:mismatchedtoken ANTLR的語法謂詞

LINE : 'F' | 'G'; 
RULE : (('->' ('F' | 'G')) => 'F' | 'G') 
       | LINE LINE + | LINE * (ROTATE + LINE+)+ ; 
fragment ROTATE : ('/' | '\\'); 

基本上,我試圖匹配的製作,看起來像的F - > F/F \˚F\ F/F。它成功匹配上面的東西,但我猜我的語法謂詞有問題,因爲G - > G會產生MismatchedTokenException。謂詞用於消除在' - >'的lhs上的單個字母之間的歧義,我希望將其識別爲LINE令牌,而在rhs上的那些符號應該是RULE。

任何想法我做錯了什麼?

+0

不宜行片段太? – 2010-05-05 13:32:33

+0

@安德斯:不,我的語法的其他部分需要它作爲標記 – varzan 2010-05-15 16:14:10

回答

1

注意以下規則:

RULE 
    : (('->' ('F' | 'G')) => 'F' | 'G') 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 

匹配單個G沒有謂語。上面的規則可以被改寫爲:

RULE 
    : (('->' ('F' | 'G')) => 'F' 
    | 'G' 
    ) 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 

這反過來等於:

RULE 
    : ('->' ('F' | 'G')) => 'F' 
    | 'G' 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 

也許你打算做這樣的事情:

RULE 
    : ('->' ('F' | 'G')) => ('F' | 'G') 
    | LINE LINE + 
    | LINE * (ROTATE + LINE+)+ 
    ; 
+0

你是對的,但沒有幫助。我通過將'G'或'F'與LINE令牌進行匹配並將RULE的後兩種選擇留給RULE,然後將生成的解析器規則定義爲LINE' - >'RULE或LINE' - >'LINE。 – varzan 2010-05-15 16:17:06

+0

好的。很高興聽到你解決它! – 2010-05-15 16:56:49