/*----------------HEADER FILES----------------*/ #include #include #include #include #define MAXT 15 #define MAXNT 10 #define MAX 20 /*----------------------FUNCTIONS-----------------*/ void split_prod(); void get_input(); int check(char,int,int); void items_construction(); int check_prod(struct productions,int,int); int check_items(int); void closure(struct productions,int); void compute_goto(); int check_first(char,char*,int); void list_prod(); void construct_first(); void first(char,char*,int); void construct_follow(); void follow(char,char*,int); int find_mapid(char); int find_mapid2(char); int map_prod(int,int); void construct_table(); void print_collections(); void print_parsetable(); void simulate(); void push(int); int top_stack(); int pop(); /*--------------GLOBAL VARIABLES------------------------*/ int num_prod,nt_id,t_id,uplim=0,uplim_fol=0; int total_item,parse_stack[MAX],top=0; char terminal[MAXT],nonterminal[MAXNT]; char first_strings[MAX][MAXT],follow_strings[MAX][MAXT]; /*-----------------STRUCTURES----------------------*/ struct actionp //ACTION PART { char sorr; int val; }; struct ptable //PARSE TABLE { int gotop[MAXNT]; struct actionp action[MAXT]; }parse_table[MAX]; struct productions //PRODUCTIONS { char left; char right[MAX]; int dot; }prod[MAX]; struct itemlist //COLLECTIONS { int nprod; struct productions prod_in_item[MAX]; }items[MAX]; /*------------FUNCTION DEFINITIONS----------------*/ void get_input() { //GETTING THE GRAMMAR INPUT int i; FILE *fp; fp=fopen("slr.txt","r"); if(!fp) { printf("Cant open file\n"); exit(1); } fscanf(fp,"%d\n",&num_prod); for(i=0;i=num_prod) break; fscanf(fp,"%c %s\n",&prod[i+1].left,prod[i+1].right); if(i==0) { prod[i].left='M'; prod[i].right[0]=prod[i+1].left; prod[i].right[1]='\0'; prod[i].dot=0; } prod[i+1].dot=0; } num_prod++; split_prod(); } void split_prod()//SPLITTING THE PRODUCTIONS INTO TERMINALS & NONTERMINALS { int i=0,k=0,l=0,j=0; for(i=0;i64&&prod[i].right[k]<91) { if(check(prod[i].right[k],j,1)==1) { nonterminal[j]=prod[i].right[k]; j++; } } else { if(check(prod[i].right[k],l,2)==2) { terminal[l]=prod[i].right[k]; l++; } } } } nonterminal[j]='\0'; terminal[l]='\0'; nt_id=j; t_id=l; } int check(char search,int limit,int status) { //CHECK FOR TERMINAL OR NONTERMINAL int i=0; if(status==1) { for(i=0;i%s\n",i,prod[i].left,prod[i].right); printf("\nFIRST:"); } void construct_first() { int i=0; //CONSTRUCTION OF FIRST char str[MAXT]; list_prod(); for(i=0;i%s",i,str); strcpy(first_strings[i],str); } } void first(char ch,char*str,int lim) { int i=0,k=0; //FIRST FUNCTION uplim=lim; for(i=0;i%s",i,str); fflush(stdout); strcpy(follow_strings[i],str); } } void follow(char ch,char*str,int lim) { int i=0,len=0,j=0,map_id=0,k=0; //FOLLOW FUNCTION char fchar; uplim_fol=lim; if(ch==nonterminal[0]) { if(check_first('$',str,uplim_fol)) { str[uplim_fol]='$'; uplim_fol++; } } for(i=0;i",items[i].prod_in_item[j].left); printf("%s],",items[i].prod_in_item[j].right); printf("%d)",items[i].prod_in_item[j].dot); } printf("\n"); } } void print_parsetable() { //DISPLAYS PARSE TABLE int i,j; printf("PARSE TABLE\n"); printf("\tGOTO\t\t\tACTION\n"); for(i=0;i