所以我有一个定义了令牌的词法分析器,以便在布尔属性上启用/禁用它
我创建一个输入流并解析一个文本。我的令牌被调用PHRASE_TEXT
并且应该匹配任何属于这个模式的东西'"' ('\\' ~[] |~('\"'|'\\')) '"' {phraseEnabled}?
我标记化"foo bar"
并按预期得到一个标记。在将属性设置为false
词法分析器并使用相同的文本调用setInputStream
它之后,我得到"foo , bar"
了 2 个令牌而不是一个。这也是预期的行为。
再次将属性设置为时出现问题true
。我希望相同的文本标记为整个 1 标记"foo bar"
,而是标记为之前的 2 个标记。这是我的错误吗?我在这里做错了什么?我尝试使用标记器的新实例并重用相同的实例,但它似乎无法正常工作。提前致谢。
编辑:我的部分语法如下
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 : '\\' ~[];
问题似乎是,在我将短语设置为 false,然后再次设置为 true 之后,似乎没有更多的标记被识别为 PHRASE_TEXT。我知道作为指导方针,我应该将我的语法定义为明确的,但这基本上是它最终必须寻找的方式:根据情况,以 2 种不同的模式用引号对字符串进行标记。