출처: https://3months.tistory.com/307 [Deep Play]

3-2/기초컴파일러

Recursive-decent, Predictive Parsing

코딩하는 랄뚜기 2021. 10. 16. 19:03

Recursive-descent parsing(재귀적 하강 구문 분석)

Input string을 parsing하기 위해 recursive procedure를 사용한다.

- Nonterminal symbols에 대한 프로시저 및 Terminal symbols에 대한 프로시저를 각각 작성한 다음 이를 통합함으로써 구현한다.

- Terminal symbol에 대한 프로시저는 production rule에 있는 terminal symbol과 input symbol이 같은지 비교하여 같은 경우 다음 input symbol을 읽게 한다.

- Nonterminal symbol에 대한 프로시저는 현재의 input symbol를 생성할 수 있는 적절한 생성 규칙이 선택되도록 작성한다.

 

먼저 현재의 입력 기호를 보고 시작 기호에 대한 프로시저를 호출한다. 그리고 마지막에는 현재의 입력 기호가 입력의 끝을 나타내는 $이면 accept이고 그렇지 않으면 에러로 처리한다.

 

장점 : 구문 분석기를 쉽고 빠르게 구성할 수 있다.

단점 :

- 프로시저를 부르는 시간으로 인해 속도가 느리고 구문 분석기의 크기가 큼

- 결정적인 구문 분석이 되지 않아 역추적이 필요할 수 있음

- 생성 규칙이 바뀔 때마다 구문 분석기 전체를 다시 고쳐야 함


Example

1. 터미널 기호에 대한 프로시저

procedure pa;

begin

  if nextsymbol = qa then get_nextsymbol

  else error

end;

 

procedure pb;

begin

  if nextsymbol = qb then get_nextsymbol

  else error

end;

 

2. 논터미널 기호에 대한 프로시저

procedure PS;

  begin

     case nextsymbol of

        qa : begin pa; PS end;

        qb : pb;

         otherwise : error

   case

  end

end;

 

3. 메인 프로그램에 대한 프로시저

begin

   get_nextsymbol;

   PS;

   if nextsymbol = q$ then accept

   else error

end;

 

3. Terminal & Nonterminal에 대한 프로시저를 통합한다.

procedure PS;

begin

   if nextsymbol = qa then

       begin get_nextsymbol; PA:

       if nextsymbol = qb then get_nextsymbol

       else error

      end;

   else error

end;

 

procedure PA;

begin

   case nextsymbol of

      qa : begin get_nextsymbol; PS end;

      qb : get_nextsymbol;

      otherwise : error

   end

end;

 

begin

  get_nextsymbol;

  PS;

  if nextsymbol = q$ then accept

  else error

end;


Predictive Parsing


'3-2 > 기초컴파일러' 카테고리의 다른 글

CLR parser  (0) 2021.11.07
Bottom-up parsing  (0) 2021.11.06
Syntax Analysis  (0) 2021.10.16
Pushdown Automata  (0) 2021.10.16
Grammar Conversion  (0) 2021.10.09