Esempio n. 1
0
/*
 * Production: Selection Statement
 * FIRST set: { KW_T (only IF) }
 */
void selection_statement(void) {
    match(KW_T, IF);
    match(LPR_T, NO_ATTR);
    conditional_expression();
    match(RPR_T, NO_ATTR);
    match(KW_T, THEN);
    opt_statements();
    match(KW_T, ELSE);
    match(LBR_T, NO_ATTR);
    opt_statements();
    match(RBR_T, NO_ATTR);
    match(EOS_T, NO_ATTR);
    gen_incode("PLATY: IF statement parsed");
}
Esempio n. 2
0
/*
 * Production: Program
 * FIRST set: { KW_T (only PLATYPUS) }
 */
void program(void) {
    match(KW_T, PLATYPUS);
    match(LBR_T,NO_ATTR);
    opt_statements();
    match(RBR_T,NO_ATTR);
    gen_incode("PLATY: Program parsed");
}
Esempio n. 3
0
/* FIRST(selection statement)={IF}
<selection statement> ->
	IF (<conditional expression>) THEN <opt_statements> 
	ELSE { <opt_statements> } ; 
Author: Kyle Hinskens */
void selection_statement(void){
	if (lookahead_token.attribute.get_int == IF){
		match(KW_T,IF);
		match(LPR_T,NO_ATTR);
		conditional_expression();
		match(RPR_T,NO_ATTR);
		match(KW_T,THEN);
		opt_statements();
		match(KW_T,ELSE);
		match(LBR_T,NO_ATTR);
		opt_statements();
		match(RBR_T,NO_ATTR);
		match(EOS_T,NO_ATTR);
		gen_incode("IF statement parsed");
	}
}
Esempio n. 4
0
/*
 * Production: Iteration Statement
 * FIRST set: { KW_T (only USING) }
 */
void iteration_statement(void) {
    match(KW_T, USING);
    match(LPR_T, NO_ATTR);
    assignment_expression();
    match(COM_T, NO_ATTR);
    conditional_expression();
    match(COM_T, NO_ATTR);
    assignment_expression();
    match(RPR_T, NO_ATTR);
    match(KW_T, REPEAT);
    match(LBR_T, NO_ATTR);
    opt_statements();
    match(RBR_T, NO_ATTR);
    match(EOS_T, NO_ATTR);
    gen_incode("PLATY: USING statement parsed");
}
Esempio n. 5
0
/* FIRST(iteration statement)={USING}
<iteration statement> ->
	USING (<assignment expression>, <conditional expression>, <assignment expression>) 
		REPEAT {
			< opt_statements>
		};
Author: Kwok Hong Kelvin Chan */
void iteration_statement(void) {
	if (lookahead_token.code == KW_T && lookahead_token.attribute.get_int == USING) {
		match(KW_T,USING);
		match(LPR_T,NO_ATTR);
		assignment_expression();
		match(COM_T, NO_ATTR);
		conditional_expression();
		match(COM_T, NO_ATTR);
		assignment_expression();
		match(RPR_T,NO_ATTR);
		match(KW_T,REPEAT);
		match(LBR_T,NO_ATTR);
		opt_statements();
		match(RBR_T,NO_ATTR);
		match(EOS_T,NO_ATTR);
		gen_incode("USING statement parsed");
	}
}
Esempio n. 6
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);
    }
    

}