2010-08-20 20 views
2

我正在創建一個簡單的布爾查詢解析器。我想在下面做這樣的事情。布爾查詢解析器中的'令牌衝突'

 
grammar BooleanQuery; 

options 
{ 
    language = Java; 
    output = AST; 
} 

LPAREN : ('(') ; 
RPAREN : (')'); 
QUOTE : ('"'); 
AND : ('AND' | '&' | 'EN' | '+') ; 
OR : ('OR' | '|' | 'OF'); 
WS : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ; 
WORD : (~(' ' | '\t' | '\r' | '\n' | '(' | ')' | '"'))*; 
MINUS : '-'; 
PLUS : '+'; 


expr : andexpr; 
andexpr : orexpr (AND^ orexpr)*; 
orexpr : part (OR^ part)*; 
phrase : QUOTE (options {greedy=false;} : .)* QUOTE; 
requiredexpr : PLUS atom; 
excludedexpr : MINUS atom; 
part : excludedexpr | requiredexpr | atom; 
atom : phrase | WORD | LPAREN! expr RPAREN!; 

問題是MINUS和PLUS標記與AND和OR標記中的MINUS和PLUS標記發生'碰撞'。對不起,如果我不使用正確的術語。我是ANTLR的新手。

下面的示例查詢:

foo OR (pow AND -"bar with cream" AND -bar)

我都做什麼錯誤?

回答

2

令牌必須是唯一的。但是,您可以在您的語法中爲多種目的使用相同的標記(如Java中的一元和二元減號)。

我不知道你的環境的確切語法,但類似更改以下兩個子句

AND : ('AND' | '&' | 'EN') ; 

andexpr : orexpr ((AND^ | PLUS^) orexpr)*; 

可能會解決這個問題。

+0

你能給我更多具體的指針如何解決這個問題嗎?我不知道我應該從文檔中開始尋找什麼詞組/概念。 – 2010-08-20 14:24:54

+0

我編輯了我的答案,並添加了一個示例,我將如何更改您的定義。 – Frank 2010-08-20 14:32:17

+0

謝謝你的幫助! – 2010-08-20 14:39:17