0

だから私はブール値のプロパティで有効/無効になるようにトークンが定義された字句解析器を持っています

入力ストリームを作成し、テキストを解析します。私のトークンが呼び出されPHRASE_TEXT、このパターン内にあるものと一致する必要があります'"' ('\\' ~[] |~('\"'|'\\')) '"' {phraseEnabled}?

トークン化"foo bar" すると、予想どおり、単一のトークンが得られます。プロパティをfalselexer に設定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 つの異なるモードで引用符を使用して文字列をトークン化する必要があります。

4

1 に答える 1

0

私の同僚が親切に指摘してくれた回答でこれを更新する必要があります。レクサー生成クラスには、クラスのすべてのインスタンス間で共有される静的 DFA[] 配列があります。プロパティがデフォルトの true ではなく false に設定されると、ディシジョン ツリーは明らかにすべてのオブジェクト インスタンスに対して変更されました。これを修正するには、変更中のプロパティの true インスタンスと false インスタンスの両方に対して DFA[] 配列を分離する必要がありました。その配列を静的にしないとコストがかかりすぎると思います。別の修正については本当に考えられません。

于 2013-09-17T14:56:51.730 に答える