48class D4FunctionEvaluator {
49 bool d_trace_scanning =
false;
50 bool d_trace_parsing =
false;
58 std::stack<BaseType *> d_basetype_stack;
60 unsigned long long d_arg_length_hint = 0;
64 std::string *expression() {
return &d_expr; }
66 void push_basetype(
BaseType *btp) { d_basetype_stack.push(btp); }
67 BaseType *top_basetype()
const {
return d_basetype_stack.empty() ? nullptr : d_basetype_stack.top(); }
68 void pop_basetype() { d_basetype_stack.pop(); }
70 D4RValue *build_rvalue(
const std::string &
id);
72 friend class D4FunctionParser;
75 D4FunctionEvaluator() =
default;
78 virtual ~D4FunctionEvaluator() =
default;
80 bool parse(
const std::string &expr);
82 bool trace_scanning()
const {
return d_trace_scanning; }
83 void set_trace_scanning(
bool ts) { d_trace_scanning = ts; }
85 bool trace_parsing()
const {
return d_trace_parsing; }
86 void set_trace_parsing(
bool tp) { d_trace_parsing = tp; }
93 void set_result(
D4RValueList *rv_list) { d_result = rv_list; }
97 unsigned long long get_arg_length_hint()
const {
return d_arg_length_hint; }
98 void set_arg_length_hint(
unsigned long long alh) { d_arg_length_hint = alh; }
100 DMR *dmr()
const {
return d_dmr; }
101 void set_dmr(DMR *dmr) { d_dmr = dmr; }
103 ServerFunctionsList *sf_list()
const {
return d_sf_list; }
104 void set_sf_list(ServerFunctionsList *sf_list) { d_sf_list = sf_list; }
106 template <
typename t> std::vector<t> *init_arg_list(t val);
108 [[noreturn]]
static void error(
const libdap::location &l,
const std::string &m);