5

ちょっとしたクエリ言語の ANTLR 文法を書こうとしています。クエリは、特定のフィールドに限定された検索用語のリストです。

フィールド 1:a フィールド 2:b フィールド 3:c

これは、field1 が a に一致し、field2 が b に一致するなどのエンティティのリストを返すことになっています。クエリは完全に無制限にすることもできます:

abc

これは、abc に一致する任意のフィールドを持つエンティティを返すことになっています。ANTLR 文法は次のとおりです。

@members {
  String unrestrictedQuery;
}

FIELD1_OPERATOR: 'field1:';
FIELD2_OPERATOR: 'field2:';
FIELD3_OPERATOR: 'field3:';
DIGIT: '0'..'9';
LETTER: 'A'..'Z' | 'a'..'z';

query: subquery (' ' subquery)*
  | UNRESTRICTED_QUERY=.* {unrestrictedQuery = $UNRESTRICTED_QUERY.text;}
  ;

制限のないクエリを、クエリ ルールの最初の選択肢に一致しない任意のテキストにしたい。

1) 2 番目の選択肢が一致したテキストを取得するより良い方法はありますか?

2) これを Web サーバーにプラグインすると、unrestrictedQuery パーサー フィールドがクエリの最後の文字に解決されます。文字列全体が本当に必要なときに、クエリのすべての文字に対してアクションが呼び出されるようです。

読んでくれてありがとう!

4

1 に答える 1

1

「無制限のクエリを、クエリ ルールの最初の選択肢に一致しない任意のテキストにしたい」. これは悪い設計上の決定です。将来、Field4 を追加したい場合はどうしますか? その後、非互換が発生します。制限のないクエリが簡単に認識されるように、文法を変更することをお勧めします。フィールド値 (a、b、c) を引用符で囲むか、無制限のクエリをコロンで開始します。

field1:a :abc field2:b
于 2012-11-09T05:55:11.530 に答える