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に置き換える。
下方再帰の順番は上記に示した通り