所以我有一個詞法分析器與定義,以便在布爾屬性已啓用/禁用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種不同模式標記字符串。
我需要看到更多的語法和調用代碼才能回答這個問題。 –
您可能想要查看ANTLR4對[詞彙模式](http://www.antlr.org/wiki/display/ANTLR4/Lexer+Rules)的支持,並嘗試從您的代碼中觸發該切換機制。我相信該功能旨在支持諸如將HTML嵌入到HTML中的情況。 – Darien