ANTLR 是等待找到与应该跳过的标记相匹配的最长字符串,还是一旦匹配该标记就跳过它?
假设我们的语法中有两个标记,如下所示:
TEST:
[\n][\t | ' ']'|'
;
WS
: [ \t\r\n]+ -> skip
;
输入是这样的:
|
我期望它与 TEST 令牌匹配,但似乎第一部分与 WS 匹配,然后它被跳过,所以输出显示
token recognition error at: '| '
你能解释一下这一点吗?我应该做什么才能在我的输入中捕获 TEST 令牌?
我认为您的示例中存在一些决定,这些决定必须由语法而不是词法分析器来处理。我建议采用以下方法:
grammar Simple;
// Lexer rules
WS : [ \t]+ -> skip; // Skip general whitespace and tabs
EMPTY_LINE
: NEWLINE -> skip; // Skip empty lines
NEWLINE : '\r'? '\n'; // Newline characters
FOUR_SPACES : ' '; // Four spaces
TAB : '\t'; // Tab character
A_LETTER : 'A'; // The letter A
// Parser rules
file : indentedLine EOF;
indentedLine: (FOUR_SPACES | TAB) A_LETTER NEWLINE;