Ejemplo n.º 1
0
expr_t parse_relat_expr(tokenizer_t t) {
    char * filename = cur_tok(t).filename;
    int line = cur_tok(t).line_num;
    expr_t e = parse_add_expr(t);
    while((cur_tok(t).kind==TOK_LT)|(cur_tok(t).kind==TOK_GT)|(cur_tok(t).kind==TOK_LE)|(cur_tok(t).kind==TOK_GE)) {
        op_kind_t op = parse_relat_oper(t);
        expr_t e0 = parse_add_expr(t);
        e = mk_expr_bin_op(filename, line, op, e, e0);
    }
    return e;
}
Ejemplo n.º 2
0
// order_rest := ... (< | <= | > | >=) add_expr (order_rest)
Expr*
parse_order_rest(Parser& p, Token_stream& ts, Token const* tok, Expr* e1)
{
  if (Expr* e2 = parse_add_expr(p, ts)) {
    if (Token const* t = ts.next()) {
      // keep parsing the 'rest' while we still have a valid operator
      if (t->kind() == less_tok 
       || t->kind() == less_eq_tok
       || t->kind() == great_tok
       || t->kind() == great_eq_tok)
        return parse_order_rest(p, ts, ts.advance(), p.on_binary(tok, e1, e2));
      else
        return p.on_binary(tok, e1, e2);
    }
    
    return p.on_binary(tok, e1, e2);
  }


  error("Expected expression after logical-or expr: ");
  print(e1);
  print(tok);
  print("\n");
  return nullptr;
}
Ejemplo n.º 3
0
expr_t parse_relat_expr(tokenizer_t t){
    expr_t expr_left, expr_right;
    expr_left = parse_add_expr(t);

    struct token tok = cur_tok(t);

    // relational-operator
    while(tok.kind == TOK_LT || tok.kind == TOK_GT || tok.kind == TOK_LE || tok.kind == TOK_GE){
        eat_it(t, TOK_ANY); // なんでも食べる
        expr_right = parse_add_expr(t);

        op_kind_t op_kind;
        if(tok.kind == TOK_LT) op_kind = op_kind_lt;
        if(tok.kind == TOK_GT) op_kind = op_kind_gt;
        if(tok.kind == TOK_LE) op_kind = op_kind_le;
        if(tok.kind == TOK_GE) op_kind = op_kind_ge;

        expr_left = mk_expr_bin_op(t->filename, t->line, 
          op_kind, expr_left, expr_right);  // left にたたんでいく
        tok = cur_tok(t);
    }
    return expr_left;


  // struct token tok = cur_tok(t);
  // expr_list_t list = mk_expr_list();
  // expr_list_add(list, parse_add_expr(t));
  // while(1)
  // {
  //   if(tok.kind == TOK_LT || tok.kind == TOK_GT || tok.kind == TOK_LE || tok.kind == TOK_GE)
  //   {
  //     eat_it(t, TOK_ANY); // なんでも食べる
  //     expr_list_add(list, parse_add_expr(t));
  //   }
  //   else break;
  // }
  // expr_t expr = ;
}
Ejemplo n.º 4
0
// order_expr := order_expr (< | <= | > | >=) add_expr
//               add_expr
//
// order_expr := add_expr (order_rest)
Expr*
parse_order_expr(Parser& p, Token_stream& ts)
{
  if (Expr* e1 = parse_add_expr(p, ts)) {
    if (Token const* tok = ts.next()) {
      switch (tok->kind()) {
        // advance past the operator and move to parse the 'rest' of the expr
        case less_tok: 
        case less_eq_tok:
        case great_tok:
        case great_eq_tok:
          return parse_order_rest(p, ts, ts.advance(), e1);
        default:
          return e1;
      }
    }

    return e1;
  }

  return nullptr;
}