ANTLR4由于括号包含在令牌中而提供不匹配的输入
ANTLR 4.5给了我一个“不匹配的输入”字符串[]“预期为”字符串“,但我不明白为什么标记中包含“[]” 我已将语法精简到最低限度,以说明问题:ANTLR4由于括号包含在令牌中而提供不匹配的输入,antlr4,lexer,Antlr4,Lexer,ANTLR 4.5给了我一个“不匹配的输入”字符串[]“预期为”字符串“,但我不明白为什么标记中包含“[]” 我已将语法精简到最低限度,以说明问题: grammar Test; @header { package parser; } mainClass : 'class' ID '{' 'void' 'main' '(' 'String' '[' ']' ID ')' '}' ; ID : [a-zA-Z] [a-zA-z0-9]* ; WS : [ \t\f\r\n]+ ->
grammar Test;
@header
{
package parser;
}
mainClass : 'class' ID '{' 'void' 'main' '(' 'String' '[' ']' ID ')' '}' ;
ID : [a-zA-Z] [a-zA-z0-9]* ;
WS : [ \t\f\r\n]+ -> channel(HIDDEN);
输入为:
class A
{
void main(String[] args)
}
如果我使用“String[]”,则成功解析输入
如果我从解析树打印出标记,那么它们看起来都和我期望的一样,除了“String[]”显示为一个ID标记而不是3个单独的标记
我尝试过显式定义'String'、'['和']'标记,但结果是一样的
我就是想不出哪里出了问题。试着为每个令牌定义lexer规则。我想知道如何用这种语法生成解析器。ANTLR通常会发出一条消息,说明它无法从文本隐式生成lexer标记。哦,看到您期望的内容是很危险的 我将所有标记都更改为显式,结果相同 然后我改变了ID lexer规则,使用了两个片段,一个用于字母,一个用于数字,它成功了 我改回原来的规则,它仍然有效
对这个问题中发布的版本进行了非常仔细的检查,发现问题在ID lexer规则的大写范围内。它有A-z,但应该是A-z。A-z的范围包括
\[]^
,因此出现了问题。我唯一想到的是,你的lexer规则正在相互冲突。尝试将它们转换为命名规则,而不仅仅是文字规则,并尝试按照规则的顺序进行操作。