/* * 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"); }
/* * 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"); }
/* 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"); } }
/* * 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"); }
/* 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"); } }
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); } }