jjTree 해석

이 글 은 이 소형 데스크 톱 계산기 구현 (javacc) 의 속편 이 라 고 할 수 있다.
 
이렇게 말 할 수 있 습 니 다. 자바 cc 를 분석 기 생 성기 로 사용 하고 jjTree 를 사용 하지 않 았 다 면 의미 분석 과정 에 대한 이해 가 깊 지 않 았 습 니 다.jjTree 를 사용 하고 잘 사용 했다 면 컴 파일 원리, BNF 등에 대한 이해 가 잘 된 셈 이다.jjTree 에서 가장 중요 한 개념 은 Node 인터페이스 로 모든 비 종결 부 호 는 하나의 노드 로 규정 할 수 있다.이 노드 는 일반적으로 Node 인 터 페 이 스 를 실현 한 노드 류 인 데 그 중에서 주로 이런 몇 가지 방법 이 있다.
……
  /** This method tells the node to add its argument to the node's
    list of children.  */
  public void jjtAddChild(Node n, int i);

  /**       ,   0  ,     */
  public Node jjtGetChild(int i);

  /**         */
  int jjtGetNumChildren();

……

 
본 고 에서 제시 한 예 에서 모든 노드 는 이러한 인터페이스 에서 설명 하 는 방법 을 실현 해 야 한다.
void interpret()

이 방법 은 각 노드 의 구체 적 인 계산 과정 이다.
 
jjTree 가 처리 하 는 스 크 립 트 (jjTree 규칙 목록) 는 jjjt 로 끝 납 니 다. 이 파일 은 jjtree 도 구 를 통 해 jj 파일 을 생 성 할 수 있 습 니 다. 그리고 자바 cc 로 jj 파일 을 컴 파일 하면 분석 기 생 성기 의 자바 코드 를 생 성 한 다음 에 보조 해석 클래스 를 컴 파일 하여 전체 스 크 립 트 엔진 을 완성 할 수 있 습 니 다.jjTree 는 무슨 소 용이 있 습 니까?이것 은 가장 핵심 적 인 문제 입 니 다. jjTree 의 역할 은 종결 부 를 규칙 을 통 해 비 종결 부 노드 로 규정 하기 위 한 것 임 을 잘 알 고 있 습 니 다.그러나 규약 의 목적 은 무엇 일 까?사실 간단 한 줄 해석 기 가 목표 라면 jjTree 가 필요 없습니다.그러나 if, while 등 코드 블록 을 지원 하 는 등 규모 있 는 스 크 립 트 해석 기 가 필요 하 다 면 이 임시 상 태 를 기록 하려 면 jjTree 를 사용 해 야 합 니 다.문법 트 리 를 추가 한 후에 해석 기 는 전체적인 기호 표, 스 택 등 데이터 구 조 를 추가 하여 비 종결 부 호 를 규정 한 후에 동작 을 할 때 이 데 이 터 를 꺼 낼 수 있 도록 수정 해 야 한다.물론 스 크 립 트 엔진 이 IO 를 지원 한다 면 이 전역 적 인 스 트림 설명자 들 도 기호 표, 스 택 과 함께 놓 아야 합 니 다. 예 를 들 어 하나의 클래스 와 같 습 니 다.jjTree 를 사용 하 는 프로젝트 와 관련 되 어 있 습 니 다. 프레젠테이션 목적 이 라 고 해도 보통 크 기 때문에 이 글 에서 제 시 된 것 은 모두 부분 입 니 다. 필요 하 다 면 블 로그 에서 작은 시 리 즈 를 만 들 수 있 습 니 다.예 를 들 어 예 를 들 어:
/** Conditional or expression. */
void ConditionalOrExpression() #void :
{}
{
  ConditionalAndExpression()
  ( "||" ConditionalAndExpression() #OrNode(2) )*
}
 
위의 이 단락 에서 \ # void 는 conditional OrExpression 규칙 을 만 났 을 때 노드 (규약 하지 않 음) 를 만 들 지 않 는 다 는 뜻 이 고, \ # OrNode (2) 는 마침 2 개의 Contional AndExpression () 규칙 이 발견 되면 OrNode 노드 (외부 에 ASTOR Node 클래스 를 써 야 함) 를 만 드 는 것 을 의미한다.ASTOR Node 클래스 에 서 는 다음 동작 정의 가 있 습 니 다.
  public void interpret()
  {
     jjtGetChild(0).interpret();

     if (((Boolean)stack[top]).booleanValue())
     {
        stack[top] = new Boolean(true);
        return;
     }

     jjtGetChild(1).interpret();
     stack[--top] = new Boolean(((Boolean)stack[top]).booleanValue() ||
                                ((Boolean)stack[top + 1]).booleanValue());
  }
 
문법 해석 을 할 때 비 종결 부 호 를 규정 한 후에 ASTOR Node 부모 클래스 의 children 의 배열 을 설정 한 다음 에 ASTOR Node 에서 이 배열 의 첫 번 째 Node 를 꺼 내 재 귀적 으로 분석 하고 완성 한 후에 두 번 째 Node 를 꺼 내 분석 한 다음 에 이 두 가지 해석 후의 결 과 를 bool 또는 연산 합 니 다.전체 과정 은 매우 자 연 스 럽 고 계산 과정 은 외부의 단독 유형 에 놓 여 진행 된다.예 를 하나 더 보 자.
/** A block. */
void Block() :
{}
{
  "{" ( Statement() )* "}"
}
 
괄호 로 묶 은 일부 코드 로 블록 을 표시 하 는데, 이것 을 어떻게 해석 하 는 것 이 빠 릅 니까?ASTBLock 에서 이러한 연산 과정 이 있 습 니 다.
  public void interpret()
  {
     int i, k = jjtGetNumChildren();//           

     for (i = 0; i < k; i++)
        jjtGetChild(i).interpret();//    

  }
 
코드 블록 에 있 는 코드 바 수 를 꺼 내 서 순서대로 실행 합 니 다. 다른 Node 를 만나면 이 Node 의 interpret 과정 을 재 귀적 으로 호출 하여 전체 코드 블록 을 실행 합 니 다.이 글 은 jjTree 의 운영 체 제 를 설명 할 수 있 기 를 바 랍 니 다. 그러나 규모 가 제한 되 어 있 기 때문에 일부 지역 은 아직 뚜렷 하지 않 을 수도 있 습 니 다.댓 글 을 환영 합 니 다. 가능 한 한 빨리 블 로그 에 작은 시 리 즈 를 쓰 겠 습 니 다. 감사합니다!

좋은 웹페이지 즐겨찾기