我的词法分析器中有两种标记类型,定义如下:
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'
并且解析器无法识别超过四位数的数字。如何解决词汇歧义?