«Столкновение токена» в логическом парсере запросов - PullRequest
2 голосов
/ 20 августа 2010

Я создаю простой логический парсер запросов.Я хотел бы сделать что-то подобное ниже.

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 Ответ

2 голосов
/ 20 августа 2010

Жетон должен быть уникальным. Однако вы можете использовать один и тот же токен для нескольких целей в вашем синтаксисе (например, унарный и двоичный минус в Java).

Я не знаю точный синтаксис вашей среды, но что-то вроде изменения следующих двух пунктов

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

и

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

, вероятно, решит эту проблему.

...