char *termp() { /* termp -> term expr' expr' -> PLUS term expr' | MINUS term expr' | є */ // printf("enter termp %s", yytext); char *tempvar, *tempvar2; tempvar=term(); //printf("in termp %c\n", *yytext ); while(match(MINUS) || match(PLUS)) { //printf("looping %c ", *yytext); while( match( PLUS ) ) { advance(); tempvar2 = term(); printf("%s += %s\n", tempvar, tempvar2 ); int f1=tempvar[1]-'0'; int f2=tempvar2[1]-'0'; //printf("%d %d", f1, f2); FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "add %s , %s \n", lookup[f1], lookup[f2]); fclose(file1); freename( tempvar2 ); } // if(flagp==1)continue; while( match( MINUS ) ) { advance(); tempvar2 = term(); printf("%s -= %s\n", tempvar, tempvar2 ); int f1=tempvar[1]-'0'; int f2=tempvar2[1]-'0'; FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "sub %s , %s \n", lookup[f1], lookup[f2]); fclose(file1); freename( tempvar2 ); } } //printf("returning termp\n"); return tempvar; }
char *relation() { /* relation -> expression relation' * relation' -> (EQUAL | LT | GT) expression relation'' | epsilon */ char *tempvar, *tempvar2; int equal; int lt; tempvar = expression(); while( ( equal = match( EQUAL ) ) || ( lt = match( LT )) || match( GT ) ) { advance(); tempvar2 = expression(); if( equal ) printf(" %s = %s == %s\n", tempvar, tempvar, tempvar2 ); else if( lt ) printf(" %s = %s < %s\n", tempvar, tempvar, tempvar2 ); else printf(" %s = %s > %s\n", tempvar, tempvar, tempvar2 ); freename( tempvar2 ); } return tempvar; }
char *sub(void){ char *var1, *var2; var1 = sum(); while(match(MINUS)){ advance(); var2 = sum(); //printf("%s = %s - %s\n", var1,var1,var2); //printf("SUB %s, %s\n",var2,var1 ); fprintf(f,"SUB %s, %s\n",var2,var1 ); freename(var2); } return var1; }
char *sum(void){ char *var1, *var2; var1 = product(); while(match(PLUS)){ advance(); var2 = product(); //printf("%s = %s + %s\n", var1,var1,var2); //printf("ADD %s, %s\n", var2,var1); fprintf(f,"ADD %s, %s\n", var2,var1); freename(var2); } return var1; }
char *product(void){ char *var1, *var2; var1 = fraction(); while(match(TIMES)){ advance(); var2 = fraction(); //printf("%s = %s * %s\n", var1,var1,var2); //printf("IMUL %s, %s\n", var2, var1); fprintf(f,"IMUL %s, %s\n", var2, var1); freename(var2); } return var1; }
/* * Change a name to a unique temporary name. */ void mktempname(struct entry *ep) { char oldname[MAXPATHLEN]; if (ep->e_flags & TMPNAME) badentry(ep, "mktempname: called with TMPNAME"); ep->e_flags |= TMPNAME; (void) strcpy(oldname, myname(ep)); freename(ep->e_name); ep->e_name = savename(gentempname(ep)); ep->e_namlen = strlen(ep->e_name); renameit(oldname, myname(ep)); }
char *term() { char *tempvar, *tempvar2 ; tempvar = factor(); while( match( TIMES ) ) { advance(); tempvar2 = factor(); printf(" %s *= %s\n", tempvar, tempvar2 ); freename( tempvar2 ); } return tempvar; }
char *term() { char *tempvar, *tempvar2 ; int times; tempvar = factor(); while( ( times = match( TIMES )) || match( DIV ) ) { advance(); tempvar2 = factor(); if( times ) printf(" %s *= %s\n", tempvar, tempvar2 ); else printf(" %s /= %s\n", tempvar, tempvar2 ); freename( tempvar2 ); } return tempvar; }
statements() { /* statements -> expression SEMI | expression SEMI statements */ char *tempvar; while( !match(EOI) ) { tempvar = expression(); if( match( SEMI ) ) advance(); else fprintf( stderr, "%d: Inserting missing semicolon\n", yylineno ); freename( tempvar ); } }
char *less(void){ char *var1, *var2; var1 = sub(); while(match(LT)){ comp_count++; advance(); var2 = sub(); //printf("%s=%s < %s\n", var1,var1,var2); fprintf(f, "CMP %s, %s\n", var2,var1); fprintf(f, "JL CMP0%d\n", comp_count, comp_count); fprintf(f, "MOVB $0, %s\n",var1 ); fprintf(f, "JMP CMP1%d\n", comp_count); fprintf(f, "CMP0%d:\nMOVB $1, %s\n", comp_count, var1 ); fprintf(f, "CMP1%d:\n", comp_count); freename(var2); } return var1; }
char *fraction(void){ char *var1, *var2; var1 = factor(); while(match(DIV)){ advance(); var2 = factor(); //printf("%s = %s / %s\n", var1,var1,var2); //printf("MOV %s,%s\n", var1, ACCUMULATOR ); //printf("DIV %s\n", var2); //printf("MOV %s, %s\n", ACCUMULATOR,var1); fprintf(f, "MOVB $0, %s \n", "\%ah"); fprintf(f,"MOVB %s,%s\n", var1, ACCUMULATOR ); fprintf(f,"DIV %s\n", var2); fprintf(f,"MOVB %s, %s\n", ACCUMULATOR,var1); freename(var2); } return var1; }
char *expression(void){ char *var1, *var2; var1 = great(); while(match(EQUALS)){ comp_count++; advance(); var2 = great(); //printf("%s = %s == %s\n", var1, var2); fprintf(f, "CMP %s, %s\n", var1,var2); fprintf(f, "JE CMP0%d\n", comp_count, comp_count); fprintf(f, "MOVB $0, %s\n",var1 ); fprintf(f, "JMP CMP1%d\n", comp_count); fprintf(f, "CMP0%d:\nMOVB $1, %s\n", comp_count, var1 ); fprintf(f, "CMP1%d:\n", comp_count); freename(var2); } return var1; }
char *expression() { /* expression -> term expression' * expression' -> PLUS term expression' | epsilon */ char *tempvar, *tempvar2; tempvar = term(); while( match( PLUS ) ) { advance(); tempvar2 = term(); printf(" %s += %s\n", tempvar, tempvar2 ); freename( tempvar2 ); } return tempvar; }
/* * delete an entry from the symbol table */ void freeentry(struct entry *ep) { struct entry *np; ino_t inum; if (ep->e_flags != REMOVED) badentry(ep, "not marked REMOVED"); if (ep->e_type == NODE) { if (ep->e_links != NULL) badentry(ep, "freeing referenced directory"); if (ep->e_entries != NULL) badentry(ep, "freeing non-empty directory"); } if (ep->e_ino != 0) { np = lookupino(ep->e_ino); if (np == NULL) badentry(ep, "lookupino failed"); if (np == ep) { inum = ep->e_ino; deleteino(inum); if (ep->e_links != NULL) addino(inum, ep->e_links); } else { for (; np != NULL; np = np->e_links) { if (np->e_links == ep) { np->e_links = ep->e_links; break; } } if (np == NULL) badentry(ep, "link not found"); } } removeentry(ep); freename(ep->e_name); ep->e_next = freelist; freelist = ep; }
char *expression() { /* expression -> term expression' * expression' -> PLUS term expression' | epsilon */ char *tempvar, *tempvar2; int plus; tempvar = term(); while( ( plus = match( PLUS ) ) || match( MINUS ) ) { advance(); tempvar2 = term(); if( plus ) printf(" %s += %s\n", tempvar, tempvar2 ); else printf(" %s -= %s\n", tempvar, tempvar2 ); freename( tempvar2 ); } return tempvar; }
/* * Relocate an entry in the tree structure */ void moveentry(struct entry *ep, char *newname) { struct entry *np; char *cp; np = lookupparent(newname); if (np == NULL) badentry(ep, "cannot move ROOT"); if (np != ep->e_parent) { removeentry(ep); ep->e_parent = np; ep->e_sibling = np->e_entries; np->e_entries = ep; } cp = strrchr(newname, '/') + 1; freename(ep->e_name); ep->e_name = savename(cp); ep->e_namlen = strlen(cp); if (strcmp(gentempname(ep), ep->e_name) == 0) ep->e_flags |= TMPNAME; else ep->e_flags &= ~TMPNAME; }
char *term() { /* term -> factor term' term' -> TIMES factor term' | DIVIDE factor term' | є */ // printf("enter term %s", yytext); char *tempvar, *tempvar2 ; tempvar = factor(); //printf("return factor\n"); while(1) { int flagp=0,flagm=0; if(match(TIMES)) flagp=1; if(match(DIV)) flagm=1; if(flagp==0&&flagm==0)break; while( match( TIMES ) ) { advance(); tempvar2 = factor(); printf("%s *= %s\n", tempvar, tempvar2 ); int f1=tempvar[1]-'0'; int f2=tempvar2[1]-'0'; FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "mov AL , %s \nmul %s\n", lookup[f2], lookup[f1]); fclose(file1); freename( tempvar2 ); } while( match( DIV ) ) { advance(); tempvar2 = term(); printf("%s /= %s\n", tempvar, tempvar2 ); int f1=tempvar[1]-'0'; int f2=tempvar2[1]-'0'; FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "mov AL , %s \ndiv %s\n", lookup[f1], lookup[f2]); fclose(file1); freename( tempvar2 ); } } //printf("returning from term\n"); return tempvar; }
statement() { /* statement -> expression SEMI * | expression SEMI statement */ /* expression(); if( match( SEMI ) ) advance(); else fprintf( stderr, "%d: Inserting missing semicolon\n", yylineno ); if( !match(EOI) ) statements(); // Do another statement. */ if(match(ID)){ char *var1 = current_lexeme(), *var2; add_to_table(var1); advance(); if(match(ASSIGN)){ advance(); var2 = expression(); if(!var2){ printf("%d: Expression expected\n", yylineno); return; } //printf("%s = %s \n", var1,var2); //printf("MOV %s,%s\n", var2,var1); fprintf(f,"MOVB %s,%s\n", var2,var1); freename(var2); free(var1); } else fprintf(stderr, "%d: Not a valid assignment\n",yylineno); } else if(match(IF)){ char *var1; if_count++; int temp_if_count = if_count; advance(); var1 = expression(); if(!var1){ fprintf(stderr, "%d: Invalid Expression\n",yylineno); return; } //printf("CMP %s, $0\n",var1 ); //printf("JLE Else%d\n",if_count); fprintf(f, "MOVB $0, %s \n", ACCUMULATOR); fprintf(f,"CMP %s, %s \n",ACCUMULATOR,var1); fprintf(f,"JLE Else%d\n",temp_if_count); if(match(THEN)){ //printf("if(%s){\n", var1); freename(var1); advance(); statement(); //printf("Else%d:\n",if_count); fprintf(f,"Else%d:\n",temp_if_count); //printf("}\n"); } else fprintf(stderr, "%d: Then expected after if\n", yylineno); } else if(match(WHILE)){ char *var; while_count++; int temp_while_count = while_count; advance(); var = expression(); if(!var){ fprintf(stderr, "%d: Invalid Expression\n",yylineno); return; } // printf("While%d:\n",while_count); // printf("CMP %s, $0\n", var); // printf("JLE Exit%d\n", while_count); fprintf(f, "MOVB $0, %s \n", ACCUMULATOR); fprintf(f,"While%d:\n",temp_while_count); fprintf(f,"CMP %s, %s\n", ACCUMULATOR,var); fprintf(f,"JLE Exit%d\n", temp_while_count); if(match(DO)){ //printf("while\t(%s)\n", var); //printf("do{\n"); advance(); statement(); //printf("}\n"); freename(var); // printf("JMP While%d\n",while_count); // printf("Exit%d:\n",while_count); fprintf(f,"JMP While%d\n",temp_while_count); fprintf(f,"Exit%d:\n",temp_while_count); } else fprintf(stderr, "%d: Do expected after while\n", yylineno); } else if(match(BEGIN)){ printf("begin\n"); advance(); opt_statements(); if(match(END)){ printf("end\n"); advance(); } else fprintf(stderr, "%d End expected begin\n", yylineno); } else if(match(EOI)){ // printf("thu\n"); return; } else{ fprintf(stderr, "%d: Statement Expected\n", yylineno); exit(1); } }
/* * Do an "ls" style listing of a directory */ static void printlist(const char *name, char *basename) { struct afile *fp, *list, *listp = NULL; struct direct *dp; struct afile single; RST_DIR *dirp; int entries, len, namelen; char locname[MAXPATHLEN + 1]; dp = pathsearch(name); if (dp == NULL || (!dflag && TSTINO(dp->d_ino, dumpmap) == 0) || (!vflag && dp->d_ino == UFS_WINO)) return; if ((dirp = rst_opendir(name)) == NULL) { entries = 1; list = &single; mkentry(name, dp, list); len = strlen(basename) + 1; if (strlen(name) - len > (unsigned short)single.len) { freename(single.fname); single.fname = savename(&name[len]); single.len = strlen(single.fname); } } else { entries = 0; while ((dp = rst_readdir(dirp))) entries++; rst_closedir(dirp); list = (struct afile *)malloc(entries * sizeof(struct afile)); if (list == NULL) { fprintf(stderr, "ls: out of memory\n"); return; } if ((dirp = rst_opendir(name)) == NULL) panic("directory reopen failed\n"); fprintf(stderr, "%s:\n", name); entries = 0; listp = list; strncpy(locname, name, MAXPATHLEN); strncat(locname, "/", MAXPATHLEN); namelen = strlen(locname); while ((dp = rst_readdir(dirp))) { if (dp == NULL) break; if (!dflag && TSTINO(dp->d_ino, dumpmap) == 0) continue; if (!vflag && (dp->d_ino == UFS_WINO || strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)) continue; locname[namelen] = '\0'; if (namelen + dp->d_namlen >= MAXPATHLEN) { fprintf(stderr, "%s%s: name exceeds %d char\n", locname, dp->d_name, MAXPATHLEN); } else { strncat(locname, dp->d_name, (int)dp->d_namlen); mkentry(locname, dp, listp++); entries++; } } rst_closedir(dirp); if (entries == 0) { fprintf(stderr, "\n"); free(list); return; } qsort((char *)list, entries, sizeof(struct afile), fcmp); } formatf(list, entries); if (dirp != NULL) { for (fp = listp - 1; fp >= list; fp--) freename(fp->fname); fprintf(stderr, "\n"); free(list); } }
statements() { /* stmt → id := expr | if expr then stmt | while expr do stmt | begin opt_stmts end */ // int flag=0; char *tempvar; while( !match(EOI) ) { //stmt → id := expr; //printf("enter st while\n"); if( match( SEMI ) ) { // if(flag==1) // { // freename(tempvar2); // freename(tempvar3); // } break; } if(match(ID)) { char* id; id =malloc(sizeof(char)*yyleng); int comp; for( comp = 0;comp<yyleng;comp++) { id[comp]=yytext[comp]; } id[comp]='\0'; advance(); if(match(COLE)) { //printf("match cole\n"); advance(); //advance(); //expression(); tempvar = expression(); printf("%s = %s\n\n", id, tempvar ); id_check(id); int f1=tempvar[1]-'0'; //printf("%d %d", f1, f2); FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "mov %s , %s \n", id, lookup[f1]); fclose(file1); // int f1=tempvar[1]-'0'; // printf("mov \n", lookup[f2], lookup[f1]); } // printf("if %s=%s", ); else { printf("Unknown grammar"); break; } } else if(match(IF)) { advance(); tempvar = expression(); if(match(THEN)) advance(); printf("if %s then ", tempvar); int f1=tempvar[1]-'0'; int f2=0; if(tempvar[2]=='=') { f2=tempvar[5]-'0'; FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "cmp %s , %s \n", lookup[f1], lookup[f2]); char lab[7]="labelx"; lab[5]=(char)(count+48); strcpy(label, lab); count++; fprintf(file1, "jne %s\n", lab); fclose(file1); } else if(tempvar[2]=='<') { //printf("gerer"); f2=tempvar[4]-'0'; FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "cmp %s , %s \n", lookup[f1], lookup[f2]); char lab[7]="labelx"; lab[5]=(char)(count+48); strcpy(label, lab); count++; fprintf(file1, "jnbe %s\n", lab); fclose(file1); } else { f2=tempvar[4]-'0'; FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "cmp %s , %s \n", lookup[f2], lookup[f1]); char lab[7]="labelx"; lab[5]=(char)(count+48); strcpy(label, lab); count++; fprintf(file1, "jnbe %s\n", lab); fclose(file1); } //printf("IFIFIF %s, %s \n", lookup[f1], lookup[f2]); } else if(match(WHILE)) { //printf("match while\n"); advance(); //flag=1; tempvar = expression(); if(match(DO)) advance(); // char *tempvar2=newname(); // char *tempvar3=newname(); // printf("%s=%c%c",tempvar2,tempvar[0],tempvar[1]); // if(tempvar[2]=='=') // { // printf("%s=%c%c",tempvar3,tempvar[4],tempvar[5]); // printf("while %s==%s do ", tempvar2,tempvar3); // } // else if(tempvar[2]=='<'|| tempvar[2]=='>') // { // printf("%s=%c%c",tempvar3,tempvar[3],tempvar[4]); // printf("while %s%c%s do", tempvar2, tempvar[2], tempvar3); // } printf("while %s do\n", tempvar ); } else if(match(BEGIN)) { advance(); printf("begin\n"); tempvar = opt_statement(); if(match(END)) { printf("end "); { FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "%s:\n", label); fclose(file1); } freename( tempvar ); advance() ;break;}// advance(); } else if(match(END)) { printf("end "); { FILE* file1=fopen("8086.txt", "a"); fprintf(file1, "%s:\n", label); fclose(file1); } //printf("begin end1 "); freename( tempvar );advance();break; } freename( tempvar ); } }
char *expression() { //printf("enter expr %s", yytext); //expr -> termp expr'' char *tempvar, *tempvar2, *tempvar3; tempvar = termp(); //printf("returned frrm termp\n"); // Grammar for expr'' // expr'' -> LESSTHAN termp expr'' | GREATERTHAN termp expr'' | EQUALTO termp expr'' | є while(match(LESSTHAN) || match(GREATERTHAN) || match(EQUALTO)) { while( match( LESSTHAN ) ) { advance(); tempvar2 = termp(); char* longone; longone =malloc(sizeof(char)*(strlen(tempvar)+strlen(tempvar2)+4)); memset(longone, '\0', sizeof(char)*(strlen(tempvar)+strlen(tempvar2)+4)); strcat(longone,tempvar); strcat(longone,"<"); strcat(longone,tempvar2); //printf("%s= %s < %s\n", tempvar,tempvar, tempvar2 ); freename( tempvar2 ); freename(tempvar); return longone; } //if(flagl=1)continue; while( match( GREATERTHAN ) ) { advance(); tempvar2 = termp(); char* longone; longone =malloc(sizeof(char)*(strlen(tempvar)+strlen(tempvar2)+4)); memset(longone, '\0', sizeof(char)*(strlen(tempvar)+strlen(tempvar2)+4)); strcat(longone,tempvar); strcat(longone,">"); strcat(longone,tempvar2); //printf("%s=%s > %s\n", tempvar, tempvar, tempvar2 ); freename( tempvar2 ); freename(tempvar); return longone; } //if(flagg=1)continue; while( match( EQUALTO ) ) { advance(); //printf("match ="); tempvar2 = termp(); char* longone; longone =malloc(sizeof(char)*(strlen(tempvar)+strlen(tempvar2)+4)); memset(longone, '\0', sizeof(char)*(strlen(tempvar)+strlen(tempvar2)+4)); // //strcat() strcat(longone,tempvar); strcat(longone,"=="); strcat(longone,tempvar2); //printf("%s= %s == %s\n", tempvar,tempvar, tempvar2 ); freename( tempvar2 ); freename(tempvar); return longone; } } //printf("returning expr\n"); return tempvar; }