1

孤独な単語と引用符で囲まれた文字列をトークン化するレクサーを構築しようとしています。私は以下を得ました:

STRING:    QUOTE (options {greedy=false;} : . )* QUOTE ;
WS    :    SPACE+ { $channel = HIDDEN; } ;
WORD  :    ~(QUOTE|SPACE)+ ;

まれなケースでは、次を解析する必要があります。

"string" word1" word2

3 つのトークン"string"として: STRING およびword1"WORDword2として。基本的に、最後の引用符がある場合、それは WORD の一部である必要があります。引用符が空白で囲まれている場合は、WORD である必要があります。

WORD に対してこのルールを試しましたが、成功しませんでした。

WORD:    ~(QUOTE|SPACE)+
    |    (~(QUOTE|SPACE)* QUOTE ~QUOTE*)=> ~(QUOTE|SPACE)* QUOTE ~(QUOTE|SPACE)* ; 
4

1 に答える 1

3

私は最終的に、Java コードを書かなくてもこのトリックを実行できるものを見つけました。

    fragment QUOTE
            :   '"' ;
    fragment SPACE
            :   (' '|'\r'|'\t'|'\u000C'|'\n') ;

    WS      :   SPACE+ {$channel=HIDDEN;};
    PHRASE  :   QUOTE (options {greedy=false;} : . )* QUOTE ;
    WORD    :   (~(QUOTE|SPACE)* QUOTE ~QUOTE* EOF)=> ~(QUOTE|SPACE)* QUOTE ~(SPACE)*
            |   ~(QUOTE|SPACE)+ ;

そうすれば、述語は両方を区別/解決します。

    PHRASE  :   QUOTE (options {greedy=false;} : . )* QUOTE ;

            |   ~(QUOTE|SPACE)+ ;
于 2010-05-25T17:06:28.917 に答える