ANTLR词法分析器禁用令牌然后重新启用它们不能按预期工作

时间:2013-09-16 15:22:02

标签: parsing antlr grammar antlr4

所以我有一个定义了令牌的词法分析器,以便在布尔属性上启用/禁用

我创建一个输入流并解析文本。我的令牌称为PHRASE_TEXT,应该匹配此模式'"' ('\\' ~[] |~('\"'|'\\')) '"' {phraseEnabled}?

内的所有内容

我对"foo bar"进行了标记,正如预期的那样,我得到了一个令牌。在词法分析器上将属性设置为false并使用相同的文本调用setInputStream后,我得到"foo , bar"所以有2个令牌而不是1个令牌。这也是预期的行为。

将属性再次设置为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 : '\\' ~[];

问题似乎是在我将短语设置为false,然后再将其设置为true之后,似乎没有更多的标记被识别为PHRASE_TEXT。我知道作为指导,我应该将我的语法定义为明确的,但这基本上是它最终看起来的方式:根据情况用2种不同模式的引号标记字符串。

1 个答案:

答案 0 :(得分:0)

我将不得不用我的一位同事帮助更新这个答案。词法分析器生成的类具有在类的所有实例之间共享的静态DFA []数组。将属性设置为false而不是默认值为true后,决策树显然已针对所有对象实例进行了更改。解决这个问题的方法是必须为我正在修改的属性的true和false实例分离DFA []数组。我认为使该数组不是静态的将是太昂贵,我真的不能考虑另一个修复。