2017-08-28 119 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' 

這是非常相似的評論和字符串通常以編程語言進行處理,其中有一個起始和結束分隔符,並且其中的所有內容都被標記爲一個大標記。通常我們會拋棄它們的評論,但在這裏我們保留它們,就像我們將一個字符串一樣。希望這可以幫助。

+0

它確實有幫助,謝謝。不過,這會迫使我改變我的查詢語言。試圖不這樣做。 – ccleve

相關問題