expr = mul (“+” mul | “-” mul)*
mul = primary (“*” primary | “/” unary)*
unary = (“+” | “-“)? primary
primary = num | “(” expr “)”
Node *mul() { Node *node = primary(); for(;;) { if(consume('*')) node = new_node(ND_MUL, node, unary()); else if(consume('/')) node = new_node(ND_DIV, node, unary()); else return node; } } Node *unary() { if (consume('+')) return primary(); if (consume('-')) return new_node(ND_SUB, new_node_num(0), primary()); return primary(); }
+x の場合はそのまま、-xの場合は、0-xに置き換える。
下方再帰の順番は上記に示した通り