/* 5a. Write a LEX program to count number of printf's and scanf's in a given program */
%{
#include"stdio.h"
int pcount=0;
int scount=0;
%}
%%
"printf" fprintf(yyout,"write");pcount++;
"scanf" fprintf(yyout,"read");scount++;
%%
main()
{
yyin=fopen("tester.c","r");
yyout=fopen("otester","w");
yylex();
printf("\nprintf count=%d\nscanf count=%d\n",pcount,scount);
fclose(yyin);
fclose(yyout);
}
/* 5b. Write a YACC program to evaluate agiven expression */
%{
#include"stdio.h"
#define YYSTYPE float
%}
%token NUM
%left '+' '-'
%left '*' '/'
%%
list:
|list '\n'
|list exp '\n' { printf("%f",$2); }
;
exp: NUM { $$=$1; }
|exp '+' exp { $$=$1+$3;}
|exp '-' exp { $$=$1-$3;}
|exp '*' exp { $$=$1*$3;}
|exp '/' exp { $$=$1/$3;}
|'('exp')' { $$=$2; }
;
%%
main()
{
yyparse();
}
yylex()
{
int c;
while((c=getchar())==' ' || c=='\t');
if(isdigit(c) || c=='.')
{
ungetc(c,stdin);
scanf("%f",&yylval);
return NUM;
}
return c;
}
yyerror(char *s)
{
printf("%s",s);
}