0

Antlr3を使用して以下に定義された簡単な文法があります。

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

trueと表示された後、NoViableAltExceptionが表示されます

私はtrue、true、true、trueを持っており、true、true、true、true、そしてNoViableAltExceptionを表示します。

私が間違っているところを手伝ってもらえますか?多くの同様の投稿を調べていますが、この問題の解決策を見つけることができません。例外は解釈中にグラフに表示され、コンソールには例外は表示されません。

編集:

ユーザーは単一の値を入力する必要がありますが、毎回コンマで区切られた複数の値をたどることができます。Antlrによると、Antlrでは、オプション(?)、0個以上(*)、または1個以上(+)を定義できます。たった一つというものはありません。したがって、MINIMUMDIGITは1つだけを制御するために使用されます。

例:

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

私が達成しようとしているのは、挿入が実行されるとき、要素は少なくとも1つの値を持つ必要があるか、複数の値を持つ可能性があるということです。上で定義された構文によれば、それはゼロ以上を許可します。

要素を次のように変更するとすぐに:

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

これは動作しません。カンマを入力すると、カンマが表示されます。また、コンマなしの値も受け入れます。カンマが必要です。そのため、MINIMUMDIGITを紹介しました。

4

1 に答える 1

0

Antlrによると、Antlrでは、オプション(?)、0個以上(*)、または1個以上(+)を定義できます。

同意しました。

たった一つというものはありません。

違います。デフォルトでは、参照されるルールは1回だけ一致します。したがって、elementsがとして定義されている場合は、1つだけelements: value;elements一致します。 value

同様に、elementsis elements : (value (',' value)*);(末尾の、、、?または+)がない場合は*、次の各行に一致します。

value
value , value
value , value , value

次の行のいずれにも一致しません。

(empty input)
value value
, value
value , , 

必要なのはただのことだと思いますelements: (value (',' value)*);

于 2012-11-27T16:14:30.517 に答える