我在下面使用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的原因。
答案 0 :(得分:0)
根据Antlr,Antlr允许您定义可选(?),零或更多(*)或一个或多个(+)。
同意。
没有只有一个这样的东西。
不正确。默认情况下,引用的规则 仅匹配一次。因此,如果将elements
定义为elements: value;
,则elements
匹配一个且只有一个 value
。
同样,如果elements
为elements : (value (',' value)*);
(没有尾随?
,+
或*
),则会匹配以下每一行:< / p>
value
value , value
value , value , value
它不会匹配以下任何一行:
(empty input)
value value
, value
value , ,
我认为你需要的只是elements: (value (',' value)*);
。