typedef enum { ND_ADD, // + ND_SUB, // - ND_MUL, // * ND_DIV, // / ND_NUM, // num } NodeKind; typedef struct Node Node; struct Node { NodeKind kind; // node type Node *lhs; // left Node *rhs; // right int val; }; Node *new_node(NodeKind kind, Node *lhs, Node *rhs){ Node *node = calloc(1, sizeof(Node)); node->kind = kind; node->lhs = lhs; node->rhs = rhs; return node; } Node *new_node_num(int val) { Node *node = calloc(1, sizeof(Node)); node->kind = ND_NUM; node->val = val; return node; } Node *expr() { Node *node = mul(); for(;;) { if(consume('+')) node = new_node(ND_ADD, node, mul()); else if (consume('-')) node = new_node(ND_SUB, node, mul()); else return node; } } Node *mul() { Node *node = primary(); for(;;) { if(consume('*')) node = new_node(ND_MUL, node, primary()); else if(consume('/')) node = new_node(DN_DIV, node, primary()); else return node; } } Node *primary() { if(consume('(')){ Node *node = expr(); expect(')'); return node; } return new_node_num(expect_number()); }