ich bin neu in ANTLR und ich versuche, Abfragen zu analysieren die folgenden usingANTLR Rewrite-Abfragetext zu wiederholen Text mit früheren Knoten
grammar SearchEngineQuery;
options { language = CSharp2; output = AST; }
tokens {
AndNode;
}
LPARENTHESIS : '(';
RPARENTHESIS : ')';
AND : 'and';
OR : 'or';
ANDNOT : 'andnot';
NOT : 'not';
NEAR : 'near';
fragment CHARACTER : ('a'..'z'|'0'..'9'|'-');
fragment QUOTE : ('"');
fragment WILDCARD : ('*'|'?');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C');
WILD_STRING
: (CHARACTER)*
(
('?')
(CHARACTER)*
)+
;
PREFIX_STRING
: (CHARACTER)+
(
('*')
)+
;
WS : (SPACE) { $channel=HIDDEN; };
PHRASE : (QUOTE)(WORD)(WILDCARD)?((SPACE)+(WORD)(WILDCARD)?)*(QUOTE);
WORD : (CHARACTER)+;
startExpression : nearExpression;
nearExpression : andExpression (NEAR^ andExpression)*;
andExpression
: (andnotExpression -> andnotExpression)
(AND? a=andnotExpression -> ^(AndNode $andnotExpression $a))*
;
andnotExpression : orExpression (ANDNOT^ orExpression)*;
orExpression : notExpression (OR^ notExpression)* ;
notExpression : (NOT^)? (phraseExpression | wildExpression | prefixExpression | atomicExpression);
phraseExpression : (PHRASE^);
wildExpression : (WILD_STRING^);
prefixExpression : (PREFIX_STRING^);
atomicExpression : WORD | LPARENTHESIS! andExpression RPARENTHESIS!;
Dies scheint für allgemeine Fragen ok zu arbeiten. Allerdings muss der Fall von a near (b or c)
als tatsächlich behandelt werden:
und a near (b or c and (d or e))
Bedürfnissen behandelt werden wie:
Ich bin nicht in der Lage zu bestimmen, wie dies zu tun. Jede Hilfe würde sehr geschätzt werden.
Dank
Was ist mit 'a und (b oder c)'? Sollte dies auch in "(a und b) oder (a und c)" umgewandelt werden? Und 'eine Nähe (b oder c und (d oder e))'? –
Das a und (b oder c) kann so gehandhabt werden, wie es ist. Es ist die nahe Option, die verarbeitet werden muss, indem die Abfrage aufgelöst wird. Wie für eine Nähe (b oder c und (d oder e)) sollte idealerweise auch gebrochen werden. Entschuldigung für die Verzögerung bei der Antwort. Ich bin neu im Stackexchange und habe immer nur den Wert der Antworten zu dieser Frage in meinem Profil betrachtet. Jetzt weiß ich es besser. – Puneet
Noch eine Sache, Ihre Grammatik erlaubt 'ein nahes x nahes (b oder c)', ist das richtig? Wenn ja, welche AST sollte das produzieren? –