Для учебного проекта я использую следующую грамматику ANTLR для разбора строк запроса, содержащих некоторые простые логические операторы, такие как AND, NOT и другие:
grammar SimpleBoolean;
options { language = CSharp2; output = AST; }
tokens { AndNode; }
@lexer::namespace { INR.Infrastructure.QueryParser }
@parser::namespace { INR.Infrastructure.QueryParser }
LPARENTHESIS : '(';
RPARENTHESIS : ')';
AND : 'AND';
OR : 'OR';
ANDNOT : 'ANDNOT';
NOT : 'NOT';
PROX : **?**
fragment CHARACTER : ('a'..'z'|'A'..'Z'|'0'..'9'|'ä'|'Ä'|'ü'|'Ü'|'ö'|'Ö');
fragment QUOTE : ('"');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C');
WS : (SPACE) { $channel=Hidden; };
WORD : (~( ' ' | '\t' | '\r' | '\n' | '/' | '(' | ')' ))*;
PHRASE : (QUOTE)(CHARACTER)+((SPACE)+(CHARACTER)+)+(QUOTE);
startExpression : andExpression;
andExpression : (andnotExpression -> andnotExpression) (AND? a=andnotExpression -> ^(AndNode $andExpression $a))*;
andnotExpression : orExpression (ANDNOT^ orExpression)*;
proxExpression : **?**
orExpression : notExpression (OR^ notExpression)*;
notExpression : (NOT^)? atomicExpression;
atomicExpression : PHRASE | WORD | LPARENTHESIS! andExpression RPARENTHESIS!;
Теперь я хотел бы добавить оператор дляназываемые запросы близости.Например, запрос "A /5 B"
должен возвращать все, что содержит A с буквой B в следующих 5 словах.Число 5 может быть любым другим положительным int, конечно.Другими словами, запрос близости должен привести к следующему синтаксическому дереву:
http://graph.gafol.net/pic/ersaDEbBJ.png
К сожалению, я не знаю, как (синтаксически) добавить такой оператор "PROX" кмоя существующая грамматика ANTLR.Любая помощь приветствуется.Спасибо!