jjTree 해석
이렇게 말 할 수 있 습 니 다. 자바 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 의 운영 체 제 를 설명 할 수 있 기 를 바 랍 니 다. 그러나 규모 가 제한 되 어 있 기 때문에 일부 지역 은 아직 뚜렷 하지 않 을 수도 있 습 니 다.댓 글 을 환영 합 니 다. 가능 한 한 빨리 블 로그 에 작은 시 리 즈 를 쓰 겠 습 니 다. 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.