#include #include "exp.h" /* 再帰的な式変形の例 */ void assoc_left_exp(Exp *ep) { Exp e = *ep, r = NULL; /* 式全体と右部分式 */ char c; if (e != NULL) { assoc_left_exp(&(e->left)); /* 左の部分式を変形 */ assoc_left_exp(&(e->right)); /* 右の部分式を変形 */ c = e->node; r = e->right; if ((c == '+' || c == '*') && r != NULL && c == r->node) { /* 括弧を左にくくり直せる */ rotate_left_exp(ep); /* 1度だけ左にくくり直す */ assoc_left_exp(ep); /* 変形後の式全体を再変形 */ } } }