Example #1
0
  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;
    }
Example #2
0
  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;
    }