2012-11-09 11 views
5

私は少しのクエリ言語のためにANTLR文法を書こうとしています。その上、B、およびFIELD2一致し、私の開始ルールのためのキャッチオール2番目の代替

Cフィールド1が一致するエンティティのリストを返すことになっています:

フィールド1:フィールド2:Bのフィールド3クエリは、特定の分野に限定した検索用語のリストです。クエリはまた、完全に無制限にすることができます: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パーサーフィールドがクエリの最後の文字に解決されます。私は実際に文字列全体が必要なときに、クエリのすべての文字に対してアクションが呼び出されるようです。読書のための

ありがとう!

+1

'*' 'UNRESTRICTED_QUERYに= *'トークンの任意の量に一致します。。。それは文字の任意の量に一致*しません!大きな違い。 –

+0

あなたは絶対に正しいです。ありがとうございました。 –

答えて

1

"無制限のクエリをクエリルールの最初の選択肢と一致しないテキストにする" これは設計上の誤った判断です。将来、Field4を追加したい場合はどうなりますか?その後、非互換性が発生します。無制限のクエリが容易に認識されるように、文法をよりよく変更します。サラウンドフィールドの値(a、b、c)は引用符で、または結腸で無制限のクエリを開始:

field1:a :abc field2:b 
関連する問題