moved some code around

This commit is contained in:
John Wiegley 2004-07-29 02:08:10 -04:00
parent a2f805ef73
commit 358e3329b3

207
expr.cc
View file

@ -147,106 +147,6 @@ balance_t node_t::compute(const item_t * item,
return temp; return temp;
} }
void dump_tree(std::ostream& out, node_t * node)
{
switch (node->type) {
case CONSTANT_A: out << "CONST[" << node->constant_a << "]"; break;
case CONSTANT_T: out << "DATE/TIME[" << node->constant_t << "]"; break;
case AMOUNT: out << "AMOUNT"; break;
case COST: out << "COST"; break;
case DATE: out << "DATE"; break;
case INDEX: out << "INDEX"; break;
case BALANCE: out << "BALANCE"; break;
case COST_BALANCE: out << "COST_BALANCE"; break;
case TOTAL: out << "TOTAL"; break;
case COST_TOTAL: out << "COST_TOTAL"; break;
case BEGIN_DATE: out << "BEGIN"; break;
case END_DATE: out << "END"; break;
case F_ARITH_MEAN:
out << "MEAN(";
dump_tree(out, node->left);
out << ")";
break;
case F_NEG:
out << "ABS(";
dump_tree(out, node->left);
out << ")";
break;
case F_ABS:
out << "ABS(";
dump_tree(out, node->left);
out << ")";
break;
case F_REGEXP:
assert(node->mask);
out << "RE(" << node->mask->pattern << ")";
break;
case F_VALUE:
out << "VALUE(";
dump_tree(out, node->left);
if (node->right) {
out << ", ";
dump_tree(out, node->right);
}
out << ")";
break;
case O_NOT:
out << "!";
dump_tree(out, node->left);
break;
case O_QUES:
dump_tree(out, node->left);
out << "?";
dump_tree(out, node->right->left);
out << ":";
dump_tree(out, node->right->right);
break;
case O_AND:
case O_OR:
case O_EQ:
case O_LT:
case O_LTE:
case O_GT:
case O_GTE:
case O_ADD:
case O_SUB:
case O_MUL:
case O_DIV:
out << "(";
dump_tree(out, node->left);
switch (node->type) {
case O_AND: out << " & "; break;
case O_OR: out << " | "; break;
case O_EQ: out << "="; break;
case O_LT: out << "<"; break;
case O_LTE: out << "<="; break;
case O_GT: out << ">"; break;
case O_GTE: out << ">="; break;
case O_ADD: out << "+"; break;
case O_SUB: out << "-"; break;
case O_MUL: out << "*"; break;
case O_DIV: out << "/"; break;
default: assert(0); break;
}
dump_tree(out, node->right);
out << ")";
break;
case LAST:
default:
assert(0);
break;
}
}
node_t * parse_term(std::istream& in, ledger_t * ledger); node_t * parse_term(std::istream& in, ledger_t * ledger);
inline node_t * parse_term(const char * p, ledger_t * ledger) { inline node_t * parse_term(const char * p, ledger_t * ledger) {
@ -592,12 +492,117 @@ node_t * parse_expr(std::istream& in, ledger_t * ledger)
} // namespace ledger } // namespace ledger
#ifdef TEST #ifdef TEST
namespace ledger {
static void dump_tree(std::ostream& out, node_t * node)
{
switch (node->type) {
case CONSTANT_A: out << "CONST[" << node->constant_a << "]"; break;
case CONSTANT_T: out << "DATE/TIME[" << node->constant_t << "]"; break;
case AMOUNT: out << "AMOUNT"; break;
case COST: out << "COST"; break;
case DATE: out << "DATE"; break;
case INDEX: out << "INDEX"; break;
case BALANCE: out << "BALANCE"; break;
case COST_BALANCE: out << "COST_BALANCE"; break;
case TOTAL: out << "TOTAL"; break;
case COST_TOTAL: out << "COST_TOTAL"; break;
case BEGIN_DATE: out << "BEGIN"; break;
case END_DATE: out << "END"; break;
case F_ARITH_MEAN:
out << "MEAN(";
dump_tree(out, node->left);
out << ")";
break;
case F_NEG:
out << "ABS(";
dump_tree(out, node->left);
out << ")";
break;
case F_ABS:
out << "ABS(";
dump_tree(out, node->left);
out << ")";
break;
case F_REGEXP:
assert(node->mask);
out << "RE(" << node->mask->pattern << ")";
break;
case F_VALUE:
out << "VALUE(";
dump_tree(out, node->left);
if (node->right) {
out << ", ";
dump_tree(out, node->right);
}
out << ")";
break;
case O_NOT:
out << "!";
dump_tree(out, node->left);
break;
case O_QUES:
dump_tree(out, node->left);
out << "?";
dump_tree(out, node->right->left);
out << ":";
dump_tree(out, node->right->right);
break;
case O_AND:
case O_OR:
case O_EQ:
case O_LT:
case O_LTE:
case O_GT:
case O_GTE:
case O_ADD:
case O_SUB:
case O_MUL:
case O_DIV:
out << "(";
dump_tree(out, node->left);
switch (node->type) {
case O_AND: out << " & "; break;
case O_OR: out << " | "; break;
case O_EQ: out << "="; break;
case O_LT: out << "<"; break;
case O_LTE: out << "<="; break;
case O_GT: out << ">"; break;
case O_GTE: out << ">="; break;
case O_ADD: out << "+"; break;
case O_SUB: out << "-"; break;
case O_MUL: out << "*"; break;
case O_DIV: out << "/"; break;
default: assert(0); break;
}
dump_tree(out, node->right);
out << ")";
break;
case LAST:
default:
assert(0);
break;
}
}
} // namespace ledger
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
ledger::dump_tree(std::cout, ledger::parse_expr(argv[1], NULL)); ledger::dump_tree(std::cout, ledger::parse_expr(argv[1], NULL));
std::cout << std::endl; std::cout << std::endl;
} }
#endif #endif // TEST