expr_t parse_equal_expr(tokenizer_t t) { char * filename = cur_tok(t).filename; int line = cur_tok(t).line_num; expr_t e = parse_relat_expr(t); while((cur_tok(t).kind == TOK_EQ)|(cur_tok(t).kind == TOK_NEQ)) { op_kind_t op = parse_equal_oper(t); expr_t e0 = parse_relat_expr(t); e = mk_expr_bin_op(filename, line, op, e, e0); } return e; }
expr_t parse_eq_expr(tokenizer_t t){ expr_t expr_left, expr_right; expr_left = parse_relat_expr(t); struct token tok = cur_tok(t); while(tok.kind == TOK_EQ || tok.kind == TOK_NEQ){ eat_it(t, TOK_ANY); // なんでも食べる expr_right = parse_relat_expr(t); expr_left = mk_expr_bin_op(t->filename, t->line, (tok.kind == TOK_EQ) ? op_kind_eq : op_kind_neq // == , != のどちらかしかない , expr_left, expr_right); // left にたたんでいく tok = cur_tok(t); } return expr_left; }