解释期间Antlr NoViableAltException

时间:2012-11-26 10:44:18

标签: java antlr

我在下面使用Antlr 3定义了一个简单的语法:

grammar i;

@header {
package com.data;
}

null        : 'null';
true        : 'true';
false       : 'false';
value       : true | false | null | STRING | INTEGER | FLOAT;
elements    : (value (',' value)*)MINIMUMDIGIT;
STRING  : ('a'..'z'|'A'..'Z')+;
MINIMUMDIGIT    : ('0'..'9');
INTEGER : '0'..'9'+;
FLOAT       : INTEGER'.'INTEGER;
WS      : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords

当我尝试对ANTLRWorks中的元素进行解释时,元素显示正确。但是,我也是一个NoViableAltException。

我试过了:

显示true,然后显示NoViableAltException

我有真,真,真,真,它显示真,真,真,真,然后是NoViableAltException。

你能在我出错的地方帮忙吗?看着很多类似的帖子,却无法找到解决这个问题的方法。解释期间图表中显示异常,控制台上未显示异常。

编辑:

用户必须输入单个值,但每次都可以使用逗号分隔多个值。根据Antlr,Antlr允许您定义可选(?),零或更多(*)或一个或多个(+)。没有只有一个这样的东西。因此MINIMUMDIGIT用于控制唯一的一个。

示例:

insert      : 'INSERT INTO table' 'VALUES' '('elements')'';';

我想要实现的是当执行插入时,元素必须至少具有一个值,否则它可能具有多个值。根据上面定义的语法,它允许零或更多。

我将元素更改为:

elements : (value (',' value)*)+;

这不起作用。当我输入逗号时,会显示逗号。它还接受没有逗号的值。逗号是必要的。这就是我推出MINIMUMDIGIT的原因。

1 个答案:

答案 0 :(得分:0)

  

根据Antlr,Antlr允许您定义可选(?),零或更多(*)或一个或多个(+)。

同意。

  

没有只有一个这样的东西。

不正确。默认情况下,引用的规则 仅匹配一次。因此,如果将elements定义为elements: value;,则elements匹配一个且只有一个 value

同样,如果elementselements : (value (',' value)*);(没有尾随?+*),则会匹配以下每一行:< / p>

value
value , value
value , value , value

它不会匹配以下任何一行:

(empty input)
value value
, value
value , , 

我认为你需要的只是elements: (value (',' value)*);