YACC
%{
#include<stdio.h>
#include<math.h>
int sym[26];
%}
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'
%right NEG
%right '^'
%%
program: program statement '\n'
|
;
statement: expr { printf("%d\n",$1); }
| VARIABLE '=' expr { sym[$1] = $3; }
;
expr: INTEGER
| VARIABLE { $$ = sym[$1]; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '-' expr %prec NEG { $$ = -$2; }
| expr '^' expr { $$ = pow($1,$3); }
| '(' expr ')' { $$ = $2; }
;
%%
int main()
{
printf("Enter Expression: ");
yyparse();
return 0;
}
int yyerror(char *s)
{
printf("%s",s);
return 0;
}
LEX
%{
#include "y.tab.h"
#include<stdio.h>
%}
%%
[0-9]+ { yylval = atoi(yytext); return INTEGER; }
[a-z] { yylval = *yytext; return VARIABLE; }
[-+()=*/^\n] { return *yytext; }
[ \t] ;
. yyerror("Invalid Character");
%%
int yywrap()
{
return 1;
}
%{
#include<stdio.h>
#include<math.h>
int sym[26];
%}
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'
%right NEG
%right '^'
%%
program: program statement '\n'
|
;
statement: expr { printf("%d\n",$1); }
| VARIABLE '=' expr { sym[$1] = $3; }
;
expr: INTEGER
| VARIABLE { $$ = sym[$1]; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '-' expr %prec NEG { $$ = -$2; }
| expr '^' expr { $$ = pow($1,$3); }
| '(' expr ')' { $$ = $2; }
;
%%
int main()
{
printf("Enter Expression: ");
yyparse();
return 0;
}
int yyerror(char *s)
{
printf("%s",s);
return 0;
}
LEX
%{
#include "y.tab.h"
#include<stdio.h>
%}
%%
[0-9]+ { yylval = atoi(yytext); return INTEGER; }
[a-z] { yylval = *yytext; return VARIABLE; }
[-+()=*/^\n] { return *yytext; }
[ \t] ;
. yyerror("Invalid Character");
%%
int yywrap()
{
return 1;
}
HOW TO RUN:
$ yacc -d cal.y
$ lex cal.l
$ gcc lex.yy.c y.tab.c -lm -o cal
$ ./cal
OUTPUT:
Enter Expression: 2+3
5
1
1
e=1
f=3
g=e+f
g
4
No comments:
Post a Comment