2017-08-28 10 views
0

レクサー内の他のトークン間の残りのテキストをすべてどのように一致させることができますか?Antlr:他の認識されたトークン間のすべての一致方法

ここに私のコードです:

grammar UserQuery; 

expr: expr AND expr 
    | expr OR expr 
    | NOT expr 
    | TEXT+ 
    | '(' expr ')' 
    ; 

OR : 'OR'; 
AND : 'AND'; 
NOT : 'NOT'; 
LPAREN : '('; 
RPAREN : ')'; 

TEXT: .+?; 

私は「XXとYY」でレクサーを実行すると、私はこれらのトークンを取得する:

x type:TEXT 
x type:TEXT 
    type:TEXT 
AND type:'AND' 
    type:TEXT 
y type:TEXT 
y type:TEXT 

このソートの作品、私はドンことを除いて」各文字をトークンにします。残ったテキストのすべてを単一のTEXTトークンに統合したいと思います。

答えて

1

私はそう貪欲、区切り文字なしでこれが可能であるとは思わない(?)レクサー・トークンは、最長一致がレクサーのトークンで勝利することを原則に、あなたの明示的なトークンを含め、すべてあなたの入力にマッチします。から

[@0,0:14=''longest token'',<TEXT>,1:0] 
[@1,16:18='AND',<'AND'>,1:16] 
[@2,20:23=''yy'',<TEXT>,1:20] 
[@3,24:23='<EOF>',<EOF>,1:24] 

:あなたは区切り文字がテキストとの間にスペースを処理するための簡単な空白のルールの追加を描写するために必要であることを受け入れることができるかどうか

さて、あなたはこのような何かを得ますこの文法:この入力を使用して

grammar UserQuery; 

expr: expr AND expr 
    | expr OR expr 
    | NOT expr 
    | TEXT 
    | '(' expr ')' 
    ; 

OR : 'OR'; 
AND : 'AND'; 
NOT : 'NOT'; 
LPAREN : '('; 
RPAREN : ')'; 

TEXT : '\'' .*? '\''; 
WS: [ \t\r\n] -> skip; 

'longest token' AND 'yy' 

それは非常に似ていますコメントと文字列はプログラミング言語で処理されることが多く、開始と終了の区切り文字があり、その間のすべてが1つの大きなトークンとしてトークン化されます。私たちはコメントをしばしば破棄しますが、ここでは文字列のままにしておきます。お役に立てれば。

+0

お手数ですが、ありがとうございます。しかし、私はクエリ言語を変更する必要があります。それをやろうとしない。 – ccleve

関連する問題