ブール値または文字列に属する可能性のある値を明確にするのに問題があるという文法があります。
文法には、タイプ 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 では先読みを使用していましたが、それはもはやオプションではありません。
そこに何か援助はありますか?