我有一组要解析的文件有这个奇怪的内容。每行包含以下数据(删除所有其他无关的内容):
DATA<字母数据> <数字数据><期间作为终止符>
然后我们可以提供如下文字:
TEXT<字母数字数据+ puntuation(包括句号)>
所以我在解析DATA行时遇到问题,因为数字数据可以是以下任何一种类型:
99.9
99
0.9
特别是解析数据:
DATA ANACRON99 ..
末尾的第一个点是小数点,第二个是终结符
我试过的语法样本,只复制相关部分如下:
o
这会检测第一个句点作为floatdata的一部分,但完全忽略第二个句点并抱怨它期待PERIOD但发现了EOF。请问有什么方法可以解决这个问题。有没有办法向前看,同时跟踪检测到的最后一个令牌?
谢谢!
答案 0 :(得分:0)
FLOATVALUE
可以匹配单个句点,并且会在PERIOD
之前列出。因此,词法分析器匹配两个FLOATVALUE
串联。
为避免歧义,请将FLOATVALUE
更改为:
FLOATVALUE: ([0-9])+('.')([0-9])+
| ([0-9])+('.')
| ('.')([0-9])+
;
答案 1 :(得分:0)
为避免FLOATVALUE
与PERIOD
匹配,您可以切换词法分析器定义的顺序。
mode SENSORMODE;
PERIOD:'.' ->mode(DEFAULT_MODE)
;
FLOATVALUE: ([0-9])*('.')([0-9])*
;
WS:[ \t]->skip
;
WS2:[\r\n]
;
ANTLR始终返回最长匹配词法分析器规则的令牌类型,如果是相同长度匹配,则返回第一个类型。修改后的语法将PERIOD
移动到第一个位置。