X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fparser.cpp;h=7d0bb3b465d7d2f1a8c36db3826aa60bdcdc90f8;hb=daca21051927eabee098e422fe5a0990acacfb96;hp=9ad70d8742884bfdfa40d5bebbc467b9e289afe7;hpb=3b78eeb8b92dc3524d6a0456b4daf0a0f3dbf813;p=libs%2Fdatafile.git diff --git a/source/parser.cpp b/source/parser.cpp index 9ad70d8..7d0bb3b 100644 --- a/source/parser.cpp +++ b/source/parser.cpp @@ -1,6 +1,7 @@ #include #include "binaryparser.h" -#include "dataerror.h" +#include "except.h" +#include "jsonparser.h" #include "parser.h" #include "statement.h" #include "textparser.h" @@ -14,9 +15,14 @@ Parser::Parser(IO::Base &i, const string &s): in(i), main_src(s), src(s), - good(true), - mode(new TextParser(in, src)) -{ } + good(true) +{ + char c = in.peek(); + if(c=='{' || c=='[') + mode = new JsonParser(in, src); + else + mode = new TextParser(in, src); +} Parser::~Parser() { @@ -88,7 +94,7 @@ void Parser::process_control_statement(const Statement &st) const StatementKey *Parser::peek(unsigned level) { - while(1) + while(good) { const StatementKey *key = mode->peek(level); if(key && !key->keyword.compare(0, 2, "__")) @@ -96,6 +102,8 @@ const StatementKey *Parser::peek(unsigned level) else return key; } + + return nullptr; } bool Parser::parse_and_load(unsigned level, Loader &ldr, const LoaderAction &act)