TreeNode* statement(void) { TreeNode* t = NULL; switch(s_token) { case IF: t = if_stmt(); break; case REPEAT: t = repeat_stmt(); break; case ID: t = assign_stmt(); break; case READ: t = read_stmt(); break; case WRITE: t = write_stmt(); break; default: syntaxError("unexpected token -> "); printToken(s_token, g_tokenString); s_token = getToken(); break; } return t; }
static void statement() { int second_token; if(token == TOK_IF){ selection_stmt(); }else if(token == TOK_LBRACKET){ compound_stmt(); }else if(token == TOK_ID||token == TOK_AND){ second_token = virtual_get_token(true); if(second_token == TOK_ASSIGN){ assign_stmt(); }else if(second_token == TOK_LSQUARE){ while(second_token!=TOK_RSQUARE){ second_token = virtual_get_token(false); if(second_token == TOK_ASSIGN ||second_token == TOK_SEMI ||second_token == TOK_EOF) { fprintf( stderr, "line %d: error array var", save_line ); break; } } second_token = virtual_get_token(false); if(second_token == TOK_ASSIGN){ assign_stmt(); }else{ expression_stmt(); } }else{ expression_stmt(); } }else if(token == TOK_WHILE||token == TOK_FOR){ iteration_stmt(); }else if(token == TOK_RETURN){ return_stmt(); }else if(token == TOK_SEMI){ match(TOK_SEMI); }else fprintf( stderr, "line %d: error statements", save_line ); }
TreeNode * for_stmt(void) { TreeNode * t = newStmtNode(ForK); TreeNode * temp ; TreeNode * ultimoIrmao ; match(FOR); switch(token){ case LPAREN: match(LPAREN); if (t!= NULL) t->child[0] = assign_stmt(); match(COMMA); if (t!= NULL) t->child[1] = expres(); match(COMMA); if (temp!= NULL) temp = assign_stmt(); match(RPAREN); if (t!= NULL) t->child[2] = stmt_sequence(); if (t->child[2] != NULL){ //Se o terceiro filho tiver algo, if(t->child[2]->sibling != NULL){ //Se o nó tem irmão, vamos fazer um loop para chegar até o ultimo irmão. ultimoIrmao = t->child[2]->sibling; while ( ultimoIrmao->sibling != NULL){ //Loop para chegar em ultimo irmão ultimoIrmao = ultimoIrmao->sibling; } ultimoIrmao->sibling = temp; } else { t->child[2]->sibling = temp; } } else{ //Se o que tem dentro do FOR for nada, então vamos só fazer as iterações t->child[2] = temp; } match(ENDFOR); break; default: syntaxError("unexpected token -> "); printToken(token,tokenString); token = getToken(); break; } return t; }
TreeNode * statement(void) { TreeNode * t = NULL; switch (token) { case IF : t = if_stmt(); break; case REPEAT : t = repeat_stmt(); break; case FOR : t = for_stmt(); break; //ADICIONADO O FOR COMO UMA DECLARAÇÃO case ID : t = assign_stmt(); break; case READ : t = read_stmt(); break; case WRITE : t = write_stmt(); break; default : syntaxError("unexpected token -> "); printToken(token,tokenString); token = getToken(); break; } /* end case */ return t; }
TreeNode * statement(void) //statement -> expression| if_stmt| while_stmt|for_stmt|var_stmt|assign_stmt { TreeNode * t = NULL; switch (token) { case IF : t = if_stmt(); break; case FOR : t = for_stmt(); break; case ID : t = assign_stmt(); break; case WHILE : t = while_stmt(); break; case INT : case CHAR : t = var_stmt(); break; case RBRACE : match(RBRACE); break; default : syntaxError("unexpected token -> "); printToken(token,tokenString); token = getToken(); break; } /* end case */ return t; }