Monday, 2 December 2013

Recognition of C language statements ("for" statement)

NOTE: THE SAME PROGRAM CAN BE USED FOR ANY KIND OF C STATEMENT (JUST CHANGE THE GRAMMAR IN YACC FILE) LIKE: IF-ELSE, WHILE, STRUCTURE, DO-WHILE, SWITCH-CASE, FUNCTIONS ETC ETC...

YACC:

%{
#include<stdio.h>
%}
%token NUMBER ID KEY

%%
input: input def '\n' { printf("Valid\n"); }
| error '\n' { printf("NO\n"); }
|
;
def: KEY '(' exp ';' exp ';' exp ')' ';'
| KEY '(' exp ';' exp ';' exp ')' '\n' stmts
;
exp: ID '=' NUMBER
| ID '<' NUMBER
| ID '+''+'
|
;
stmts: '{' '\n' dec '\n' '}'
;
dec: KEY var ';'
;
var: var ',' ID
| ID
;
%%
int parser()
{
yyparse();
}
int yyerror(char *s)
{
printf(":( %s",s);
}


LEX:

%{
#include "y.tab.h"
%}
number [0-9]+
id [A-Za-z][A-Za-z0-9]*
key "for"|"int"|"float"|"char"|"double"
other "("|")"|"{"|"}"|";"|","|"="|"<"|"+"
%%
{key} { return KEY; }
{other} { return *yytext; }
{id} { return ID; }
{number} { return NUMBER; }
[ \t] ;
\n { return *yytext; }
.
%%
int main(int argc,char *argv[])
{
yyin = fopen(argv[1],"r");
parser();
fclose(yyin);
}
int yywrap()
{
return 1;
}


FILE: filefor

for ( i = 0 ; j < 10 ; k ++ )
{
int a,b,c,d;
}


HOW TO RUN:
$ yacc -d for.y
$ lex for.l
$ gcc lex.yy.c y.tab.c -o f
$ ./f filefor

OUTPUT:
Valid

No comments:

Post a Comment