2012-08-06 2 views
2

다른 규칙에서도 동일한 하위 규칙을 다시 사용하고자하므로 분할하고 싶은 규칙이 있습니다. 원본 버전은 잘 작동 :ANTLR에서 노드의 하위 노드를 가져 오는 방법은 무엇입니까?

type 
    : (basicType -> basicType) 
    ('*' -> ^(TYPE_POINTER basicType) 
    | '[' ']' -> ^(TYPE_DYN_ARRAY basicType) 
    | '[' IntegerLiteral ']' -> ^(TYPE_STATIC_ARRAY IntegerLiteral basicType) 
    | '[' IntegerLiteral '..' IntegerLiteral ']' -> ^(REF_TYPE_SLICE IntegerLiteral IntegerLiteral basicType) 
    | '[' type ']' -> ^(TYPE_MAP_ARRAY type basicType) 
)? 
    ; 

이 규칙은 가능한 다른 하에서 제자리 (INT, 숯, 등등과 같은 참조 또는 기본 타입 일 수 basicType) 정상 형태를 취할 수있게 AST 노드는 포인터, 배열 등으로 만듭니다. 이것은 C와 같은 언어에서 매우 일반적입니다.

그러나 나는이 같은 분할하는 경우 :

basicType2 
    : '*' -> ^(TYPE_POINTER) 
    | '[' ']' -> ^(TYPE_DYN_ARRAY) 
    | '[' IntegerLiteral ']' -> ^(TYPE_STATIC_ARRAY IntegerLiteral) 
    | '[' IntegerLiteral '..' IntegerLiteral ']' -> ^(REF_TYPE_SLICE IntegerLiteral IntegerLiteral) 
    | '[' type ']' -> ^(TYPE_MAP_ARRAY type) 
    ; 

type 
    : (basicType -> basicType) 
    (basicType2 -> ^(basicType2 basicType))? 
    ; 

모든 훌륭한 외모와 분석은 그러나 AST에 basicType2의 아이들이 완전히 누락, 영향을받지 않습니다. TYPE_STATIC_ARRAY 또는 REF_TYPE_SLICE 또는 TYPE_MAP_ARRAY의 경우 루트 만 유형 위에 복사되지만 하위 노드는 누락됩니다.

나는 파서 코드를 디버깅했으며 CommonTree 클래스의 '복사 생성자는 자식을 복사하지 않을 때 호출되며 토큰과 소스 범위 정보 만 보인다. CommonTree 노드를 다시 작성 규칙을 사용하여 다른 노드의 맨 위에 가져 오는 방법이 있습니까? 당신이 basicType2로하고있는 바와 같이, 하지 다른 나무 :

type 
    : (basicType -> basicType) 
    (basicType2 -> ^(basicType2 basicType))? 
    ; 

대신이 시도 :

답변

2

항상 트리의 루트로 하나의 토큰을 사용

grammar ... 

options { ... } 

tokens { T2; } 

... 

type 
    : (basicType -> basicType) 
    (basicType2 -> ^(T2 basicType2 basicType))? 
    ; 

... 
+0

I 동안 어떻게 작동하는지 보시라.하지만 유감스럽게도 이것은 첫 번째 (작동하는) 규칙과 동일한 AST를 생성하지 않을 것이다. basicType2 및 basicType이 서브 노드 인 T2 노드가 생성됩니다. 내가 원하는 것은 basicType2가 존재하면 basicType이 서브 노드 여야하며 basicNode2에 새로운 추가 자식이 있어야한다는 것입니다. 하지만 고마워 ... 나는 두 번째 형식에서 기본 유형 2를 하위 트리가 아닌 토큰 만있는 노드로 취급하기 때문에이 사실을 알게되었습니다. – progician

+1

@progician, 그래, 네가 나무를 바꾼다는 건 알지만,'basicType2'는 루트와 자식 노드를 가진 AST가 될 수 있기 때문에'^ (basicType2 basicType)'은 작동하지 않을 것이다. 'basicType2'가 항상 하나의 토큰을 생성한다면'^ (basicType2 basicType)'*은 * 작동합니다. –

관련 문제