2013-09-16 37 views
0

所以我有一個詞法分析器與定義,以便在布爾屬性已啓用/禁用ANTLR詞法分析器禁用標記後重新啓用它們無法正常運行

我創建一個輸入流並解析文本的令牌。我的令牌被稱爲PHRASE_TEXT,並且應該匹配此模式下的任何內容'"' ('\\' ~[] |~('\"'|'\\')) '"' {phraseEnabled}?

我將令牌標記爲"foo bar",並按預期收到單個令牌。在詞法分析器上將該屬性設置爲false並使用相同的文本呼叫setInputStream,我得到"foo , bar",因此得到2個令牌而不是一個。這也是預期的行爲。

將該屬性再次設置爲true時出現問題。我期望相同的文本標記爲整個1個標記"foo bar",而是標記爲之前的2個標記。這是我的錯誤嗎?我在這裏做錯了什麼?我嘗試使用tokenizer的新實例並重用相同的實例,但它似乎並沒有工作。提前致謝。

編輯:我的語法部分遵循以下

grammar LuceneQueryParser; 

@header{package com.amazon.platformsearch.solr.queryparser.psclassicqueryparser;} 

@lexer::members { 
    public boolean phrases = true; 
} 

@parser::members { 
    public boolean phraseQueries = true; 
} 

mainQ : LPAREN query RPAREN 
     | query 
     ; 

query : not ((AND|OR)? not)* ; 

andClause : AND ; 
orClause : OR ; 

not : NOT? modifier? clause; 

clause : qualified       
     | unqualified       
     ; 

unqualified : LBRACK range_in LBRACK 
      | LCURL range_out RCURL 
      | truncated 
      | {phraseQueries}? quoted 
      | LPAREN query RPAREN 
      | normal 
      ; 

truncated : TERM_TEXT_TRUNCATED; 
range_in : (TERM_TEXT|STAR) TO (TERM_TEXT|STAR); 
range_out : (TERM_TEXT|STAR) TO (TERM_TEXT|STAR); 

qualified : TERM_TEXT COLON unqualified ; 

normal : TERM_TEXT; 
quoted : PHRASE_TEXT; 

modifier : PLUS 
     | MINUS 
     ; 

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


ESCAPE : '\\' ~[]; 

的問題似乎是,之後,我再次設置短語假,然後爲真,沒有更多標記似乎被認爲是PHRASE_TEXT。我知道作爲一個指導原則,我應該定義我的語法是明確的,但這基本上是它最終要看的方式:根據具體情況用2種不同模式標記字符串。

+0

我需要看到更多的語法和調用代碼才能回答這個問題。 –

+0

您可能想要查看ANTLR4對[詞彙模式](http://www.antlr.org/wiki/display/ANTLR4/Lexer+Rules)的支持,並嘗試從您的代碼中觸發該切換機制。我相信該功能旨在支持諸如將HTML嵌入到HTML中的情況。 – Darien

回答

0

我將不得不更新與我的一位同事有幫助指出的答案。詞法分析器生成的類在該類的所有實例之間共享一個靜態DFA []數組。一旦屬性設置爲false而不是默認爲true,那麼決策樹顯然會針對所有對象實例進行更改。對此的修復是必須爲我正在修改的屬性的true和false實例分開DFA []數組。我認爲讓該陣列不是靜態的會太昂貴,我真的不能想到另一個修復。

相關問題