+ catch(const exception &e)
+ {
+ good = false;
+ if(dynamic_cast<const data_error *>(&e))
+ throw;
+ else
+ throw data_error(src, in.get_line_number(), e);
+ }
+}
+
+void Parser::process_control_statement(const Statement &st)
+{
+ if(st.keyword=="__bin")
+ {
+ delete mode;
+ mode = new BinaryParser(in, src);
+
+ while(in.peek()=='\n')
+ in.get();
+ }
+ else if(st.keyword=="__text")
+ {
+ delete mode;
+ mode = new TextParser(in, src);
+ }
+ else if(st.keyword=="__z")
+ in.set_decompress();
+ else if(st.keyword=="__src")
+ {
+ string s = st.args[0].get<string>();
+ if(s.empty())
+ src = main_src;
+ else
+ src = format("%s[%s]", main_src, s);
+ }
+ else if(st.keyword=="__end")
+ good = false;
+ else
+ mode->process_control_statement(st);
+}
+
+const StatementKey *Parser::peek(unsigned level)
+{
+ while(good)