我正在创建一个简单的布尔查询解析器。我想在下面做这样的事情。
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)
我犯了什么错误?
答案 0 :(得分:2)
令牌必须是唯一的。但是,您可以在语法中将相同的标记用于多种用途(例如Java中的一元和二元减号)。
我不知道您的环境的确切语法,但更改以下两个子句
AND : ( 'AND' | '&' | 'EN' ) ;
和
andexpr : orexpr ((AND^ | PLUS^) orexpr)*;
可能会解决这个问题。