/* 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);
}