문제

연구 프로젝트의 경우, 다음 Antlr 문법을 사용하여 일부와 다른 것과 같은 간단한 부울 연산자가 포함 된 쿼리 문자열을 구문 분석하고 있습니다.

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!;
.

이제 소위 근접 쿼리에 대한 운영자를 추가하고 싶습니다.예를 들어 Query "A /5 B"는 다음 5 단어 내에서 다음을 포함하는 모든 것을 반환해야합니다.5 번은 물론 다른 긍정적 인 int 일 수 있습니다.즉, 근접 쿼리는 다음 구문 트리가 발생해야합니다.

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

불행히도, 나는 (구문으로) 기존의 antlr 문법에 "prox"연산자를 추가하는 방법을 모르겠습니다. 어떤 도움도 감사합니다.감사합니다!

도움이 되었습니까?

해결책

You could do that like this:

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!;

If you parse the input:

A /500 B OR D NOT E AND F

the following AST is created:

enter image description here

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top