情境敏感的lexing&解析

时间:2015-05-20 03:12:33

标签: antlr4

我有一组要解析的文件有这个奇怪的内容。每行包含以下数据(删除所有其他无关的内容):

DATA<字母数据> <数字数据><期间作为终止符>

然后我们可以提供如下文字:

TEXT<字母数字数据+ puntuation(包括句号)>

所以我在解析DATA行时遇到问题,因为数字数据可以是以下任何一种类型:

99.9

99

0.9

特别是解析数据:

DATA ANACRON99 .​​.

末尾的第一个点是小数点,第二个是终结符

我试过的语法样本,只复制相关部分如下:

o

这会检测第一个句点作为floatdata的一部分,但完全忽略第二个句点并抱怨它期待PERIOD但发现了EOF。请问有什么方法可以解决这个问题。有没有办法向前看,同时跟踪检测到的最后一个令牌?

谢谢!

2 个答案:

答案 0 :(得分:0)

FLOATVALUE可以匹配单个句点,并且会在PERIOD之前列出。因此,词法分析器匹配两个FLOATVALUE串联。

为避免歧义,请将FLOATVALUE更改为:

FLOATVALUE: ([0-9])+('.')([0-9])+
          | ([0-9])+('.')
          | ('.')([0-9])+
          ;

答案 1 :(得分:0)

为避免FLOATVALUEPERIOD匹配,您可以切换词法分析器定义的顺序。

mode SENSORMODE;
PERIOD:'.' ->mode(DEFAULT_MODE)
;
FLOATVALUE: ([0-9])*('.')([0-9])*
;
WS:[ \t]->skip
;
WS2:[\r\n]
;

ANTLR始终返回最长匹配词法分析器规则的令牌类型,如果是相同长度匹配,则返回第一个类型。修改后的语法将PERIOD移动到第一个位置。