1

研究プロジェクトでは、次の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文法に(構文的に)追加する方法がわかりません。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

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が作成されます。

ここに画像の説明を入力してください

于 2011-03-30T19:32:43.927 に答える