-1

我有一个使用 Antlr 3 的简单语法:

grammar i;

@header {
package com.data;
}

null        : 'null';
value       : null | STRING;
elements    : value? | (value ',' value)+;
STRING      : ('a'..'z'|'A'..'Z')+;
WS      : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords

我想要实现的是我有一个价值。因此,一个值可以是可选的,也可以是一个逗号后跟另一个值的值。例如:

value 可以是 true,或者 value 可以是 true,true,true,true。

当我进行解释时,以下工作:

真的

或真,真

当我尝试 true、true、true 时,树显示为 true、true,但显示 NoViableAltException。

我也试过:

elements: value? | (value ',' value)*;

但这也不起作用。

有什么想法我哪里出错了吗?

编辑:

insert      : 'INSERT INTO TABLE' 'VALUES' '('elements')'';';
4

1 回答 1

1

编写规则时,elements它只派生零或一个值,或任何数量的以逗号分隔的对,对之间没有逗号。

显然你想要的是这样的:

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

This allows for nothing at all (due to the ? operator), or a single value followed by zero or more (*) occurrences of a comma and a value.

于 2012-11-23T10:54:22.357 回答