%{
#define FUNCT 300
#define IDENTIFIER 301
#define ASSGN 302
#define INTEGER 303
#define PRINT 304
#define TEXT 305
#define INPUT 306
#define CONTINUE 307
#define RETURN 308
#define IF 309
#define THEN 310
#define ENDIF 311
#define ELSE 312
#define WHILE 313
#define DO 314
#define ENDDO 315
#define END 316
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_SYM 200
int found;
void initialize();
void create(char *lexeme, int scope, char type, char usage);
int readsymtab(char *lexeme, int scope, char usage);
%}
%%
[\t ]+ {}
= {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(ASSGN) ;}
print {int found = readsymtab(yytext,0,'L'); //line 39
if(found == -1)
{
create(yytext,0,'S','L');
};
return(PRINT) ;}
input {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(INPUT) ;}
continue {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(CONTINUE) ;}
return {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(RETURN) ;}
if {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(IF) ;}
then {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(THEN) ;}
endif {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(ENDIF) ;}
else {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(ELSE) ;}
while {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(WHILE) ;}
do {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(DO) ;}
enddo {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(ENDDO) ;}
end {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(END);
exit(0); ;}
funct {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'S','L');
};
return(FUNCT) ;}
[0-9]+ {int found = readsymtab(yytext,0,'L');
if(found == -1)
{
create(yytext,0,'I','L');
};
return(FUNCT) ;}
[a-zA-Z]+ {int found = readsymtab(yytext,0,'I');
if(found == -1)
{
create(yytext,0,'S','I');
};
return(IDENTIFIER) ;}
\"[^\"\n]+|[\\n]+\" {int found = readsymtab(yytext,0,'L'); //line130
if(found == -1)
{
create(yytext,0,'S','L');
};
return(TEXT) ;}
. {return(yytext[0]) ;}
%%
//new variable declaration
int num;
int scope;
struct symbtab
{
char Lexeme [18];
int Scope;
char Type;
char Usage;
int Reference;
};
struct symbtab arr_symtab[200]; //data structure in which the symbol table entries are stored
void print_fn() //function which actually prints the symbol tabel in columnar form
{
int rows;
printf("Row No Lexeme Scope Type Usage Reference\n");
for (rows=0; rows<=num; rows++){
printf("%6d %-16s %-7d %-7c %-7c %-7d \n",rows, arr_symtab[rows].Lexeme,arr_symtab[rows].Scope,arr_symtab[rows].Type,arr_symtab[rows].Usage,arr_symtab[rows].Reference);
}
}
void initialize() //function which enteres the initial value into the symbol table
{
num = -1;
int scope = 0;
char lexeme[18]= "FRED";
char type = 'I';
char usage = 'L';
create(lexeme,scope,type,usage);
}
void create(char *lexeme, int scope, char type, char usage) //function which creates a new entry in the symbol table
{
int reference;
if(type=='I' && usage =='L')
reference = atoi(lexeme);
else
reference = -1;
num = num+1;
strcpy(arr_symtab[num].Lexeme, lexeme);
arr_symtab[num].Scope = scope;
arr_symtab[num].Type = type;
arr_symtab[num].Usage = usage;
arr_symtab[num].Reference = reference;
}
int readsymtab(char *lexeme, int scope, char usage) //function which checks if the entry is already in the table or not and the takes the required action
{
for(int i=num; i>=0; i--){
int comp = strcmp(arr_symtab[i].Lexeme, lexeme);
if(comp==0 && arr_symtab[i].Scope==scope && arr_symtab[i].Usage==usage)
{
return i;
}
else
{
return -1;
}
}
}
int main()
{
//other lines
printf("\n COURSE: CSCI50200 NAME: Aryan Banyal NN: 01 Assignment #: 04 \n");
initialize();
yylex();
print_fn();
printf("End of test.\n");
return 0;
}
int yywrap ()
{
return 1;
}
Following is the output for print"aryan banyal"
COURSE: CSCI50200 NAME: Aryan Banyal NN: 01 Assignment #: 04
--(end of buffer or a NUL)
--accepting rule at line 39 ("print")
Row No Lexeme Scope Type Usage Reference
0 FRED 0 I L 0
1 print 0 S L -1
End of test.
As you can see it's not even going to the "aryan banyal" part just does the print thing and exits... Following is the output for "aryan banyal"
COURSE: CSCI50200 NAME: Aryan Banyal NN: 01 Assignment #: 04
--(end of buffer or a NUL)
--accepting rule at line 130 (""aryan banyal")
Row No Lexeme Scope Type Usage Reference
0 FRED 0 I L 0
1 "aryan banyal 0 S L -1
End of test.
It shoud be aryan banyal there on Row No 1 but there a " before for some reason.