2016-03-28 7 views
2

私はANTLR4文法を定義しています。二重引用符の内側に表示されたときと二重引用符の外に出現するときとで、すべてではなく、あるものを別々にトークン化したいと思います。ここで私がこれまで持っている文法だ:ANTLR4 - 引用符の中で別々にトークン化するには?

grammar SimpleGrammar; 

AND: '&'; 
TERM: TERM_CHAR+; 
PHRASE_TERM: (TERM_CHAR | '%' | '&' | ':' | '$')+; 
TRUNCATION: TERM '!'; 
WS: WS_CHAR+ -> skip; 

fragment TERM_CHAR: 'a' .. 'z' | 'A' .. 'Z'; 
fragment WS_CHAR: [ \t\r\n]; 

// Parser rules 
expr: 
    expr AND expr 
    | '"' phrase '"' 
    | TERM 
    | TRUNCATION 
    ; 

phrase: 
    (TERM | PHRASE_TERM | TRUNCATION)+ 
    ; 

a! & bを解析する際に上記の文法が正しくに解析した、作品:私は"a! & b"を解析しようとしたときしかし、私が手

AND 
/\ 
/ \ 
a! b 

行1:4の無関係な入力 '&' {{""、TERM、PHRASE_TERM、TRUNCATION}

&ANDとトークン化されているため、エラーメッセージが意味を持ちます。しかし、私がしたいのは、&が二重引用符( "フレーズ"の内側)の中に現れたときにPHRASE_TERMとしてトークン化されます。注:フレーズ内に表示されている場合でも、a!TRUNCATIONとしてトークン化します。

これは可能ですか?

答えて

2

レクサーモードを使用すると可能です。特定のトークンの発生後にモードを変更することは可能です。しかし、レクサーのルールは、文法を組み合わせるのではなく、個別に定義する必要があります。

あなたのケースでは、見積もりが発生した後、あなたはモードを変更し、別の見積もりに遭遇した後、モードをデフォルトのものに戻します。詳しくはGoogleのANTLRレクサーモード」

については

LBRACK : '[' -> pushMode(CharSet); 
RBRACK : ']' -> popMode; 

関連する問題