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