first(true),
float_precision(32)
{
- dict[-1] = DictEntry("__kwd", "iss");
- dict[-2] = DictEntry("__str", "is");
- dict[-3] = DictEntry("__flt", "i");
+ dict[-1] = StatementKey("__kwd", "iss");
+ dict[-2] = StatementKey("__str", "is");
+ dict[-3] = StatementKey("__flt", "i");
}
-Statement BinaryParser::parse(bool raw)
-{
- while(1)
- {
- Statement st = parse_statement(raw);
- if(st.keyword=="__kwd")
- {
- int id = st.args[0].get<int>();
- if(id<=0)
- throw bad_definition("__kwd");
-
- 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")
- {
- int id = st.args[0].get<int>();
- if(id<=0)
- throw bad_definition("__str");
-
- 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(bool raw)
+Statement BinaryParser::parse()
{
while(first && in.peek()=='\n')
in.get();
if(!in)
return Statement();
- const DictEntry &de = get_item(dict, id);
+ const StatementKey &key = get_item(dict, id);
Statement result;
- result.keyword = de.keyword;
+ result.keyword = key.keyword;
result.source = src;
- for(unsigned j = 0; j<de.args.size(); ++j)
+ for(unsigned j=0; j<key.signature.size(); ++j)
{
- switch(de.args[j])
+ switch(key.signature[j])
{
case IntType::signature:
result.args.push_back(parse_int());
unsigned nsub = parse_int();
for(unsigned j = 0; j<nsub; ++j)
- result.sub.push_back(parse(raw));
+ result.sub.push_back(parse());
result.valid = true;
return result;
}
+void BinaryParser::process_control_statement(const Statement &st)
+{
+ if(st.keyword=="__kwd")
+ {
+ int id = st.args[0].get<int>();
+ if(id<=0)
+ throw bad_definition("__kwd");
+
+ 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] = StatementKey(kw, args);
+ }
+ else if(st.keyword=="__str")
+ {
+ int id = st.args[0].get<int>();
+ if(id<=0)
+ throw bad_definition("__str");
+
+ strings[id] = st.args[1].get<const string &>();
+ }
+ else if(st.keyword=="__flt")
+ float_precision = st.args[0].get<unsigned>();
+}
+
IntType::Store BinaryParser::parse_int()
{
IntType::Store result = 0;