34 #include "D4FunctionScanner.h"
35 #include "D4FunctionEvaluator.h"
36 #include "d4_function_parser.tab.hh"
68 std::istringstream iss(expr);
70 D4FunctionParser parser(scanner, *
this );
72 if (trace_parsing()) {
73 parser.set_debug_level(1);
74 parser.set_debug_stream(std::cerr);
77 return parser.parse() == 0;
115 if (ce_parser_debug) parser.set_trace_parsing(
true);
116 bool parse_ok = parser.
parse(
function);
118 Error(malformed_expr,
"Function Expression failed to parse.");
120 if (ce_parser_debug) cerr <<
"Function Parse OK" << endl;
123 function_result =
new DMR(&d4_factory,
"function_results");
126 if (!d_result)
throw InternalErr(__FILE__, __LINE__,
"Must parse() the function expression before calling eval()");
130 for (D4RValueList::iter i = d_result->begin(), e = d_result->end(); i != e; ++i) {
134 root->
add_var((*i)->value(*d_dmr));
148 set<D4Dimension*> dim_set;
150 for (Constructor::Vars_iter i = root->
var_begin(), ie = root->
var_end(); i != ie; ++i) {
151 if ((*i)->is_vector_type()) {
154 if (a->dimension_D4dim(d)) {
155 dim_set.insert(a->dimension_D4dim(d));
164 for (set<D4Dimension*>::iterator i = dim_set.begin(), e = dim_set.end(); i != e; ++i) {
169 set<D4EnumDef*> enum_def_set;
170 for (Constructor::Vars_iter i = root->
var_begin(), ie = root->
var_end(); i != ie; ++i) {
171 if ((*i)->type() == dods_enum_c) {
172 enum_def_set.insert(
static_cast<D4Enum*
>(*i)->enumeration());
176 for (set<D4EnumDef*>::iterator i = enum_def_set.begin(), e = enum_def_set.end(); i != e; ++i) {
197 D4FunctionEvaluator::build_rvalue(
const std::string &
id)
202 if (top_basetype()) {
203 btp = top_basetype()->
var(
id);
216 long long ll_val = strtoll(
id.c_str(), &end_ptr, 0);
217 if (*end_ptr ==
'\0' && errno == 0)
return new D4RValue(ll_val);
222 unsigned long long ull_val = strtoull(
id.c_str(), &end_ptr, 0);
223 if (*end_ptr ==
'\0' && errno == 0)
return new D4RValue(ull_val);
226 double d_val = strtod(
id.c_str(), &end_ptr);
227 if (*end_ptr ==
'\0' && errno == 0)
return new D4RValue(d_val);
238 D4FunctionEvaluator::init_arg_list(T val)
240 std::vector<T> *arg_list =
new std::vector<T>();
241 if (get_arg_length_hint() > 0) arg_list->reserve(get_arg_length_hint());
243 arg_list->push_back(val);
250 template std::vector<dods_byte> *D4FunctionEvaluator::init_arg_list(dods_byte val);
251 template std::vector<dods_int8> *D4FunctionEvaluator::init_arg_list(dods_int8 val);
252 template std::vector<dods_uint16> *D4FunctionEvaluator::init_arg_list(dods_uint16 val);
253 template std::vector<dods_int16> *D4FunctionEvaluator::init_arg_list(dods_int16 val);
254 template std::vector<dods_uint32> *D4FunctionEvaluator::init_arg_list(dods_uint32 val);
255 template std::vector<dods_int32> *D4FunctionEvaluator::init_arg_list(dods_int32 val);
256 template std::vector<dods_uint64> *D4FunctionEvaluator::init_arg_list(dods_uint64 val);
257 template std::vector<dods_int64> *D4FunctionEvaluator::init_arg_list(dods_int64 val);
258 template std::vector<dods_float32> *D4FunctionEvaluator::init_arg_list(dods_float32 val);
259 template std::vector<dods_float64> *D4FunctionEvaluator::init_arg_list(dods_float64 val);
264 void D4FunctionEvaluator::error(
const libdap::location &l,
const std::string &m)
267 oss << l <<
": " << m << ends;
268 throw Error(malformed_expr, oss.str());