accept multiple arguments passed to an interpreted function (more work tbd)

This commit is contained in:
John Wiegley 2004-09-24 23:45:32 -04:00
parent fbd8fd2caf
commit 8c8c9a01e7
2 changed files with 58 additions and 30 deletions

View file

@ -287,7 +287,8 @@ void value_expr_t::compute(value_t& result, const details_t& details) const
try { try {
object func = python_interpretor->main_namespace[constant_s]; object func = python_interpretor->main_namespace[constant_s];
if (right) { if (right) {
right->compute(result, details); assert(right->kind == O_ARG);
right->left->compute(result, details);
result = call<value_t>(func.ptr(), details, result); result = call<value_t>(func.ptr(), details, result);
} else { } else {
result = call<value_t>(func.ptr(), details); result = call<value_t>(func.ptr(), details);
@ -541,7 +542,23 @@ value_expr_t * parse_value_term(std::istream& in)
in.get(c); in.get(c);
node.reset(new value_expr_t(value_expr_t::F_INTERP_FUNC)); node.reset(new value_expr_t(value_expr_t::F_INTERP_FUNC));
node->constant_s = buf; node->constant_s = buf;
node->right = parse_value_expr(in, true); if (peek_next_nonws(in) == '(') {
in.get(c);
node->right = new value_expr_t(value_expr_t::O_ARG);
value_expr_t * cur = node->right;
cur->left = parse_value_expr(in, true);
while (peek_next_nonws(in) == ',') {
in.get(c);
cur->right = new value_expr_t(value_expr_t::O_ARG);
cur = cur->right;
cur->left = parse_value_expr(in, true);
}
in.get(c);
if (c != ')')
unexpected(c, ')');
} else {
node->left = parse_value_term(in);
}
break; break;
} }
@ -772,13 +789,13 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
{ {
switch (node->kind) { switch (node->kind) {
case value_expr_t::CONSTANT_I: case value_expr_t::CONSTANT_I:
out << "UINT[" << node->constant_i << "]"; out << "UINT[" << node->constant_i << ']';
break; break;
case value_expr_t::CONSTANT_T: case value_expr_t::CONSTANT_T:
out << "DATE/TIME[" << node->constant_t << "]"; out << "DATE/TIME[" << node->constant_t << ']';
break; break;
case value_expr_t::CONSTANT_A: case value_expr_t::CONSTANT_A:
out << "CONST[" << node->constant_a << "]"; out << "CONST[" << node->constant_a << ']';
break; break;
case value_expr_t::AMOUNT: out << "AMOUNT"; break; case value_expr_t::AMOUNT: out << "AMOUNT"; break;
@ -795,40 +812,40 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
case value_expr_t::F_ARITH_MEAN: case value_expr_t::F_ARITH_MEAN:
out << "MEAN("; out << "MEAN(";
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
out << ")"; out << ')';
break; break;
case value_expr_t::F_NEG: case value_expr_t::F_NEG:
out << "ABS("; out << "ABS(";
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
out << ")"; out << ')';
break; break;
case value_expr_t::F_ABS: case value_expr_t::F_ABS:
out << "ABS("; out << "ABS(";
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
out << ")"; out << ')';
break; break;
case value_expr_t::F_STRIP: case value_expr_t::F_STRIP:
out << "STRIP("; out << "STRIP(";
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
out << ")"; out << ')';
break; break;
case value_expr_t::F_PAYEE_MASK: case value_expr_t::F_PAYEE_MASK:
assert(node->mask); assert(node->mask);
out << "P_MASK(" << node->mask->pattern << ")"; out << "P_MASK(" << node->mask->pattern << ')';
break; break;
case value_expr_t::F_ACCOUNT_MASK: case value_expr_t::F_ACCOUNT_MASK:
assert(node->mask); assert(node->mask);
out << "A_MASK(" << node->mask->pattern << ")"; out << "A_MASK(" << node->mask->pattern << ')';
break; break;
case value_expr_t::F_SHORT_ACCOUNT_MASK: case value_expr_t::F_SHORT_ACCOUNT_MASK:
assert(node->mask); assert(node->mask);
out << "A_SMASK(" << node->mask->pattern << ")"; out << "A_SMASK(" << node->mask->pattern << ')';
break; break;
case value_expr_t::F_VALUE: case value_expr_t::F_VALUE:
@ -838,29 +855,39 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
out << ", "; out << ", ";
dump_value_expr(out, node->right); dump_value_expr(out, node->right);
} }
out << ")"; out << ')';
break; break;
case value_expr_t::F_INTERP_FUNC: case value_expr_t::F_INTERP_FUNC:
out << "F_INTERP(" << node->constant_s << ")"; out << "F_INTERP[" << node->constant_s << "](";
dump_value_expr(out, node->right);
out << ')';
break; break;
case value_expr_t::O_NOT: case value_expr_t::O_NOT:
out << "!"; out << '!';
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
break; break;
case value_expr_t::O_ARG:
dump_value_expr(out, node->left);
if (node->right) {
out << ',';
dump_value_expr(out, node->right);
}
break;
case value_expr_t::O_QUES: case value_expr_t::O_QUES:
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
out << "?"; out << '?';
dump_value_expr(out, node->right->left); dump_value_expr(out, node->right->left);
out << ":"; out << ':';
dump_value_expr(out, node->right->right); dump_value_expr(out, node->right->right);
break; break;
case value_expr_t::O_AND: case value_expr_t::O_AND:
case value_expr_t::O_OR: case value_expr_t::O_OR:
out << "("; out << '(';
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
switch (node->kind) { switch (node->kind) {
case value_expr_t::O_AND: out << " & "; break; case value_expr_t::O_AND: out << " & "; break;
@ -868,7 +895,7 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
default: assert(0); break; default: assert(0); break;
} }
dump_value_expr(out, node->right); dump_value_expr(out, node->right);
out << ")"; out << ')';
break; break;
case value_expr_t::O_EQ: case value_expr_t::O_EQ:
@ -876,35 +903,35 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
case value_expr_t::O_LTE: case value_expr_t::O_LTE:
case value_expr_t::O_GT: case value_expr_t::O_GT:
case value_expr_t::O_GTE: case value_expr_t::O_GTE:
out << "("; out << '(';
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
switch (node->kind) { switch (node->kind) {
case value_expr_t::O_EQ: out << "="; break; case value_expr_t::O_EQ: out << '='; break;
case value_expr_t::O_LT: out << "<"; break; case value_expr_t::O_LT: out << '<'; break;
case value_expr_t::O_LTE: out << "<="; break; case value_expr_t::O_LTE: out << "<="; break;
case value_expr_t::O_GT: out << ">"; break; case value_expr_t::O_GT: out << '>'; break;
case value_expr_t::O_GTE: out << ">="; break; case value_expr_t::O_GTE: out << ">="; break;
default: assert(0); break; default: assert(0); break;
} }
dump_value_expr(out, node->right); dump_value_expr(out, node->right);
out << ")"; out << ')';
break; break;
case value_expr_t::O_ADD: case value_expr_t::O_ADD:
case value_expr_t::O_SUB: case value_expr_t::O_SUB:
case value_expr_t::O_MUL: case value_expr_t::O_MUL:
case value_expr_t::O_DIV: case value_expr_t::O_DIV:
out << "("; out << '(';
dump_value_expr(out, node->left); dump_value_expr(out, node->left);
switch (node->kind) { switch (node->kind) {
case value_expr_t::O_ADD: out << "+"; break; case value_expr_t::O_ADD: out << '+'; break;
case value_expr_t::O_SUB: out << "-"; break; case value_expr_t::O_SUB: out << '-'; break;
case value_expr_t::O_MUL: out << "*"; break; case value_expr_t::O_MUL: out << '*'; break;
case value_expr_t::O_DIV: out << "/"; break; case value_expr_t::O_DIV: out << '/'; break;
default: assert(0); break; default: assert(0); break;
} }
dump_value_expr(out, node->right); dump_value_expr(out, node->right);
out << ")"; out << ')';
break; break;
case value_expr_t::LAST: case value_expr_t::LAST:

View file

@ -89,6 +89,7 @@ struct value_expr_t
O_OR, O_OR,
O_QUES, O_QUES,
O_COL, O_COL,
O_ARG,
LAST LAST
}; };