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

时间:2010-08-20 14:12:15

标签: parsing antlr

我正在创建一个简单的布尔查询解析器。我想在下面做这样的事情。

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!;

问题是MINUS和PLUS标记与MINUS和PLUS在AND和OR标记中发生冲突。对不起,如果我没有使用正确的术语。我是一个ANTLR新手。

以下示例查询:

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

我犯了什么错误?

1 个答案:

答案 0 :(得分:2)

令牌必须是唯一的。但是,您可以在语法中将相同的标记用于多种用途(例如Java中的一元和二元减号)。

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

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

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

可能会解决这个问题。