2012-09-10 103 views
1

我真正的語法比較複雜,但我可以去掉我的問題。因此,這是語法:ANTLR AST語法問題不匹配令牌例外

grammar test2; 
options {language=CSharp3;} 

@parser::namespace { Test.Parser } 
@lexer::namespace { Test.Parser } 

start : 'VERSION' INT INT project; 

project : START 'project' NAME TEXT END 'project'; 

START: '/begin'; 
END: '/end'; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

    INT : '0'..'9'+; 

    NAME: ('a'..'z' | 'A'..'Z')+; 

    TEXT : '"' ('\\' (.) |'"''"' |~('\\' | '"' | '\n' | '\r'))* '"'; 

    STARTA 
     : '/begin hello'; 

我要分析此(例如):

VERSION 1 1

/begin project

testproject "description goes here"

/end

project

現在,它不會像這樣(不匹配的令牌除外)工作。如果我刪除了最後一個Token STARTA,它就可以工作。但爲什麼?我不明白。

幫助真的很感激。 謝謝。

回答

2

當詞法分析器看到輸入"/begin "(包括空格!)時,它致力於規則STARTA。當它不符合所述規則時,因爲輸入中的下一個字符是"p"(來自"project")而不是"h"(來自"hello"),它將嘗試匹配可以匹配"/begin "(包括空格!)的另一個規則。但有沒有這樣的規則,產生錯誤:

mismatched character 'p' expecting 'h'

和詞法分析器將放棄的空間和匹配START規則。請記住最後一部分:一旦詞法分析器匹配了某些東西,它就不會放棄它。它可能會嘗試其他匹配相同輸入的規則,但它不會回溯到匹配較少字符的規則!

這就是詞法分析器在ANTLR 3.x中的工作原理,沒有辦法繞過它。

+0

你知道Antlr4是否會解決這個問題?否則,我將不得不重新思考我的語法不好的大部分。 – metacircle

+0

@metacircle,不,我不知道。但是如果真的這樣,在穩定的v4發佈之前(AFAIK)可能還需要一段時間。 –

+0

@metacircle,但是將多個id「合併」成一個單獨的標記通常是一個糟糕的主意:這樣的事情通常應該更好地在解析器規則中處理。 –