Fragment * Parser::nt_curly_block(Fragment *preceding, int depth) { logtrace << depth << ") nt_curly_block: begin."; Token& tok = next_token(); assert( matchSymbol('{') ); pushExpectedSymbol("}"); Fragment *block = new Fragment(Fragment::Kind::block); block->push_token(&tok); block->set_previous_fragment( preceding ); if (preceding != nullptr) preceding->set_next_fragment( block ); while(true) { nt_whatever(block, depth+1); tok = next_token(); if (tok.is_symbol('}')) { logdebug << depth << ") nt_curly_block: matched expected '}' symbol" "– end-of-block – ok, returning to caller."; break; } } logtrace << depth << ") nt_curly_block: end."; return block; }
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; }