목차
1. 설명 및 algorithm
2. List
3. 실행 결과
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. 실행 결과
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. 실행 결과
키워드
추천자료
DTD에 관한 모든것
자바 기반의 보안 프로그래밍
에이다 [Ada]프로그래밍언어
병렬 프로그램
[레포트]프로그래밍
C/C++로 제작한 지뢰찾기
[자바][JAVA][자바스크립트]자바(JAVA)의 의미, 자바(JAVA)의 특징, 자바(JAVA)의 유래, 자바...
c로 쓴 자료구조론 연습문제 7장(정렬sorting)
2011년 2학기 컴퓨터구조 기말시험 핵심체크
리눅스(Linux)에 대하여 [A+] .PPT자료
파인만의 엉뚱발랄한 컴퓨터강의:계산이론
로봇의 구조
AVR ATmega128을 이용한 LED실험 해석 (avr atmega128,led실험,led점멸,led 시프트,쉬프트,pw...
2015년 1학기 C프로그래밍 기말시험 핵심체크