Esempio n. 1
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;
    }
Esempio n. 2
0
File: parse.c Progetto: jkdewar/rook
/*----------------------------------------------------------------------*/
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 */
}