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());
}