X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinaryparser.cpp;h=098a5fd4f96c936cad7aae6bfba31b0627c357ef;hb=a82776d980239e48d2b509d33b56e77a1ea44dda;hp=796a592d3e84d05a70e2e8316abdcccbe543f3bf;hpb=6653c7d83dbe1fe81a541a125be8bb808b234eb7;p=libs%2Fdatafile.git diff --git a/source/binaryparser.cpp b/source/binaryparser.cpp index 796a592..098a5fd 100644 --- a/source/binaryparser.cpp +++ b/source/binaryparser.cpp @@ -24,71 +24,28 @@ public: BinaryParser::BinaryParser(Input &i, const string &s): ParserMode(i, 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(bool raw) +Statement BinaryParser::parse() { - while(1) - { - Statement st = parse_statement(raw); - if(st.keyword=="__kwd") - { - int id = st.args[0].get(); - if(id<=0) - throw bad_definition("__kwd"); - - const string &kw = st.args[1].get(); - const string &args = st.args[2].get(); - 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(); - if(id<=0) - throw bad_definition("__str"); - - strings[id] = st.args[1].get(); - } - else if(st.keyword=="__flt") - float_precision = st.args[0].get(); - else - return st; - - if(raw) - return st; - } -} - -Statement BinaryParser::parse_statement(bool raw) -{ - while(first && in.peek()=='\n') - in.get(); - first = false; - int id = parse_int(); 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(); + if(id<=0) + throw bad_definition("__kwd"); + + const string &kw = st.args[1].get(); + const string &args = st.args[2].get(); + 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(); + if(id<=0) + throw bad_definition("__str"); + + strings[id] = st.args[1].get(); + } + else if(st.keyword=="__flt") + float_precision = st.args[0].get(); +} + IntType::Store BinaryParser::parse_int() { IntType::Store result = 0;