/* 4a. Write a LEX program to identify a valid C program */

%{
unsigned int openbr=1,closebr=0;
unsigned int maincount=0,validloop=0;
%}

let [a-zA-Z0-9\-+*/!%]
eol [\n]
re [<>&|=]
word {let}*{re}*{let}*[;]{eol}
m "main()"
f "for("{let}*{re}*{let}*[;]{let}*{re}*{let}*[;]{let}*{re}*{let}*")"
w "while("{let}*{re}*{let}*")"
d "do{"{eol}*{word}*"}while("{let}*{re}*{let}*")"[;]

%%
{m}[\n]"{" {maincount++;}
^{f} {validloop++;}
^{d} {validloop++;}
^{w} {validloop++;}
[ ]*{f} {validloop++;}
[ ]*{d} {validloop++;}
[ ]*{w} {validloop++;}
[{] {openbr++;}
[}] {closebr++;}
[\n] ;
. ;
%%

main(int argc,char *argv[])
{
    if(argc>1)
    {
        FILE *fp;
        fp=fopen(argv[1],"r");
        if(!fp)
        {
            fprintf(stderr,"Could not open the file %s\n",argv[1]);
            exit(1);
        }
        yyin=fp;
    }
    yylex();
    if((maincount==1) && (openbr==closebr))
    {
        printf("Valid C program\n");
        if(validloop>0)
        {
            printf("Valid loop exists\n");
            printf("Number of valid loops=%d\n",validloop);
        }
    }
    else
        printf("Not a valid C program\n");
    return(0);
}

 

 

/* 4b. Write a YACC program to a valid variable which starts with a letter followed by a digit ( letter should be in lower case ) */

%{
int count=0;
%}

%token letter;
%token digit;

%%

id:
    |id '\n'
    |id variable '\n'
;

variable:
    letter digit 
    |variable letter 
    |variable digit
;

%%

#include<stdio.h>
#include<ctype.h>
main()
{
    printf("\n enter the variable list ");
    yyparse();
}
yylex()
{
    int c;
    while((c=getchar())==' '||c=='\t');
        if(!isdigit(c))
            if(islower(c))
                return letter;
    if(isdigit(c))
        return digit;
    return c;
}
yyerror(char *s)
{
    printf("%s\n", s);
}