테일 재귀 파서

Tail recursive parser

컴퓨터 과학에서 꼬리 재귀 파서는 더 흔한 재귀 하강 파서에서 파생된 것이다.꼬리 재귀 파서는 일반적으로 왼쪽 재귀 그래머를 구문 분석하는 데 사용된다.그들은 일반 재귀 강하 파서보다 적은 양의 스택 공간을 사용한다.그것들은 또한 쓰기 쉽다.일반적인 재귀 강하 파서들은 왼쪽 재귀 그래머를 구문 분석하는 것을 불가능하게 만든다(무한 루프 문제 때문에).Tail recursive 파서들은 이것을 허용하게 만드는 노드 재렌트 기법을 사용한다.

다음과 같은 EBNF 문법 지정:

 E: T  T: T { '+' F }   F  F: F { '*' I }   I  I: <식별자> 

단순한 꼬리 재귀 파서는 재귀 하강 파서처럼 쓰일 수 있다.추상 구문 트리를 사용하여 이와 같은 문법을 구문 분석하는 일반적인 알고리즘은 다음과 같다.

  1. 문법의 다음 단계를 구문 분석하여 출력 트리를 얻고, 첫 번째 트리를 지정한다.F
  2. 종료 토큰이 있는 동안T, 이 노드의 부모로 넣을 수 있는 항목:
    1. 새 노드 할당,N
    2. 세트N현재 입력 토큰으로 의 현재 연산자
    3. 입력 토큰 한 개 진행
    4. 세트N의 왼쪽 하위 트리F
    5. 한 단계 더 아래로 구문 분석해서 다음 트리로 저장하면X
    6. 세트N로서의 오른쪽 하위 트리X
    7. 세트FN
  3. 반품N

C에서 이러한 종류의 파서(parser)의 기본적인 예가 여기에 나와 있다.단순화를 위해 구현 세부사항을 생략했다.

타이피프 구조상의 _exptrie 퇴장시키다; 구조상의 _exptrie {  마를 뜨다 토큰;  퇴장시키다 *남겨진;  퇴장시키다 *맞다; };  퇴장시키다 *parse_e(공허하게 하다) {  돌아오다 parse_t(); }  퇴장시키다 *parse_t(공허하게 하다) {  퇴장시키다 *first_f = parse_f();    하는 동안에 (cur_message() == '+') {   퇴장시키다 *replace_tree = allocation_tree();   replace_tree->토큰 = cur_message();   replace_tree->남겨진 = first_f;   next_snow();   replace_tree->맞다 = parse_f();   first_f = replace_tree;  }   돌아오다 first_f; }  퇴장시키다 *parse_f(공허하게 하다) {  퇴장시키다 *first_i = parse_i();    하는 동안에 (cur_message() == '*') {   퇴장시키다 *replace_tree = allocation_tree();   replace_tree->토큰 = cur_message();   replace_tree->남겨진 = first_i;   next_snow();   replace_tree->맞다 = parse_i();   first_i = replace_tree;  }    돌아오다 first_i; }  퇴장시키다 *parse_i(공허하게 하다) {  퇴장시키다 *i = allocation_tree();  i->남겨진 = i->맞다 = NULL;  i->토큰 = cur_message();  next_snow();  돌아오다 i; } 

참고 항목

추가 읽기