다른 규칙에서도 동일한 하위 규칙을 다시 사용하고자하므로 분할하고 싶은 규칙이 있습니다. 원본 버전은 잘 작동 :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))?
;
대신이 시도 :
I 동안 어떻게 작동하는지 보시라.하지만 유감스럽게도 이것은 첫 번째 (작동하는) 규칙과 동일한 AST를 생성하지 않을 것이다. basicType2 및 basicType이 서브 노드 인 T2 노드가 생성됩니다. 내가 원하는 것은 basicType2가 존재하면 basicType이 서브 노드 여야하며 basicNode2에 새로운 추가 자식이 있어야한다는 것입니다. 하지만 고마워 ... 나는 두 번째 형식에서 기본 유형 2를 하위 트리가 아닌 토큰 만있는 노드로 취급하기 때문에이 사실을 알게되었습니다. – progician
@progician, 그래, 네가 나무를 바꾼다는 건 알지만,'basicType2'는 루트와 자식 노드를 가진 AST가 될 수 있기 때문에'^ (basicType2 basicType)'은 작동하지 않을 것이다. 'basicType2'가 항상 하나의 토큰을 생성한다면'^ (basicType2 basicType)'*은 * 작동합니다. –