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