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を紹介しました。