티스토리 뷰



레몬 컴파일러 (LALR(1) parser generator)

http://www.hwaci.com/sw/lemon/

 

기본적인 문법(input file 의 syntax)

http://www.hwaci.com/sw/lemon/lemon.html >> Input File Syntax

 

tutorial

http://www.webdotdev.com/nvd/content/view/344/

 

1번에서 사용했던 example1.y 에 조금씩 변형을 가해 보자.

처음에 우리는 token type 을 int 로 사용했다. 근데 이것을 struct 로 수정해보자.

int type 을 Token type 으로 수정하게 되면서, 그에 맞게 grammar 에 적혀있는 

C code 도 수정을 가해야 한다. 거기에 더해 main 도 같이 수정해야 한다.(http://souptonuts.sourceforge.net/code/main_part3.html)

 

그리고 아무래도 Parse(0, 0, 0) 처럼 '0' 을 이용해서 endofinput 을 정의하는 것이 이상하다.

그래서 NEWLINE 을 이용하도록 수정해 보자.

 

아래처럼 grammar 를 수정해서 NEWLINE 을 추가하고,

NEWLINE 에 대한 정의를 해 놓지 않으면 된다.

 

main ::= in.
in ::= .
in ::= in program NEWLINE.

Parse (pParser, NEWLINE, t1);

 

그러면 예전에는 0 일때 destruction() 을 타게 되어 있지만,

이제는 NEWLINE 일때, 즉, Parse(pParser, NEWLINE, t1); 에서 destruction() 을 타게 된다.

 

이제 parser 를 만들었다. 이 parser 를 실제로 사용하는 예제는 아래를 참고하면 될 듯 하다.

http://www.webdotdev.com/nvd/content/view/344/99999999/1/4/

 

 

example1.y

-----

%token_type {Token}
%type expr {Token}



%left PLUS MINUS.
%left DIVIDE TIMES.

%include {
#include <assert.h>
#include <iostream>
#include "example1.h"

struct Token {
	const char *z;
	int value;
	unsigned n;
 };
 
 void token_destructor(Token t)
 {
	std::cout << "In token_destructor t.value= " << t.value << std::endl;
	std::cout << "In token_destructor t.n= " << t.n << std::endl;
 }

 } /* end of %include */

%token_destructor { token_destructor($$); }


main ::= in.
in ::= .
in ::= in program NEWLINE.
program ::= expr(A).   { std::cout << "Result=" << A << std::endl; }



expr(A) ::= expr(B) MINUS  expr(C).  { A.value = B.value -C.value; }
expr(A) ::= expr(B) PLUS  expr(C).   { A.value = B.value +C.value; }
expr(A) ::= expr(B) TIMES  expr(C).   { A.value = B.value *C.value; }
expr(A) ::= expr(B) DIVIDE expr(C).  {

          if(C.value != 0){
            A.value = B.value / C.value;
           }else{
            std::cout << "divide by zero" << std::endl;
            }

 }  /* end of DIVIDE */

expr(A) ::= NUM(B). {A.value =B.value ;}


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함