だから私はブール値のプロパティで有効/無効になるようにトークンが定義された字句解析器を持っています
入力ストリームを作成し、テキストを解析します。私のトークンが呼び出されPHRASE_TEXT
、このパターン内にあるものと一致する必要があります'"' ('\\' ~[] |~('\"'|'\\')) '"' {phraseEnabled}?
トークン化"foo bar"
すると、予想どおり、単一のトークンが得られます。プロパティをfalse
lexer に設定setInputStream
し、同じテキストで呼び出した後"foo , bar"
、1 つではなく 2 つのトークンが取得されます。これも予期される動作です。
プロパティをtrue
再度設定すると問題が発生します。同じテキストが 1 つのトークン全体にトークン化されることを期待します"foo bar"
が、代わりに前の 2 つのトークンにトークン化されます。これは私の側のバグですか?ここで何が間違っていますか?トークナイザーの新しいインスタンスを使用して同じインスタンスを再利用しようとしましたが、どちらの方法でも機能しないようです。前もって感謝します。
編集:私の文法の一部は以下のとおりです
grammar LuceneQueryParser;
@header{package com.amazon.platformsearch.solr.queryparser.psclassicqueryparser;}
@lexer::members {
public boolean phrases = true;
}
@parser::members {
public boolean phraseQueries = true;
}
mainQ : LPAREN query RPAREN
| query
;
query : not ((AND|OR)? not)* ;
andClause : AND ;
orClause : OR ;
not : NOT? modifier? clause;
clause : qualified
| unqualified
;
unqualified : LBRACK range_in LBRACK
| LCURL range_out RCURL
| truncated
| {phraseQueries}? quoted
| LPAREN query RPAREN
| normal
;
truncated : TERM_TEXT_TRUNCATED;
range_in : (TERM_TEXT|STAR) TO (TERM_TEXT|STAR);
range_out : (TERM_TEXT|STAR) TO (TERM_TEXT|STAR);
qualified : TERM_TEXT COLON unqualified ;
normal : TERM_TEXT;
quoted : PHRASE_TEXT;
modifier : PLUS
| MINUS
;
PHRASE_TEXT : '"' (ESCAPE|~('\"'|'\\'))+ '"' {phrases}?;
TERM_TEXT : (TERM_CHAR|ESCAPE)+;
TERM_CHAR : ~(' ' | '\t' | '\n' | '\r' | '\u3000'
| '\\' | '\'' | '(' | ')' | '[' | ']' | '{' | '}'
| '+' | '-' | '!' | ':' | '~' | '^'
| '*' | '|' | '&' | '?' );
ESCAPE : '\\' ~[];
問題は、フレーズを false に設定してから再度 true に設定した後、トークンが PHRASE_TEXT として認識されないように見えることです。ガイドラインとして、文法を明確に定義する必要があることはわかっていますが、基本的には、状況に応じて、2 つの異なるモードで引用符を使用して文字列をトークン化する必要があります。