2016-03-28 65 views
0

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','['和']'标记,但结果是一样的。

我只是不能解决什么是错的。

+0

唯一让我想到的是,你的词法分析规则是互相争斗的。尝试将它们转换为命名规则,而不仅仅是文字规则,并尝试玩规则的顺序。 – Divisadero

回答

0

尝试为每个标记定义词法分析规则。我想知道如何用这个语法生成解析器。 ANTLR通常会发出一条消息,说明它不能从文字中隐式生成词法分析标记。

0

哦,看到你期望在那里的危险。

我改变了所有的令牌,显式的结果相同。

然后我改变了ID词法分析器规则,使用2个片段,一个用于字母,另一个用于数字,它的工作!

我改回原来的规则,它仍然工作。

对此问题中发布的版本进行了非常仔细的检查,结果表明问题出现在ID词法分析器规则的大写范围内。它有A-Z,但应该是A-Z。范围A-z包括\[]^_'因此存在问题。