由于托架包含在令牌中,ANTLR4给出了不匹配的输入
问题描述:
ANTLR 4.5给了我一个“不匹配的输入”字符串[]'期望'字符串'“,但我不明白为什么'[]'被包含在令牌。由于托架包含在令牌中,ANTLR4给出了不匹配的输入
我已经剥离了语法下降到最低限度,以显示该问题:
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 []'被显示为一个ID令牌而不是3个单独的令牌。
我试着明确地定义'String','['和']'标记,但结果是一样的。
我只是不能解决什么是错的。
答
尝试为每个标记定义词法分析规则。我想知道如何用这个语法生成解析器。 ANTLR通常会发出一条消息,说明它不能从文字中隐式生成词法分析标记。
答
哦,看到你期望在那里的危险。
我改变了所有的令牌,显式的结果相同。
然后我改变了ID词法分析器规则,使用2个片段,一个用于字母,另一个用于数字,它的工作!
我改回原来的规则,它仍然工作。
对此问题中发布的版本进行了非常仔细的检查,结果表明问题出现在ID词法分析器规则的大写范围内。它有A-Z,但应该是A-Z。范围A-z包括\[]^_'
因此存在问题。
唯一让我想到的是,你的词法分析规则是互相争斗的。尝试将它们转换为命名规则,而不仅仅是文字规则,并尝试玩规则的顺序。 – Divisadero