Fragment * Parser::nt_whatever(Fragment *previous, int depth) { logtrace << depth << ") nt_whatever: start."; Fragment *first_fragment = new Fragment(); Fragment *current = first_fragment; while(true) { while (true) { Token& tok = next_token(); if (isExpected(tok)) { rewind_token(); logdebug << depth << ") nt_whatever: matched an expected token: " << tok.kind_as_text() << " [RETURNING TO CALLER]" ; goto my_first_goto_in_a_while; } current->push_token(&tok); // if (tok.is_blank()) { // loginfo << "nt_whatever(): skipping blank(s) token." // << tok.text(); // } // ';' terminated => STATEMENT if (tok.is_symbol(';')) { current->set_kind(Fragment::Kind::statement); logtrace << depth << ") nt_whatever: got one fragment !"; break; } // {...} BLOCK "ANTECEDENT" else if (tok.is_symbol('{')) { current->set_kind(Fragment::Kind::block_antecedent); current->pop_token(); rewind_token(); current = nt_curly_block(current, depth+1); break; } previous = current; } // Create a new fragment for accumulating tokens. current = new Fragment(); current->set_previous_fragment(previous); previous->set_next_fragment(current); } my_first_goto_in_a_while: logtrace << depth << ") nt_whatever: finished."; return first_fragment; }
/*----------------------------------------------------------------------*/ static ast_expression_t *parse_value(parse_state_t *p) { token_t *token = peek_token(p); if (token == NULL) { } else if (token->type == TK_INT_LITERAL || token->type == TK_FLOAT_LITERAL || token->type == TK_DOUBLE_LITERAL || token->type == TK_STRING_LITERAL) { return parse_literal(p); } else if (token->type == TK_IDENTIFIER) { next_token(p); if (test_token(peek_token(p), TK_LBRACKET)) { rewind_token(p); return parse_function_call(p); } else { rewind_token(p); return parse_variable(p); } } error(p, "value expected"); return NULL; /* unreachable */ }