static struct selection_statement *parse_selection_statement(struct parser *parser) { union token tok = lexer_next_token(parser->lexer); switch (tok.tok_tag) { case TOK_IF: return parse_if_statement(parser); case TOK_SWITCH: return parse_switch_statement(parser); default: panic("invalid selection statement"); } }
void test_if_statement() { char tmp; FILE *inn = fopen("tests/test_if_statement.txt", "r"); init_fake_symbol_table(); while (!feof(inn)) { in = fopen("test.txt", "w+"); while ((tmp = fgetc(inn)) != '}' && tmp != -1 && tmp >31) fprintf(in, "%c", tmp); if (tmp == EOF) break; if (tmp <= 31) continue; fseek(in, 0, SEEK_SET); idx = 0; printf("******************\n"); get_token_with_history(); label_top = 0; temp_table_top = 0; quadruple_top = 0; parse_if_statement(); print_quadruples(); fclose(in); remove("test.txt"); } }
// statement = declaration | return_statement | if_statement // assignment | expression [ ";" ] static enum v7_err parse_statement(struct v7 *v7, int *is_return_statement) { if (*v7->cursor == '_' || is_alpha(*v7->cursor)) { TRY(parse_identifier(v7)); // Load identifier into v7->tok, v7->tok_len if (test_token(v7, "var", 3)) { TRY(parse_declaration(v7)); } else if (test_token(v7, "return", 6)) { TRY(parse_return_statement(v7)); if (is_return_statement != NULL) *is_return_statement = 1; } else if (test_token(v7, "if", 2)) { TRY(parse_if_statement(v7)); } else { v7->cursor = v7->tok; TRY(parse_expression(v7)); } } else { TRY(parse_expression(v7)); } // Skip optional semicolons while (*v7->cursor == ';') match(v7, *v7->cursor); //return is_return_statement; return V7_OK; }