无法用antlr解析整数
unable to parse ints with antlr
我正在尝试解析整数,但我只能解析多位整数,不能解析一位整数。
我根据 antlr.org 中的示例语法将其缩小为一个非常小的词法分析器和解析器,如下所示:
# IntLexerTest.g4
lexer grammar IntLexerTest;
DIGIT
: '0' .. '9'
;
INT
: DIGIT+
;
#IntParserTest.g4
parser grammar IntParserTest;
options {
tokenVocab = IntLexerTest;
}
mything
: INT
;
当我尝试单独解析数字 3 时,我得到 "line 1:0 mismatched input '3' expecting INT"。另一方面,如果我尝试解析 33,没问题。我做错了什么?
词法分析器从上到下匹配规则。当 2 个(或更多)规则匹配相同数量的字符时,首先定义的规则将获胜。这就是为什么将单个数字匹配为 DIGIT
而将两个或更多数字匹配为 INT
.
的原因
你应该做的是让DIGIT
变成fragment
。片段仅供其他词法分析器规则使用,永远不会成为它们自己的标记:
fragment DIGIT
: '0' .. '9'
;
INT
: DIGIT+
;
我正在尝试解析整数,但我只能解析多位整数,不能解析一位整数。
我根据 antlr.org 中的示例语法将其缩小为一个非常小的词法分析器和解析器,如下所示:
# IntLexerTest.g4
lexer grammar IntLexerTest;
DIGIT
: '0' .. '9'
;
INT
: DIGIT+
;
#IntParserTest.g4
parser grammar IntParserTest;
options {
tokenVocab = IntLexerTest;
}
mything
: INT
;
当我尝试单独解析数字 3 时,我得到 "line 1:0 mismatched input '3' expecting INT"。另一方面,如果我尝试解析 33,没问题。我做错了什么?
词法分析器从上到下匹配规则。当 2 个(或更多)规则匹配相同数量的字符时,首先定义的规则将获胜。这就是为什么将单个数字匹配为 DIGIT
而将两个或更多数字匹配为 INT
.
你应该做的是让DIGIT
变成fragment
。片段仅供其他词法分析器规则使用,永远不会成为它们自己的标记:
fragment DIGIT
: '0' .. '9'
;
INT
: DIGIT+
;