-1

数週間の休憩の後、再び ANTLR と戦う時が来ました...

とにかく、次のレクサー トークンを定義しています。

fragment EQ: '=';
fragment NE: '<>';

BOOLEAN_FIELD
  : ('ISTRAINED'|'ISCITIZEN')
  ;

BOOLEAN_CONSTANT
  : ('TRUE'|'FALSE'|'Y'|'N')
  ;

BOOLEAN_LOGICAL
  : BOOLEAN_FIELD (EQ|NE) (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
  ;

残念ながら、BOOLEAN_LOGICAL トークンは、「ISTRAINED = ISTRAINED」などの単純な条件で NoViableAltException をスローしています。

「これはパーサーにあるはずです」という応答がいくつかあることは知っています。以前はパーサーにありましたが、「はい/いいえ、このテキストブロックは有効ですか?」という質問だけが必要なため、いくつかの単純な項目をレクサーにオフロードしようとしています。

どんな助けでも大歓迎です。

4

2 に答える 2

2

BOOLEAN_LOGICALレクサー規則であってはなりません。レクサー ルールは、単一のトークンである必要があります (またはする必要があります)。字句解析規則として、 と の間BOOLEAN_FIELDにスペースを入れることはできません (字句解析中にスペースをスキップした可能性がありますが、これはパーサー規則(EQ|NE)内からスペースがスキップされるだけです!)。

代わりにこれを行います:

boolean_logical
  : BOOLEAN_FIELD (EQ|NE) (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
  ;

これはまた、もはやルールEQNEはないことを意味します:fragment

EQ : '=';
NE : '<>';
于 2013-02-28T14:08:57.053 に答える
1

これは、パーサールールである必要があるように見えます。ただし、レクサールールとして保持する場合は、空白を許可する必要があります。

BOOLEAN_LOGICAL
  : BOOLEAN_FIELD WS+ (EQ|NE) WS+ (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
    ;
于 2013-02-28T15:27:47.283 に答える