2014-02-13 5 views
2

나는 ANTLR을 처음 사용합니다. 나는 ANTLR 튜토리얼을 탐구하기 시작했다. 반환 형식이 perticular 규칙에 대해 정의 된 예제를 보았습니다 (아래 예제 참조).ANTLR : 인수가있는 규칙?

규칙에 인수도 전달할 수 있습니까? 나는 단지 내 마음 속 깊이 생각하고있다, 나는 주어진 규칙에 따라 펄크 상태에서 규칙의 행동을 바꾸고 싶었다.

ANTLR에 동의 할 수 없다면 도움을 주시겠습니까? 아니면 그렇게하는 것이 좋습니다.

atom returns [int value] 
: 
    INT 
    { 
     $value = Integer.parseInt($INT.text); 
    } 
    | ID // variable reference 
    { 
     Integer v = (Integer) memory.get($ID.text); 
     if (v != null) 
     $value = v.intValue(); 
    } 
; 

답변

6

예.하지만 파서 규칙에서 매개 변수를 렉서 규칙으로 전달할 수 없습니다. 렉서는 구문 분석기와 별도로 토큰을 생성합니다.

규칙 매개 변수의 예 : 당신이 지금 입력 "mu"을 구문 분석 싶다면

parse 
: p1["param"] 
; 

p1 [String s] 
: ref=p2[$s, 42] 
    { 
    // Print some info about rule 'p2'. 
    System.out.println("param=" + $s); 
    System.out.println("p2.ss=" + $ref.ss); 
    System.out.println("p2.ii=" + $ref.ii); 
    } 
; 

// Rules can have more than 1 param, and can even return more than 1 value. 
p2 [String s, int i] returns [String ss, int ii] 
: ID 
    { 
    $ss = $s + "_" + $ID.text; 
    $ii = $i + $i; 
    } 
; 

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

, 다음은 콘솔로 인쇄됩니다 :

param=param 
p2.ss=param_mu 
p2.ii=84 
+0

명심이 모든 사용 기능은 ANTLR 4 로의 변환을 더 어렵게 만들 것입니다. 여기서 사용자 지정 인수와 문법의 반환 값은 기껏해야 "낙담"합니다. –