accept multiple arguments passed to an interpreted function (more work tbd)
This commit is contained in:
parent
fbd8fd2caf
commit
8c8c9a01e7
2 changed files with 58 additions and 30 deletions
87
valexpr.cc
87
valexpr.cc
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,7 @@ struct value_expr_t
|
||||||
O_OR,
|
O_OR,
|
||||||
O_QUES,
|
O_QUES,
|
||||||
O_COL,
|
O_COL,
|
||||||
|
O_ARG,
|
||||||
|
|
||||||
LAST
|
LAST
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue