Я пытаюсь построить грамматику, которая интерпретирует введенный пользователем текст, стиль поисковой системы. Он будет поддерживать логические операторы AND, OR, NOT и ANDNOT. У меня почти все работает, но я хочу добавить правило, согласно которому два соседних ключевых слова вне строки в кавычках неявно обрабатываются как в предложении AND. Например:
сыр и крекеры = сыр и крекеры
(вверх и вниз) или (влево и вправо) = (вверх и вниз) ИЛИ (влево и вправо)
кошка-собака «брюшная свинья» = кошка-собака и «брюшная свинья»
У меня проблемы с последним, и я надеюсь, что кто-то может указать мне правильное направление. Вот мой файл * .g, и, пожалуйста, будьте добры, мой опыт работы с ANTLR занимает меньше рабочего дня:
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!;