2010-02-27 2 views
3

원본 규칙에서 특정 조건이 발생했을 때 다시 쓰기 규칙을 올바르게 형식 지정하는 방법에 대해 스스로에게 의문의 여지가 있습니다.ANTLR 3.x - 다시 쓰기 규칙의 형식을 지정하는 방법

이를 다시 작성하는 적절한 방법은 무엇입니까 :

unaryExpression: op=('!' | '-') t=term 
    -> ^(UNARY_EXPR $op $t) 

ANTLR 날 라벨 및 "OP ="와 함께 괄호 안에 아무것도 브랜드처럼 보이지 않는다 실패합니다. 또한 시도해 보았습니다.

unaryExpression: ('!' | '-') t=term 
    -> ^(UNARY_EXPR ('!' | '-') $t) 

Antlr이 '또는'을 좋아하지 않습니다. 문법 오류가 발생합니다.

토큰 이름으로 문자 클래스를 바꾸면이 문제가 해결되지만 내 문법과 관련된 다른 문제가 발생합니다.

--- 편집 ----

두 번째 문제가 추가되었습니다.

multExpression : unaryExpression (MULT_OP unaryExpression)* ;

아주 간단합니다 :

: 내 기대 (가상) 그래서 같은 끝낼 것을 MULT 토큰 부모의 모든 일치하는 토큰을 둘러싸 나를 트리 문법이 규칙의 형식을 도와주세요
MULT 
    o 
    | 
    o---o---o---o---o 
    | | | | | 
'3' '*' '6' '%' 2 

답변

2
unaryExpression 
    : (op='!' | op='-') term 
     -> ^(UNARY_EXPR[$op] $op term) 
    ; 

UNARY_EXPR[$op]을 사용 했으므로 루트 노드는 -1로 기본값 대신 유용한 일부 행/열 정보를 얻습니다.

+0

고맙습니다. 나는 전에 TOKEN [$ op]을 사용하는 것에 대해 들어 본 적이 없지만, 나는 넓은 전문가는 아니다. 이 문맥에서 그것을 사용하는 것은 내가 찾고있는 결과를 만들어 내지 못했다. UNARY_EXPR 토큰은 허수이며이 컨텍스트에서 이어지는 두 개의 토큰을 설명하는 데 사용됩니다. 그러나 op = x | op = y는 정확하게 정확하게 수행하지 못했습니다. – Kivin

관련 문제