ANTLR4使用隐藏通道会导致错误,而使用skip不会导致错误

ANTLR4使用隐藏通道会导致错误,而使用skip不会导致错误,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,在我的语法中,我使用: WS: [ \t\r\n]+ -> skip; 当我将此更改为使用隐藏通道时: WS: [ \t\r\n]+ -> channel(HIDDEN); 我收到使用“跳过”时未收到的错误(无关输入“”…)。 我认为,对于传递给解析器的内容,跳转和发送到通道并没有什么不同 您可以在下面找到执行解析器的代码摘录: CharStream charStream = new ANTLRInputStream(formulaString); Formula

在我的语法中,我使用:

WS: [ \t\r\n]+ -> skip;
当我将此更改为使用隐藏通道时:

WS: [ \t\r\n]+ -> channel(HIDDEN);
我收到使用“跳过”时未收到的错误(无关输入“”…)。 我认为,对于传递给解析器的内容,跳转和发送到通道并没有什么不同

您可以在下面找到执行解析器的代码摘录:

    CharStream charStream = new ANTLRInputStream(formulaString);
    FormulaLexer lexer = new FormulaLexer(charStream);
    BufferedTokenStream tokens = new BufferedTokenStream(lexer);
    FormulaParser parser = new FormulaParser(tokens);
    ParseTree tree = parser.startRule();

    StartRuleVisitor startRuleVisitor = new StartRuleVisitor();
    startRuleVisitor.visit(tree);

    VariableVisitor variableVisitor = new VariableVisitor(tokens);
    variableVisitor.visit(tree);
语法本身:

grammar Formula;


startRule
   : variable RELATION_OPERATOR integer
   ;

integer
   : DIGIT+
   ;

identifier
   : (LETTER | DIGIT) ( DIGIT | LETTER | '_' | '.')+
   ;

tableId
   : 'T_' (identifier | WILDCARD)
   ;

rowId
   : 'R_' (identifier | WILDCARD)
   ;

columnId
   : 'C_' (identifier | WILDCARD)
   ;

sheetId
   : 'S_' (identifier | WILDCARD)
   ;

variable
   : L_CURLY_BRACKET cellIdComponent (COMMA cellIdComponent)+ R_CURLY_BRACKET
   ;

cellIdComponent
   : tableId | rowId | columnId | sheetId
   ;

COMMA
   : ','
   ;

RELATION_OPERATOR
   : EQ
   ;

WILDCARD
   : 'NNN'
   ;

L_CURLY_BRACKET
   : '{'
   ;

R_CURLY_BRACKET
   : '}'
   ;


LETTER
   : ('a' .. 'z') | ('A' .. 'Z')
   ;

DIGIT
   : ('0' .. '9')
   ;


EQ
   : '='
   | 'EQ' | 'eq'
   ;


WS
   : [ \t\r\n]+ -> channel(HIDDEN)
   ;
我尝试分析的字符串:

{T_C 00.01, R_010,   C_010} = 1
使用通道(隐藏)时获得的输出:

但如果我将频道(隐藏)更改为“跳过”,则不会出现错误

更重要的是,我观察到,对于比这更复杂的语法,如果我使用通道(隐藏),我会得到“在输入时没有可行的替代方案…”,并且“跳过”的错误再次消失


你知道可能是什么原因吗?

你应该使用
CommonTokenStream
而不是
BufferedTokenStream
。请参见
BufferedTokenStream

此令牌流忽略{@link token#getChannel}的值。如果你的 解析器需要令牌流过滤器令牌,以仅过滤特定网络上的令牌 通道,例如{@link Token#DEFAULT_channel}或 {@link-Token#HIDDEN_-CHANNEL},使用过滤令牌流,例如 {@link CommonTokenStream}


请发布执行解析器的代码,问题可能就在那里。如果这还不够,请让我知道:)好吧,代码看起来是正确的。。。¯\_(ツ)_/“‘您使用的是最新版本的ANTLR吗?能否上载语法文件和要分析的文本?@Lucastrezesniewski我使用的是最新的antlr4.6版本。
line 1:4 extraneous input ' ' expecting {'_', '.', LETTER, DIGIT}
line 1:11 extraneous input ' ' expecting {'T_', 'R_', 'C_', 'S_'}
line 1:18 extraneous input '   ' expecting {'T_', 'R_', 'C_', 'S_'}
line 1:27 extraneous input ' ' expecting RELATION_OPERATOR
line 1:29 extraneous input ' ' expecting DIGIT