diff --git a/src/json/json_parser.cpp b/src/json/json_parser.cpp index cb30114cb39c..6576c61acdff 100644 --- a/src/json/json_parser.cpp +++ b/src/json/json_parser.cpp @@ -10,7 +10,12 @@ Author: Daniel Kroening, kroening@kroening.com #include -json_parsert json_parser; +int yyjsonparse(json_parsert &); + +bool json_parsert::parse() +{ + return yyjsonparse(*this) != 0; +} // 'do it all' function bool parse_json( @@ -19,10 +24,10 @@ bool parse_json( message_handlert &message_handler, jsont &dest) { - json_parser.clear(); + json_parsert json_parser{message_handler}; + json_parser.set_file(filename); json_parser.in=∈ - json_parser.log.set_message_handler(message_handler); bool result=json_parser.parse(); diff --git a/src/json/json_parser.h b/src/json/json_parser.h index 926a30e10bf9..bbefec217f48 100644 --- a/src/json/json_parser.h +++ b/src/json/json_parser.h @@ -15,21 +15,22 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -int yyjsonparse(); void yyjsonrestart(FILE *input_file); class json_parsert:public parsert { public: + explicit json_parsert(message_handlert &message_handler) + : parsert(message_handler) + { + } + typedef std::stack > stackt; stackt stack; jsont &top() { return stack.top(); } - virtual bool parse() override - { - return yyjsonparse()!=0; - } + bool parse() override; void push(const jsont &x) { @@ -50,9 +51,7 @@ class json_parsert:public parsert } }; -extern json_parsert json_parser; - -int yyjsonerror(const std::string &error); +int yyjsonerror(json_parsert &, const std::string &error); // 'do it all' functions bool parse_json( diff --git a/src/json/parser.y b/src/json/parser.y index facaf48638d6..1a787c4ce209 100644 --- a/src/json/parser.y +++ b/src/json/parser.y @@ -20,7 +20,7 @@ #include -int yyjsonlex(); +int yyjsonlex(json_parsert &json_parser); extern char *yyjsontext; extern int yyjsonleng; // really an int, not a size_t @@ -75,7 +75,7 @@ static std::string convert_TOK_NUMBER() return yyjsontext; } -int yyjsonerror(const std::string &error) +int yyjsonerror(json_parsert &json_parser, const std::string &error) { json_parser.parse_error(error, yyjsontext); return 0; @@ -83,6 +83,9 @@ int yyjsonerror(const std::string &error) %} +%parse-param {json_parsert &json_parser} +%lex-param {json_parsert &json_parser} + %token TOK_STRING %token TOK_NUMBER %token TOK_TRUE diff --git a/src/json/scanner.l b/src/json/scanner.l index c10efc414fba..027f8bc2bb9b 100755 --- a/src/json/scanner.l +++ b/src/json/scanner.l @@ -24,7 +24,7 @@ #pragma warning(disable:4005) #endif -#define PARSER json_parser +#define PARSER (*json_parser) #include "json_parser.h" #include "json_y.tab.h" @@ -33,6 +33,19 @@ #include // IWYU pragma: keep #include // IWYU pragma: keep +static json_parsert *json_parser; + +int yyjsonlex(void); + +int yyjsonlex(json_parsert &_json_parser) +{ + // our scanner is not reentrant + PRECONDITION(!json_parser); + json_parser = &_json_parser; + int result = yyjsonlex(); + json_parser = nullptr; + return result; +} %} string \"\"|\"{chars}\"