The BOTTOM LINE Quote Of The Day

The BOTTOM LINE Quote Of The Day

Don't Ever Tell GOD How BIG Your Problems are.
Just Tell Your Problems How BIG your GOD is ;)

Wednesday, November 28, 2012

Design and Implement a Calculator using ‘YACC’ and ‘LEX’


Calc.y

%{
#include <stdlib.h>
#include <stdio.h>
int yylex(void);
#include "y.tab.h"
%}

%token INTEGER

%%
program:
line program
| line

line:
expr '\n' { printf("%d\n",$1); }
| 'n'

expr:
expr '+' mulex { $$ = $1 + $3; }
| expr '-' mulex { $$ = $1 - $3; }
| mulex { $$ = $1; }

mulex:
mulex '*' term { $$ = $1 * $3; }
| mulex '/' term { $$ = $1 / $3; }
| term { $$ = $1; }

term:
'(' expr ')' { $$ = $2; }
| INTEGER { $$ = $1; }

%%
void yyerror(char *s)
{
fprintf(stderr,"%s\n",s);
return;
}
yywrap()
{
  return(1);
}

int main(void)
{
/*yydebug=1;*/
yyparse();
return 0;
}

Lexx.l

%{
#include <stdlib.h>
#include <stdio.h>
#include "y.tab.h"
void yyerror(char*);
extern int yylval;
%}


%%
[ \t]+ ;
[0-9]+ {yylval = atoi(yytext);
return INTEGER;}
[-+*/] {return *yytext;}
"(" {return *yytext;}
")" {return *yytext;}
\n {return *yytext;}
. {char msg[25];
sprintf(msg,"%s <%s>","invalid character",yytext);
yyerror(msg);}


Output :-

[S@localhost Desktop]$ flex lexx.l
[S@localhost Desktop]$ yacc -d calc.y
[S@localhost Desktop]$ gcc y.tab.c lex.yy.c
[S@localhost Desktop]$ ./a.out

5+6
11
8+9-7
10
6++9
syntax error
[S@localhost Desktop]$

No comments:

Post a Comment