如何解决ANTLR 2中数字和日期之间的词汇歧义?

如何解决ANTLR 2中数字和日期之间的词汇歧义?,antlr,Antlr,我的lexer中有两种令牌类型,定义如下: NUMBERVALUE : ( '0' .. '9' )+ ( '.' ( '0' .. '9' )+ )? ; DATEVALUE : ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) '-' ( '0' .. '9' ) ( '0' .. '9' ) '-' ( '0' .. '9' ) ( '0' .

我的lexer中有两种令牌类型,定义如下:

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' )
         ;
我会认为,由于日期必须在前五个字符内包含连字符,那么在lexer选项中设置k=5就足够了,lexer可以始终区分这两个字符。但是,我在运行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'

而且解析器不能识别超过四位数的数字。如何解决词汇歧义?

在我看来,您可能会因为以下原因而遇到虚假警告。DATEVALUE的第一个、第二个、第三个、第四个和第五个字符都可以是数字,但不能同时都是数字

我会尝试摆脱2/4位数的年份选择。首先,你不想为Y2.1K错误负责;其次,它为您节省了另一种DATEVALUE语法。 我尝试的另一个解决方案是使用不同的分组:

DATEVALUE
:    ( '0' .. '9' ) ( '0' .. '9' ) (( '0' .. '9' ) ( '0' .. '9' ))? '-' 
     ( '0' .. '9' ) ( '0' .. '9' ) '-' 
     ( '0' .. '9' ) ( '0' .. '9' )
     ;
我认为它更具可读性,因为您不必重复月/日部分。为了可读性,我会把可选部分放在第一位,但我知道在这些情况下应该避免从可选部分开始,因为这会使解析变得更困难