lexer从上到下匹配规则。当两个(或多个)规则匹配相同数量的字符时,首先定义的规则将获胜。这就是为什么一个数字被匹配为
我正在尝试解析int,但我只能解析多位数的int,而不能解析单位数的int。
我把它缩小到一个非常小的lexer和解析器,它是我基于antlr.org中的示例语法的,如下所示:
# IntLexerTest.g4
lexer grammar IntLexerTest;
DIGIT
: '0' .. '9'
;
INT
: DIGIT+
;
#IntParserTest.g4
parser grammar IntParserTest;
options {
tokenVocab = IntLexerTest;
}
mything
: INT
;
当我试图单独解析数字3时,我得到了"行1:0不匹配的输入'3',期望INT"。另一方面,如果我试图解析33,那也没关系。我做错了什么?
DIGIT
并且两个或更多个数字被作为INT
。
你应该做的是把DIGIT
变成fragment
。片段只被其他lexer规则使用,永远不会成为它们自己的令牌:
fragment DIGIT
: '0' .. '9'
;
INT
: DIGIT+
;