1

ブール値または文字列に属する可能性のある値を明確にするのに問題があるという文法があります。

文法には、タイプ String およびタイプ Boolean のいくつかのフィールドがあります。文字列フィールドには、引用符内にほとんど何でも含めることができ、ブール値には「Y」または「N」を含めることができます。問題: String フィールドに "Y" または "N" が含まれることがあります (通常、複数の単一文字値のリストの一部として)。

関連する文法規則は次のとおりです。文字列が「Y」または「N」である限り、述語を使用して、文字列とのブール比較のあいまいさを解消しようとしました。

booleanLogical
: booleanAtom (EQ|NE) booleanAtom
| booleanAtom (EQ|NE) {_input.LT(1).getText().equals("\"Y\"") || _input.LT(1).getText().equals("\"N\"")}? STRING
;

booleanAtom
: BOOLEAN_FIELD
;

stringLogical
: stringAtom (EQ|NE|LT|LE|GT|GE) stringAtom
| STRING_FIELD (EQ|NE|LT|LE|GT|GE) ('"Y"'|'"N"')
;

stringAtom
: STRING_FIELD
| STRING
;

BOOLEAN_FIELD: ("BFIELD1","BFIELD2","BFIELD3");
STRING_FIELD: ("SFIELD1","SFIELD2","SFIELD3");

ブール式を解析しようとしたときのエラー メッセージ:

BFIELD1="Y"

は:

line 1:7: no viable alterative at input 'BFIELD1="Y"'

antlr3 では先読みを使用していましたが、それはもはやオプションではありません。

そこに何か援助はありますか?

4

1 に答える 1

3

ルールでリテラル'"Y"'を使用しているため、入力は ではない特別なトークンを生成しています。パーサーで、、およびその他の文字列を区別しようとするのをやめ、代わりにリスナーを使用して、解析が完了した後に文字列を検証することをお勧めします。stringLogical"Y"STRING"Y""N"

booleanLogical
  : booleanAtom (EQ|NE) booleanAtom
  | booleanAtom (EQ|NE) STRING
  ;

また、ANTLR 4 は決定の左端にある述語のみを評価することに注意することも重要です。元のルールで使用した述語booleanLogicalは決定の左端にないため、評価されることはありません。

于 2013-03-18T17:30:43.663 に答える