+ SetForScope<const Statement *> set_cst(cur_st, &st);
+
+ try
+ {
+ StatementKey key(st.keyword, st.get_signature());
+
+ if(!aux_loaders.empty() && !has_action(key))
+ {
+ for(vector<Loader *>::const_iterator i=aux_loaders.begin(); i!=aux_loaders.end(); ++i)
+ if((*i)->has_action(key))
+ return (*i)->load_statement(st);
+ }
+
+ LoaderAction *act = find_action(key);
+ if(act)
+ {
+ sub_loaded = false;
+ act->execute(*this, st);
+ if(check_sub_loads && !st.sub.empty() && !sub_loaded)
+ throw logic_error("substatements ignored");
+ }
+ }
+ catch(const data_error &e)
+ {
+ if(e.get_source()!=st.source)
+ throw data_error(st.source, st.line, e);
+ else
+ throw;
+ }
+ catch(const exception &e)
+ {
+ throw data_error(st.source, st.line, e);
+ }