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