2013-09-05 62 views
0

我試圖實現解析lucene查詢的語法。到目前爲止,一切都很順利,直到我試圖增加對範圍查詢的支持。 Lucene的細節拋開我的語法如下:Antlr錯誤規則調用

grammar ModifiedParser; 

TERM_RANGE : '[' ('*' | TERM_TEXT) 'TO' ('*' | TERM_TEXT) ']' 
      | '{' ('*' | TERM_TEXT) 'TO' ('*' | TERM_TEXT) '}' 
      ; 

query : not (booleanOperator? not)* ; 

booleanOperator : andClause 
       | orClause 
       ; 

andClause : 'AND' ; 
notClause : 'NOT' ; 
orClause : 'OR' ; 

not : notClause? MODIFIER? clause; 

clause : unqualified       
     | qualified       
     ; 

unqualified : TERM_RANGE     # termRange 
      | TERM_PHRASE     # termPhrase 
      | TERM_PHRASE_ANYTHING   # termTruncatedPhrase 
      | '(' query ')'    # queryUnqualified 
      | TERM_TEXT_TRUNCATED   # termTruncatedText 
      | TERM_NORMAL     # termText 
      ; 

qualified : TERM_NORMAL ':' unqualified     
      ; 

fragment TERM_CHAR : (~(' ' | '\t' | '\n' | '\r' | '\u3000' 
        | '\'' | '\"' | '(' | ')' | '[' | ']' | '{' | '}' 
        | '+' | '-' | '!' | ':' | '~' | '^' 
        | '?' | '*' | '\\')) 
        ; 

fragment TERM_START_CHAR : TERM_CHAR 
         | ESCAPE 
         ; 

fragment ESCAPE : '\\' ~[]; 

MODIFIER : '-' 
     | '+' 
     ; 

AND : 'AND'; 
OR : 'OR'; 
NOT : 'NOT'; 

TERM_PHRASE_ANYTHING : '"' (ESCAPE|~('\"'|'\\'))+ '"' ; 
TERM_PHRASE   : '"' (ESCAPE|~('\"'|'\\'|'?'|'*'))+ '"' ; 
TERM_TEXT_TRUNCATED : ('*'|'?')(TERM_CHAR+ ('*'|'?'))+ TERM_CHAR* 
        | TERM_START_CHAR (TERM_CHAR* ('?'|'*'))+ TERM_CHAR+ 
        | ('?'|'*') TERM_CHAR+ 
        ; 

TERM_NORMAL : TERM_TEXT;            

fragment TERM_TEXT : TERM_START_CHAR TERM_CHAR* ; 

WS : [ \t\r\n] -> skip ; 

當我嘗試做一個訪問者和與令牌顯然解析asd [ 10 TO 100 ] { 1 TO 1000 } 100..1000工作將拋出令牌識別錯誤[]}{,只有嘗試訪問第三範圍內的termRange規則。你們知道我在這裏失蹤了嗎?在此先感謝

+0

你有沒有設法完成它?我需要一個,我想知道你是否願意分享:)謝謝! –

回答

1

既然你做TERM_RANGE一個詞法規則,你必須考慮在人物等級的一切。特別是,您忘記了在輸入中允許輸入空格字符。

你很可能會處於更有利的位置,如果你不是創建termRange,語法分析規則。

+0

這實際上做了詭計。但是我確實把WS lexer規則設置爲忽略,並且它也包含了空格。也許我對解析器和詞法分析器之間共享的規則有點困惑,但我認爲另一個間接層次不會有幫助 –