Using lex-yacc check for loop statement in a C program
YACC FILE
Source Code:
%{
#include
void yyerror(char *);
int yylex();
%}
%token FOR INC DEC AND OR NTEQ EQ LT LTEQ GT GTEQ ID NUM
%%
forloop : FOR '(' ass ';' cond ';' ass ')' '{' '}' {printf("parsing successful");}
;
ass : ID opt
;
opt : '=' e
| INC
| DEC
;
e : e '+' t
| t
;
t : t '*' f
| f
;
f : '(' e ')'
| nid
;
cond : scond
| scond logop cond
;
scond : nid
| nid relop nid
;
nid : ID
| NUM
;
logop : AND
| OR
;
relop : NTEQ
| EQ
| LT
| LTEQ
| GT
| GTEQ
;
%%
void yyerror(char *s)
{
printf("\nparsing err ");
}
int main()
{
yyparse();
return 0;
}
Lex FILE
Source Code:
%{
%{
#include "y.tab.h"
void yyerror(char *);
%}
%%
"for" {return FOR;}
"++" {return INC;}
"--" {return DEC;}
"&&" {return AND;}
"||" {return OR;}
"!=" {return NTEQ;}
"==" {return EQ;}
"<" {return LT;}
"<=" {return LTEQ;}
">" {return GT;}
">=" {return GTEQ;}
[=,{}();] {return *yytext;}
[ \t\n]+ ;
[a-zA-Z_][a-zA-Z0-9_]* {return ID;}
[0-9]+ {return NUM;}
. {printf("\n\nlex err");}
%%
int yywrap()
{
return 1;
}
OUTPUT:
[cmsa1@localhost forloop]$ yacc -d for.y
[cmsa1@localhost forloop]$ lex for.l
[cmsa1@localhost forloop]$ cc y.tab.c lex.yy.c -o a
[cmsa1@localhost forloop]$ ./a<a1
parsing successful[cmsa1@localhost forloop]$
0 comments