Antlr4 ANTLR将可选标记优先于非可选标记

Antlr4 ANTLR将可选标记优先于非可选标记,antlr4,Antlr4,标题很难解释,但问题是: 我想用ANTLR4解析一个方程 我当前对数字的定义: NUMBER: SUBTRACTION? DIGIT+ ([.,] DIGIT+)? ; 其中数字和减法分别为数字和“-”。 我的减法分析器规则: subtraction: value? SUBTRACTION (value|operation)?; 其思想是解析器仍然可以处理缺少的值。 假设我有这个输入 1-2 问题在于这个输入,ANTLR说1是一个数字,-2是一个数字。ANTLR不会将其分组为减法,如1减法

标题很难解释,但问题是: 我想用ANTLR4解析一个方程

我当前对数字的定义:

NUMBER: SUBTRACTION? DIGIT+ ([.,] DIGIT+)? ;
其中数字和减法分别为数字和“-”。 我的减法分析器规则:

subtraction: value? SUBTRACTION (value|operation)?;
其思想是解析器仍然可以处理缺少的值。 假设我有这个输入

1-2
问题在于这个输入,ANTLR说1是一个数字,-2是一个数字。ANTLR不会将其分组为减法,如1减法2


如何才能获得正确的分组?

当您定义如下规则时:

SUBTRACTION : '-';
NUMBER      : SUBTRACTION? DIGIT+ ([.,] DIGIT+)? ;
-2
这样的输入将始终是单个
数字
标记:它永远不会被标记为单独的
减法
数字
标记。ANTLR总是尝试匹配尽可能多的字符

您不应该将
-
粘贴到lexer中的
数字
,而应该在解析器中这样做,如
减法表达式

expr
 : SUBTRACTION expr
 | expr SUBTRACTION expr
 | NUMBER
 ;

SUBTRACTION : '-';
NUMBER      : DIGIT+ ([.,] DIGIT+)? ;

fragment DIGIT : [0-9];
这将正确解析
1-2
-2

好主意!我有一个“值”解析器规则,它接受数字,所以我把减法放在那里,它就像一个符咒。