ANTLR语法:添加“动态”邻近运算符

时间:2011-03-30 19:06:27

标签: parsing antlr grammar proximity

对于一个研究项目,我使用以下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"应该在接下来的5个单词中返回包含A和B的所有内容。当然,数字5可以是任何其他正数。换句话说,邻近查询应该导致以下语法树:

http://graph.gafol.net/pic/ersaDEbBJ.png

不幸的是,我不知道如何(语法上)将这样的“PROX”运算符添加到我现有的ANTLR语法中。 任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

你可以这样做:

PROX   : '/' '0'..'9'+;

...

startExpression  : andExpression;
andExpression    : (andnotExpression -> andnotExpression) (AND? a=andnotExpression -> ^(AndNode $andExpression $a))*;
andnotExpression : proxExpression (ANDNOT^ proxExpression)*;
proxExpression   : orExpression (PROX^ orExpression)*;
orExpression     : notExpression (OR^ notExpression)*;
notExpression    : (NOT^)? atomicExpression;
atomicExpression : PHRASE | WORD | LPARENTHESIS! andExpression RPARENTHESIS!;

如果您解析输入:

A /500 B OR D NOT E AND F

创建以下AST:

enter image description here