Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
/*
 * 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));
}
Пример #7
0
char    *term()
{
    char  *tempvar, *tempvar2 ;

    tempvar = factor();
    while( match( TIMES ) )
    {
        advance();
        tempvar2 = factor();
        printf("    %s *= %s\n", tempvar, tempvar2 );
        freename( tempvar2 );
    }

    return tempvar;
}
Пример #8
0
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;
}
Пример #9
0
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 );
    }
}
Пример #10
0
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;
}
Пример #11
0
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;
}
Пример #12
0
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;
}
Пример #13
0
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;
}
Пример #14
0
/*
 * 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;
}
Пример #15
0
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;
}
Пример #16
0
/*
 * 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;
}
Пример #17
0
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;
}
Пример #18
0
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);
    }
    

}
Пример #19
0
/*
 * 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);
	}
}
Пример #20
0
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 );
    }
}
Пример #21
0
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;
       
}