Antlr4:使用双点解析点尾浮点

时间:2019-01-21 09:25:57

标签: antlr4

我正在尝试使用点尾浮点数和双点测距数组来解析句子,但是无法实现。

这是我的语法文件

<partial name="_LoginPartial" 
           model='new LoginViewModel { InputModel = new InputModel() }' />

and(名为grammar foo; Digits : [0-9]+ ; Real : Digits* '.' Digits+ | Digits+ '.' Digits* ; Range : '..' ; Whitespace : [ \t]+ -> skip ; Newline : ( '\r' '\n'? | '\n' ) -> skip ; range : Digits Range Digits ; 的文件)

代码1:

foo.c

代码2:

1..2

我使用以下代码进行编译和测试:

1 ..2

代码1将出现错误:

antlr4 foo.g4
javac foo*.java
grun foo range -gui foo.c

但是我可以使用代码2来实现。

添加额外的空间使其正确,但是我希望有一种语法可以解析代码1而无需额外的空间。

1 个答案:

答案 0 :(得分:1)

这就是ANTLR的词法分析器的工作方式:它尝试匹配尽可能多的字符。因此,输入1..2产生2个Real令牌1..2,而不是3个令牌DigitsRangeDigits

要创建3个令牌,您必须添加a predicate in your lexer grammar。尝试这样的事情:

FLOAT
 : [0-9]+ '.' {_input.LA(1) != '.'}?
 | [0-9]* '.' [0-9]+
 ;

INT
 : [0-9]+
 ;

RANGE
 : '..'
 ;

SPACE
 : [ \t\r\n] -> skip
 ;

如果我根据以上规则创建一个词法分析器,并将其输入"1 2. .34 56..7 8.99999"作为输入,则会得到以下标记:

INT        '1'
FLOAT      '2.'
FLOAT      '.34'
INT        '56'
RANGE      '..'
INT        '7'
FLOAT      '8.99999'