- cur_st=&st;
- ActionMap::iterator j=actions.find(st.keyword);
- if(j==actions.end())
- throw KeyError(st.get_location()+": Unknown keyword", st.keyword);
- if(j->second)
- j->second->execute(*this, st);
- cur_st=0;
+ aux_loaders.push_back(&ldr);
+}
+
+bool Loader::has_action(const StatementKey &key) const
+{
+ ActionMap::const_iterator i = actions.lower_bound(StatementKey(key.keyword, string()));
+ for(; (i!=actions.end() && i->first.keyword==key.keyword); ++i)
+ if(signature_match(key.signature, i->first.signature))
+ return true;
+ return false;
+}
+
+LoaderAction *Loader::find_action(const StatementKey &key) const
+{
+ ActionMap::const_iterator begin = actions.lower_bound(StatementKey(key.keyword, string()));
+ ActionMap::const_iterator end = actions.upper_bound(StatementKey(key.keyword, "~"));
+
+ if(begin==end)
+ throw unknown_keyword(key.keyword);
+
+ for(ActionMap::const_iterator i=begin; i!=end; ++i)
+ if(signature_match(key.signature, i->first.signature))
+ return i->second;
+
+ throw invalid_signature(key.keyword, key.signature);
+}
+
+const string &Loader::get_source() const
+{
+ if(!cur_st)
+ throw logic_error("no current statement");
+ return cur_st->source;