私はANTLRを初めて使用し、次を使用してクエリを解析しようとしています。
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!;
これは、一般的なクエリでは問題なく機能するようです。ただし、の場合はa near (b or c)
実際には次のように処理する必要があります。
a near (b or c and (d or e))
次のように処理する必要があります。
私はこれを行う方法を決定することができません。どんな助けでも大歓迎です。
ありがとう