Mazi 프로그램 해석기 – (4)

Copyright (c) 2015-, All Rights Reserved by Kwanghoon Choi
(아래 자바 프로그래밍 강의 교재의 내용을 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)

 

4. Mazi 해석기 확장

아래의 세가지 종류 중 최소 한가지 이상을 지원하도록 Mazi 해석기를 확장하시오. IF, FOR, WHILE의 의미는 java와 유사한 형태로 정의하시오.

Stmt ::= ...
       | IF Expr
       | ENDIF
       | FOR variable = Expr TO Expr
       | ENDFOR
       | WHILE Expr
       | ENDWHILE

새로 추가한 구문을 사용해서 다음과 같은 예제를 작성할 수 있다.

IF x > 0
     y = 1
ENDIF

IF x < 0 
   IF y < 0       
      PRINT 0    
   ENDIF    
   IF y >= 0
      PRINT 1
   ENDIF
ENDIF

IF x >= 0
   IF y < 0       
      PRINT 2    
   ENDIF        
   IF y >= 0
      PRINT 3
   ENDIF
ENDIF

sum = 0
FOR x = 1 TO 10
     sum = sum + 1
ENDFOR

sum = 0
FOR x = 1 TO 10
     IF x % 2 == 0
        sum = sum + x
     ENDIF
ENDFOR


FOR x = 2 TO 9
  FOR y = 1 TO 9
    PRINT x * y
  ENDFOR
ENDFOR


x = 10
WHILE x > 0
     x = x - 1
     PRINT x
ENDWHILE

지금까지 모든 변수와 식의 타입은 int 타입으로 정의했지만, 조건식의 타입은 boolean 타입이어야 한다. 따라서 환경 evn는 HashMap<String,Integer>가 아닌 HashMap<String,Object>로 변경한다. Object 클래스는 모든 클래스의 조상 클래스로 Integer나 Boolean 클래스를 대표할 수 있다. 이에 따라 기존의 Mazi 식을 계산하는 Java 코드에서 많은 부분을 변경해야 한다. 예를 들어, evalExpr의 리턴 타입이 Object으로 수정해야 된다. 그리고 Object 객체로 env에 저장된 값을 Integer나 Boolean으로 타입 변환을 할 경우도 발생한다.

IF의 조건식과 FOR와 WHILE의 테스트 조건식을 위해 관계 연산자와 조건 연산자를 도입해야 한다. 그에 따라 우선 순위와 결합성을 정의하는 메소드도 수정해야 한다.

IF, FOR, WHILE문을 추가하기 위해서 StringTokenizer 객체를 복사해서 사용해야할 경우가 있다. 주어진 StringTokenizer 객체에서 모든 토큰을 꺼내 문자열을 만들고 이 문자열로 다시 StringTokenizer 객체를 두 개 만들어서 복사할 수 있다.

StringTokenizer stz = ...;
String tmp_line = ... stz의 모든 토큰을 꺼내 공백으로 구분한 문자열을 만든다 ...
StringTokenizer stz_clone = new StringTokenizer(tmp_line);
stz = new StringTokenizer(tmp_line);

이 외에도 env에 단순히 변수와 값의 매핑 정보 외에도 IF, FOR, WHILE 문을 실행하기 위해 필요한 정보를 추가할 수 있다. 이때 변수와 키가 겹치지 않도록 적절한 키의 이름을 정해야 한다. 예를 들어, "$stack"을 키로 사용하면 Mazi 언어의 변수와 겹치지 않는다.

 

4.1 IF문

4.2 FOR문

4.3 WHILE문

[보너스 문제] Mazi 해석기에 IF 문, FOR 문, WHILE 문을 추가하시오.

Leave a Reply

Your email address will not be published. Required fields are marked *