2009-01-12 31 views
0

我在詞法兩個令牌類型這樣定義:如何解決ANTLR 2中數字和日期之間的詞彙歧義?

NUMBERVALUE 
    : ('0' .. '9')+ ('.' ('0' .. '9')+)? 
    ; 

DATEVALUE 
    : ('0' .. '9') ('0' .. '9') ('0' .. '9') ('0' .. '9') '-' 
     ('0' .. '9') ('0' .. '9') '-' 
     ('0' .. '9') ('0' .. '9') 
    | ('0' .. '9') ('0' .. '9') '-' 
     ('0' .. '9') ('0' .. '9') '-' 
     ('0' .. '9') ('0' .. '9') 
     ; 

我本來認爲,由於日期必須包含前五個字符中的連字符,然後設置K = 5詞法分析器選項只要詞法分析器能夠將兩者分開就足夠了。但是,當我運行antlr時,出現此警告:

warning:lexical nondeterminism between rules NUMBERVALUE and DATEVALUE upon 
    k==1:'0'..'9' 
    k==2:'0'..'9' 
    k==3:'0'..'9' 
    k==4:'0'..'9' 
    k==5:'0'..'9' 

並且解析器無法識別其中包含多於四位數字的數字。我如何解決詞彙歧義?

回答

2

在我看來,由於Linear approximate lookahead,您會遇到虛假警告。第1,第2,第3,第4 DATEVALUE的第5個字符都可以是數字,但不能全部在同一時間。

我想盡量擺脫2/4數字年的選擇。對於初學者,你不想爲Y2.1K的錯誤負責;其次它爲您節省了另一種DATEVALUE語法。 另一種解決方案我想嘗試是使用不同的分組:

DATEVALUE 
: ('0' .. '9') ('0' .. '9') (('0' .. '9') ('0' .. '9'))? '-' 
    ('0' .. '9') ('0' .. '9') '-' 
    ('0' .. '9') ('0' .. '9') 
    ; 

我覺得它更具可讀性,你不要重複月/日的一部分。爲了便於閱讀,我會首先安裝可選部件,但我明白,在這些情況下應避免從可選部件開始,因爲這會使解析變得更加困難。