/* STAT1.C */ #include "stdafx.h" #include //#include #include "inp.h" #include "out.h" #include "lex.h" #include "code1.h" #include "expr1.h" #include "stat1.h" /******************************* STATEMENTS *******************************/ Stat * statement (void) { Stat * result = NULL; if (sy==GOTO_) /* goto */ { info ("goto"); NextSymbol (); result = new Stat; result->tag = GotoStat; result->e1 = expression (); CheckSymbol (SEMICOLON); } else if (sy==CONTINUE_) /* continue */ { info ("continue"); NextSymbol (); CheckSymbol (SEMICOLON); } else if (sy==BREAK_) /* break */ { info ("break"); NextSymbol (); CheckSymbol (SEMICOLON); } else if (sy==RETURN_) /* return */ { info ("return"); NextSymbol (); if (sy!=SEMICOLON) expression (); CheckSymbol (SEMICOLON); } else if (sy==WHILE_) /* while */ { open_info ("while"); NextSymbol (); CheckSymbol (LPAR); expression (); CheckSymbol (RPAR); statement (); close_info (); } else if (sy==DO_) /* do */ { open_info ("do"); NextSymbol (); statement (); CheckSymbol (WHILE_); CheckSymbol (LPAR); expression (); CheckSymbol (RPAR); CheckSymbol (SEMICOLON); close_info (); } else if (sy==FOR_) /* for */ { open_info ("for"); NextSymbol (); CheckSymbol (LPAR); if (sy!=SEMICOLON) expression (); CheckSymbol (SEMICOLON); if (sy!=SEMICOLON) expression (); CheckSymbol (SEMICOLON); if (sy!=RPAR) expression (); CheckSymbol (RPAR); statement (); close_info (); } else if (sy==IF_) /* if */ { open_info ("if"); NextSymbol (); CheckSymbol (LPAR); expression (); CheckSymbol (RPAR); close_info (); LAB_TYP lab_else, lab_end; new_label (lab_else); /* jmeno pro prostredni navesti */ new_label (lab_end); /* jmeno pro koncove navesti */ send_ext ("JF", lab_else); /* pokud neni podminka splnena skoc na else */ open_info ("then"); statement (); close_info (); if (sy==ELSE_) { NextSymbol (); send_ext ("JMP", lab_end); /* skok na konec prikazu */ send_label (lab_else); /* umisti prostredni navesti */ open_info ("else"); statement (); close_info (); } else { send_label (lab_else); /* prostredni navesti na stejnem miste jako koncove */ } send_label (lab_end); /* umisti koncove navesti */ } else if (sy==SWITCH_) /* switch */ { open_info ("switch"); NextSymbol (); CheckSymbol (LPAR); expression (); CheckSymbol (RPAR); statement (); close_info (); } else if (sy==LBRACE) /* { } */ { open_info ("compound statement"); NextSymbol (); while (sy!=RBRACE) statement (); NextSymbol (); close_info (); } else if (sy==CASE_) /* case */ { info ("case"); NextSymbol (); expression (); CheckSymbol (COLON); } else if (sy==DEFAULT_) /* default */ { info ("default"); NextSymbol (); CheckSymbol (COLON); } else /* label, expression, empty statement */ { info ("simple statement"); if (sy != SEMICOLON) { expression (); if (sy==COLON) statement (); } CheckSymbol (SEMICOLON); } return result; }