/* PARSER FOR
TYPE CHECKING */
Yacc program
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *yytext;
%}
%token INT FLOAT
CHAR ID SP
%left '+' '-'
%left '*' '/'
%left ','
%right '='
%%
S:DCL ST
{printf("CHECKED\n");}
DCL:INT SP IIDS';'
|FLOAT SP FIDS';'
|CHAR SP CHIDS';'
|DCL INT SP IIDS';'
|DCL FLOAT SP FIDS';'
|DCL CHAR SP CHIDS';'
CHIDS:ID
{insert(yytext,1);}
|CHIDS','ID {insert(yytext,1);}
IIDS:ID
{insert(yytext,2);}
|IIDS','ID {insert(yytext,2);}
FIDS:ID
{insert(yytext,3);}
|FIDS','ID {insert(yytext,3);}
ST:E';'
|ST E';'
E:E'+'E
{if(($$<$1)||($$<$3)){printf("+ error\n");exit(0);}}
|E'-'E
{if(($$<$1)||($$<$3)){printf("- error\n");exit(0);}}
|E'*'E
{if(($$<$1)||($$<$3)){printf("* error\n");exit(0);}}
|E'/'E {if(($$<$1)||($$<$3)){printf("/
error\n");exit(0);}}
|IDD'='E
{if(($$<$1)||($$<$3)){printf("= error\n");exit(0);}}
|IDD
IDD:ID
{$$=lookup(yytext);};
%%
#include
"lex.yy.c"
#include
"ctype.h"
struct types
{
char var[10];
int type;
}TC[10];
int top=0,i;int
main()
{
yyparse();
}
yyerror(char *s)
{
printf("%s\n",s);
}
insert(char *sl,int
tp)
{
strcpy(TC[top].var,sl);
TC[top].type=tp;
top++;
}
int lookup(char
*cc)
{
int flag=0;
for(i=0;i<top;i++)
{
if(strcmp(cc,TC[i].var)==0)
return(TC[i].type);
}
printf("lookup
error");
exit(0);
}
Lex program
%{
#include
"y.tab.h"
extern int yylval;
%}
%%
"char" {yylval=1;return CHAR;}
"int" {yylval=2;return INT;}
"float" {yylval=3;return FLOAT;}
[a-z]+ {return ID;}
[\t] ;
" " {return SP;}
[\n] {return 0;}
. {return yytext[0];}
%%
OUTPUT
int x,y;float
z;z=x+y;
CHECKED
int x;float y;x=y;
= error






0 comments:
Post a Comment