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
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