Je suis en train de construire une grammaire qui interprète le texte entré par l'utilisateur, le style moteur de recherche. Il prendra en charge les opérateurs booléens AND, OR, NOT et ANDNOT. J'ai à peu près tout fonctionne, mais je veux ajouter une règle que deux mots-clés adjacents en dehors d'une chaîne entre guillemets sont traités implicitement comme dans une clause AND. Par exemple:ANTLR - Implicite ET Tokens dans l'arbre
fromage et craquelins = fromage et craquelins
(haut et bas) ou (gauche et droite) = (haut et bas) OU (gauche et droite)
chien chat « porc bedaine »= chat et de chien et « porc bedaine »
Je vais avoir du mal avec le dernier, et j'espère que quelqu'un peut me diriger dans la bonne direction. Voici mon fichier * .g jusqu'à présent, et s'il vous plaît être gentil, mon expérience ANTLR couvre moins d'une journée de travail:
grammar SearchEngine;
options { language = CSharp2; output = AST; }
@lexer::namespace { Demo.SearchEngine }
@parser::namespace { Demo.SearchEngine }
LPARENTHESIS : '(';
RPARENTHESIS : ')';
AND : ('A'|'a')('N'|'n')('D'|'d');
OR : ('O'|'o')('R'|'r');
ANDNOT : ('A'|'a')('N'|'n')('D'|'d')('N'|'n')('O'|'o')('T'|'t');
NOT : ('N'|'n')('O'|'o')('T'|'t');
fragment CHARACTER : ('a'..'z'|'A'..'Z'|'0'..'9');
fragment QUOTE : ('"');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C');
WS : (SPACE) { $channel=HIDDEN; };
PHRASE : (QUOTE)(CHARACTER)+((SPACE)+(CHARACTER)+)+(QUOTE);
WORD : (CHARACTER)+;
startExpression : andExpression;
andExpression : andnotExpression (AND^ andnotExpression)*;
andnotExpression : orExpression (ANDNOT^ orExpression)*;
orExpression : notExpression (OR^ notExpression)*;
notExpression : (NOT^)? atomicExpression;
atomicExpression : PHRASE | WORD | LPARENTHESIS! andExpression RPARENTHESIS!;
Merci! Cela a fait l'affaire. Ma préoccupation de suivi (maintenant supprimée, et à quoi votre montage était destiné) était due à un bug dans le code C#. – user409108
@highbeammeup, heureux d'entendre cela. Et vous êtes bienvenue! –
@BartKiers J'ai de la difficulté à comprendre votre règle de réécriture, même si j'ai la référence ici. Pourriez-vous expliquer pourquoi la partie (..) (..) est nécessaire et ce que fait l'opérateur du dollar? –