2010-11-22 2 views
2

DSL 유형에 대해 JJTree (JavaCC) 구성을 작성했으며 주어진 파일 형식을 성공적으로 토큰 화하고 요청시 AST를 덤프합니다.토큰을 저장하는 데 JavaCC/JJTree를 어떻게 사용합니까?

문제는 현재 토큰을 저장하지 않아 트리의 각 노드가 비어 있다는 것입니다 (예제를 이해할 수 없음).

SimpleNode Start() #Root : {} { 
    (
    (Section1())? 
    (Section2())? 
    (Section3())* 
) { 
    return jjtThis; 
    } 
} 

void Section3() #Section3 : {} 
{ 
    <SECTION_3> Identifier() <LBRACE > 
    Header() 
     (Details() <SEMICOLON>)* 
    <RBRACE> 
} 

내가 조 제 1 항, 제 2 장 및 섹션 3에 참조 목록에 대한 참조를 저장하는 루트 노드를 좋아하는 것 : 여기

내 .jjt 파일의 일부입니다. Section3 노드에서 식별자, 헤더 블록을 저장하고 세부 정보 블록의 목록을 유지합니다.

내 채우기 .jjt 파일은 수백 줄이지만,이 두 섹션에 대해 이해할 수 있으면 JJTree의 작동 방식을 이해할 수 있다고 생각합니다. JJTree를 올바르게 사용하는 방법을 알려주십시오.

감사합니다.

답변

2

SimpleNode 클래스를 살펴보면 인스턴스가 #void를 사용하여 생성이 억제 된 경우를 제외하고는 해당 인스턴스가 부모 및 자식 노드에 대한 참조를 자동으로 저장한다는 것을 알 수 있습니다. 예를 들어 루트 노드에는 0..1 Section1 노드, 0..1 Section2 노드 및 0 .. * Section3 노드에 대한 참조가 포함되며 Node 객체를 반환하는 jjtGetChild() 메서드를 사용하여 액세스 할 수 있습니다. 이 자식 노드가 Section1, Section2 또는 Section3 노드인지 여부를 확인하려면 toString() 메서드를 호출 할 수 있습니다 (dump()와 마찬가지로).

또는이 간단한 순회 노드 반복 및 문자열 검사 스타일에 지장이 없으면 SimpleNode 구현에 의존하지 않고 고유 한 노드 유형을 정의 할 수 있습니다. 아래의 예제에서 Start()는 이제 일반 SimpleNode 대신 커스텀 RootNode를 반환합니다. RootNode는 자식 노드에 대한 특정 참조를 포함합니다 (적절하게 getter를 정의합니다). 제 간단한 단편은 Section1/2/3()이 모두 사용자 정의 노드를 반환한다고 가정합니다. 그러나 의 경우는이 아니므로 ... Section3()에 대한 사용자 정의 노드를 원하지만 섹션 1/2가 사소한 경우 SimpleNodes로 남겨 둘 수 있습니다.

RootNode Start() : 
{ 
    Section1Node s1Node = null; 
    Section2Node s2Node = null; 

    List s3Nodes = new LinkedList(); 
    Section3Node s3Node = null; 
} 
{ 
    (
    (s1Node = Section1())? 
    (s2Node = Section2())? 
    (s3Node = Section3() {s3Nodes.add(s3Node); })* 
) { 

    return new RootNode(s1Node, s2Node, s3Nodes); 
    } 
} 

당신이 당신의 파스 트리를 탐색하고 노드와 복잡한 일을하는 경우, 그것은 당신이 당신의 노드와 일을하는지하는 것은에서 분리되도록 Visitor class로의 일부를 이동하는 좋은 생각이 될 수 있습니다 노드 클래스 그 자체. 각 방문자가 파스 트리에서 기능을 수행하고 노드의 각 유형에 대한 방문 메소드 오버로드를 가질 수 있습니다.

이해할 수없는 것이 있으면 알려주세요. 나는 어떤 JavaCC 전문가도 아니고 (단 한 번 사용했을 때) 나는 당신을 도울 수 있어야한다.

+0

고마워. 가능한 경우 사용자 정의 노드 클래스를 정의하지 않고이 예제를 처리하는 방법을 보여줄 수 있습니까 (기존 JJTree 정의 노드 유형에서 사용자 정의 토큰을 저장하는 필드는 어떻게 추가합니까)? 즉, 첫 번째 단락에서 설명하는 방법의 예를 들어보십시오. – Chris

관련 문제