代码之家  ›  专栏  ›  技术社区  ›  Ward Bekker

布尔查询分析器中的“令牌冲突”

  •  2
  • Ward Bekker  · 技术社区  · 15 年前

    我正在创建一个简单的布尔查询分析器。我想在下面做类似的事情。

    grammar BooleanQuery;
    
    options
    {
      language = Java;
      output = AST;
    }
    
    LPAREN : ( '(' ) ;
    RPAREN : ( ')' );
    QUOTE  : ( '"' );
    AND : ( 'AND' | '&' | 'EN' | '+' ) ;
    OR : ( 'OR' | '|' | 'OF' );
    WS :  ( ' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}  ;
    WORD :  (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*;
    MINUS  : '-';
    PLUS  : '+';
    
    
    expr : andexpr;
    andexpr : orexpr (AND^ orexpr)*;
    orexpr : part (OR^ part)*;
    phrase  : QUOTE ( options {greedy=false;} : . )* QUOTE;
    requiredexpr : PLUS atom;
    excludedexpr : MINUS atom;
    part : excludedexpr | requiredexpr | atom;
    atom : phrase | WORD | LPAREN! expr RPAREN!;
    

    问题是,减号和加号与和或标记中的减号和加号“冲突”。对不起,如果我没有使用正确的术语。我是个新手。

    下面是一个示例查询:

    foo OR (pow AND -"bar with cream" AND -bar)

    我犯了什么错误?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Frank    15 年前

    令牌必须唯一。但是,在语法中,可以使用相同的标记来实现多个目的(如Java中的一元和二进制减去)。

    我不知道您的环境的确切语法,但类似于更改以下两个子句

    AND : ( 'AND' | '&' | 'EN' ) ;
    

    andexpr : orexpr ((AND^ | PLUS^) orexpr)*;
    

    可能会解决这个问题。

    推荐文章