何时应用ANTLR跳过?

问题描述 投票:0回答:1

ANTLR 是等待找到与应该跳过的标记相匹配的最长字符串,还是一旦匹配该标记就跳过它?

假设我们的语法中有两个标记,如下所示:

TEST:
    [\n][\t | '    ']'|'
    ;
WS
    : [ \t\r\n]+ -> skip
    ;

输入是这样的:


    |

我期望它与 TEST 令牌匹配,但似乎第一部分与 WS 匹配,然后它被跳过,所以输出显示

token recognition error at: '| '

你能解释一下这一点吗?我应该做什么才能在我的输入中捕获 TEST 令牌?

java compiler-construction antlr antlr4 lexer
1个回答
0
投票

我认为您的示例中存在一些决定,这些决定必须由语法而不是词法分析器来处理。我建议采用以下方法:

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;
© www.soinside.com 2019 - 2024. All rights reserved.