dict[-3] = DictEntry("__flt", "i");
}
-Statement BinaryParser::parse()
+Statement BinaryParser::parse(bool raw)
{
while(1)
{
- Statement st = parse_statement();
+ Statement st = parse_statement(raw);
if(st.keyword=="__kwd")
{
- if(st.args.size()!=3)
+ int id = st.args[0].get<int>();
+ if(id<=0)
throw bad_definition("__kwd");
- const int id = st.args[0].get<unsigned>();
const string &kw = st.args[1].get<const string &>();
const string &args = st.args[2].get<const string &>();
+ for(string::const_iterator i=args.begin(); i!=args.end(); ++i)
+ for(unsigned j=0; valid_signatures[j]!=*i; ++j)
+ if(!valid_signatures[j])
+ throw bad_definition("__kwd");
+
dict[id] = DictEntry(kw, args);
}
else if(st.keyword=="__str")
{
- if(st.args.size()!=2)
+ int id = st.args[0].get<int>();
+ if(id<=0)
throw bad_definition("__str");
- const unsigned id = st.args[0].get<unsigned>();
strings[id] = st.args[1].get<const string &>();
}
else if(st.keyword=="__flt")
float_precision = st.args[0].get<unsigned>();
else
return st;
+
+ if(raw)
+ return st;
}
}
-Statement BinaryParser::parse_statement()
+Statement BinaryParser::parse_statement(bool raw)
{
while(first && in.peek()=='\n')
in.get();
unsigned nsub = parse_int();
for(unsigned j = 0; j<nsub; ++j)
- result.sub.push_back(parse());
+ result.sub.push_back(parse(raw));
result.valid = true;