]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binaryparser.cpp
Restructure control statement processing
[libs/datafile.git] / source / binaryparser.cpp
index fa99a7e47708ba3c1d4991c16d605d9ae77c7b28..25edd63a15060d96bb5bcc95775cc3241dc9ce36 100644 (file)
@@ -27,42 +27,12 @@ BinaryParser::BinaryParser(Input &i, const string &s):
        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()
-{
-       while(1)
-       {
-               Statement st = parse_statement();
-               if(st.keyword=="__kwd")
-               {
-                       if(st.args.size()!=3)
-                               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 &>();
-                       dict[id] = DictEntry(kw, args);
-               }
-               else if(st.keyword=="__str")
-               {
-                       if(st.args.size()!=2)
-                               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;
-       }
-}
-
-Statement BinaryParser::parse_statement()
 {
        while(first && in.peek()=='\n')
                in.get();
@@ -72,15 +42,15 @@ Statement BinaryParser::parse_statement()
        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());
@@ -109,6 +79,35 @@ Statement BinaryParser::parse_statement()
        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;