2

ANTLR 문법에는 쿼리가 단일 조각이거나 PLUS 기호와 함께 결합 된 조각 목록 일 수 있다고하는 규칙이 있습니다. 출력으로 AST를 생성하고 있는데, 조각의 수에 따라 노드를 다시 작성하는 것이 가능해야합니다.Antlr : 목록을 반복 할 때 트리를 다르게 다시 쓸 수 있습니까?

하나의 조각이 있으면 하나의 노드 만 있어야합니다. 여러 프래그먼트가있는 경우 루트 노드를 PLUS로, 모든 프래그먼트를 자식으로 원합니다. 이것이 가능한가?

query 
    : frag (PLUS frag)* -> ^(PLUS frag*) 
    ; 

답변

2

물론,이 같은 재 작성 규칙 내부 술어를 사용할 수 있습니다

query 
: frag (PLUS frag)* -> {$PLUS != null}? ^(PLUS frag+) 
        ->     frag 
; 

frag 
: ID 
; 

ID 
: 'a'..'z'+ 
; 

PLUS 
: '+' 
; 
:

p 
: M N? P? -> {boolean-expression-1}? ^(rewrite-rule-1) 
      -> {boolean-expression-2}? ^(rewrite-rule-2) 
      ->       ^(rewrite-rule-3) 
; 

를 귀하의 경우에는, 단순히 부울 표현식에서 PLUS 토큰의 존재를 확인

(fragment은 ANTLR의 예약어 임)

"a" 같은

입력은 다음과 같이 해석된다 : 같은

enter image description here

"a+b+c+d" :

enter image description here

내가 바로, 당신이 이진 트리를 찾고하지 않을 겠지? 당신은 그러나 경우, 인라인 트리 연산자, ^을 사용하면이 같은이 쉽게 만들 것 :

query 
: frag (PLUS^ frag)* 
; 

"a+b+c+d"에 대해 다음 AST를 만드는 :

enter image description here

+0

감사 @Bart을! 나는 당신이 술어를 결합하고 그런 재 작성을 할 수 있다는 것을 몰랐다. –

+0

@ PPC-Coder는 환영합니다. –