본문 바로가기
잡동사니/컴파일러

[컴파일러 구조와 원리] - 파서 제네레이터 (Parser Generator)

by 2KB 2015. 12. 31.

파서 제네레이터

 

스캐너를 생성하는 프로그램 – 스캐너 제네레이터(scanner generator)

파서를 생성하는 프로그램 – 파서 제네레이터(parser generator)

 

종류

문법의 취급 범위

속도

LR 파서 제네레이터

넓다

평균적

LALR 파서 제네레이터

비교적 넓다

평균적

LL 파서 제네레이터

약간 좁다

약간 빠르다

 

 

JavaCC 예제

 

options {
	STATIC = false;
}

PARSER_BEGIN(Adder)

import java.io.*;
 

class Adder {

  static public void main(String[] args) {
      for (String arg : args) {
          try {
              System.out.println(evaluate(arg));
          } catch (ParseException ex){ 
              System.err.println(ex.getMessage());
          }
      }
  }

  static public long evaluate(String src) throws ParseException {
      Reader reader = new StringReader(src);
      return new Adder(reader).expr();
  }
}

PARSER_END(Adder)

SKIP: { <[" ","\t","\r","\n"]>}

TOKEN: {
  <INTEGER: (["0"-"9"])+>
}

long expr():

{
	Token x, y;
}

{
  x=<INTEGER> "+" y=<INTEGER> <EOF>
	{
		return Long.parseLong(x.image) + Long.parseLong(y.image);
    }
}

Comment

더보기

options {

JavaCC 옵션

}

 

PARSER_BEGIN(파서클래스명)

package 패키지명;

import 라이브러리명;

 

public class 파서클래스명 {

Java 코드

}

 

PARSER_END(파서클래스명)

 

스캐너 작성

 

파서 작성

 

파서 클래스를 실행 시키기 위한 2단계

파서클래스의 인스턴스 작성

작성한 인스턴스에 대해 파싱하고 싶은 구문과

동일한 이름의 메서드 호출

 

{

Reader reader = new StringReader(src);

return new Adder(reader).expr();

}

 

JavaCC에는 4종류의 생성자가 존재.

Paser(InputStream s)

Parser(InputStream s, String encoding)

Parser(Reader r)

Parser(XXXXTokenManager tm)