ANTLR4由于括号被包含在令牌

时间:2016-03-28 09:13:58

标签: antlr4 lexer

ANTLR 4.5给我一个“不匹配的输入'String []'期待'String'”但我不明白为什么'[]'被包含在令牌中。

我已将语法剥离到最低限度以显示问题:

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

我无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:0)

尝试为每个令牌定义词法分析器规则。我想知道如何用这个语法生成你的解析器。 ANTLR通常会发出一条消息,指出它无法从文字中隐式生成词法分析器。

答案 1 :(得分:0)

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

我使用相同的结果更改了所有令牌。

然后我更改了ID lexer规则以使用2个片段,一个用于字母,一个用于数字,并且它有效!

我改回原来的规则,它仍然有效。

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