【问题标题】:Antlr wrong rule invocationAntlr 错误的规则调用
【发布时间】:2013-09-05 14:27:35
【问题描述】:

我正在尝试实现用于解析 lucene 查询的语法。到目前为止,一切都很顺利,直到我尝试添加对范围查询的支持。除了我的语法之外,Lucene 的详细信息如下所示:

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 的令牌时,将抛出 []}{ 的令牌识别错误,并且只尝试访问 @987654327 @rule 关于第三个范围。你们知道我在这里想念什么吗?提前致谢

【问题讨论】:

  • 你有没有完成它?我需要一个,我想知道你是否愿意分享:) 谢谢!

标签: parsing antlr antlr4 parser-generator


【解决方案1】:

由于您将TERM_RANGE 设为词法分析器规则,因此您必须在字符级别考虑所有内容。特别是,您忘记在输入中允许空白字符。

如果您改为创建termRange,一个解析器规则,您可能会处于更好的位置。

【讨论】:

  • 这确实成功了。但我确实将 WS 词法分析器规则设置为忽略,它也包含空格。也许我对解析器和词法分析器之间共享的规则有点困惑,但我认为另一种间接级别无济于事
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多