2011-08-30 6 views
2

동작 방법이 호출 된 "활성"ANTLR 규칙을 가져올 수 있습니까? 모든 로그와 $ 시작 -와 $ 최종 토큰()를 통해 손없이 몇 가지 규칙 의 시작과 끝 위치를 표시해야합니다 ANTLR - 의사 코드에서이 로그 함수와 같은활성 Antlr 규칙 가져 오기

뭔가 - 전화 :

@members{ 
    private void log() { 
    System.out.println("Start: " + $activeRule.start.pos + 
         "End: " + $activeRule.stop.pos); 
    } 
} 

expr: multExpr (('+'|'-') multExpr)* {log(); } 
    ; 

multExpr 
    : atom('*' atom)* {log(); } 
    ; 

atom: INT 
    | ID {log(); } 
    | '(' expr ')' 
    ; 

답변

0

아니, 파서가 현재에있는 규칙의 이름을 볼 수있는 방법이 없습니다. 그 파서 규칙은, 기본적으로 void를 반환 단순히 자바 방법입니다 실현. 자바 메소드에서, 결국이 메소드의 내부에있을 때 런타임에 그 이름을 찾을 수 없다. 당신이 당신의 문법의 options { ... }output=AST을 설정하면

, 모든 파서 규칙 생성 (반환)라는 ParserRuleReturnScoperetval의 인스턴스 : 그래서 당신 사용하는 것이 당신의 목적을 위해 :

// ... 

options { 
    output=AST; 
} 

// ... 

@parser::members{ 
    private void log(ParserRuleReturnScope rule) { 
    System.out.println("Rule: " + rule.getClass().getName() + 
         ", start: " + rule.start + 
         ", end: " + rule.stop); 
    } 
} 

expr: multExpr (('+'|'-') multExpr)* {log(retval);} 
    ; 

multExpr 
    : atom('*' atom)*     {log(retval);} 
    ; 

atom: INT 
    | ID        {log(retval);} 
    | '(' expr ')' 
    ; 
// ... 

이 그러나 매우 신뢰할 수있는 일은 아닙니다. ANTLR의 다음 버전에서는 변수의 이름이 매우 잘 변경 될 수 있습니다.

+1

도움 주셔서 감사합니다. 나는 시작과 끝 토큰을 log() 함수에 전달할 것이다. @ after-action 안에 함수가있다. – Sonson

+0

@ 폰슨, 환영합니다. 예, 규칙의'@after {...}'블록에있는 로그 메소드에서 getStart()와 getEnd()를 전달하는 것이 더 나은 선택입니다 : 지역 변수' retval'. –

+0

나는 똑같이했다. http://stackoverflow.com/questions/12892122/how-to-merge-two-asts를 보아라. 그러나'stop'과'getTree()'는 항상 null을 돌려 준다 .--( – j3d

관련 문제