Я создаю простой логический парсер запросов.Я хотел бы сделать что-то подобное ниже.
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)
Какие ошибки я допустил?