moved some code around
This commit is contained in:
parent
a2f805ef73
commit
358e3329b3
1 changed files with 106 additions and 101 deletions
207
expr.cc
207
expr.cc
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue