[컴파일러, Compiler] Lex & Yacc 를 이용한 Intermediate code 생성 Report
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

목차

1. 설명 및 algorithm

2. List

3. 실행 결과

본문내용

++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $1;
strcpy(first_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
temp_count++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $3 ;
strcpy(second_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
$$ = $1 * $3 ;
temp_count++ ;
make_temp();
sp = symlook(final_temp) ;
printf("%s = %s * %s \n",final_temp, first_temp, second_temp) ;
sp->value = $$ ;
yylval.symp = sp ;
}
|expression '/' expression
{
if($3 == 0.0)
yyerror("Divide by zero") ;
else
{
temp_count++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $1;
strcpy(first_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
temp_count++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $3 ;
strcpy(second_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
$$ = $1 / $3 ;
temp_count++ ;
make_temp();
sp = symlook(final_temp) ;
printf("%s = %s / %s \n",final_temp, first_temp, second_temp) ;
sp->value = $$ ;
yylval.symp = sp ;
}
}
|'-' expression %prec UMINUS
{
// temporary를 두 개 만드는 것만 다르다.
temp_count++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $2;
strcpy(first_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
$$ = -$2 ;
temp_count++ ;
make_temp();
sp = symlook(final_temp) ;
printf("%s = -%s \n",final_temp, first_temp) ;
sp->value = $$ ;
yylval.symp = sp ;
}
|'(' expression ')'
{
temp_count++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $2;
strcpy(first_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
$$ = $2 ;
temp_count++ ;
make_temp();
sp = symlook(final_temp) ;
printf("%s = (%s) \n",final_temp, first_temp) ;
sp->value = $$ ;
yylval.symp = sp ;
}
|NUMBER
|NAME
{
$$ = $1->value ;
}
|NAME '(' expression ')'
{
if($1->funcptr)
{
// 우선 $3의 값을 temporary에 저장후 함수 호출
// 계산 후 temporary에 별도로 저장.
temp_count++ ;
make_temp();
temp_val = symlook(final_temp) ;
temp_val->value = $3;
strcpy(first_temp, final_temp) ;
printf("%s = %g\n", final_temp, temp_val->value) ;
$$ = ($1->funcptr)($3) ;
temp_count++ ;
make_temp();
sp = symlook(final_temp) ;
printf("%s = %s(%s) \n",final_temp, $1->name, first_temp) ;
sp->value = $$ ;
yylval.symp = sp ;
}
else
{
printf("%s not a function\n", $1->name);
$$ = 0.0 ;
}
}
;
%%
/* look up a symbol table entry, add if not present */
struct symtab *
symlook(s)
char *s ;
{
char *p ;
struct symtab *sp ;
for(sp = symtab ; sp < &symtab[NSYMS] ; sp++)
{
/* is it already here? */
if(sp->name && !strcmp(sp->name, s))
return sp ;
/* is it free */
if(!sp->name)
{
sp->name = strdup(s) ;
return sp ;
}
}
yyerror("Too many symbols") ;
exit(1) ;
}
addfunc(name, func)
char *name ;
double (*func)() ;
{
struct symtab *sp = symlook(name) ;
sp->funcptr = func ;
}
main()
{
extern double sqrt(), exp(), log() ;
addfunc("sqrt", sqrt) ;
addfunc("exp", exp) ;
addfunc("log", log) ;
yyparse() ;
}
3. 실행 결과
  • 가격2,000
  • 페이지수11페이지
  • 등록일2009.03.18
  • 저작시기2008.5
  • 파일형식한글(hwp)
  • 자료번호#523711
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니