-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 の場合もあれば、true、true、true、true の場合もあります。

解釈を行うと、次のように機能します。

真実

または真、真

true、true、true を試すと、ツリーは true、true で表示されますが、NoViableAltException が表示されます。

私も試しました:

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

しかし、これもうまくいきません。

私が間違っているアイデアはありますか?

編集:

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

1 に答える 1

1

ルールは、elements0個または1個の値、またはコンマで区切られた任意の数のペアのみを取得し、ペア間にコンマがないように記述されています。

どうやらあなたが欲しいのはこれです:

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

これにより、(演算子のために)何も許可されないか、単一の値の後にコンマと?値が0回以上( )出現することが許可されます。*

于 2012-11-23T10:54:22.357 に答える