2 votes

Collision de jetons" dans l'analyseur de requêtes booléennes

Je suis en train de créer un simple analyseur de requêtes booléennes. J'aimerais faire quelque chose comme ce qui suit.

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

Le problème est que les jetons MINUS et PLUS entrent en collision avec les signes MINUS et PLUS des jetons AND et OR. Désolé si je n'utilise pas la bonne terminologie. Je suis un novice en matière d'ANTLR.

Vous trouverez ci-dessous un exemple de requête :

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

Quelles sont les erreurs que j'ai commises ?

2voto

Frank Points 1994

Un jeton doit être unique. Vous pouvez toutefois utiliser le même jeton à plusieurs fins dans votre syntaxe (comme le moins unaire et le moins binaire en Java).

Je ne connais pas la syntaxe exacte de votre environnement, mais quelque chose comme changer les deux clauses suivantes

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

et

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

résoudrait probablement ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X