From 3cd4ff83a253e098e6524df5be3a686727e4f50b Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 28 Mar 2021 17:17:11 +0100 Subject: Initial commit of basis persistence JSON parser lifted almost verbatim for libjsonpp running into some custom code for populating ilt objects. Pretty minimal per object code requirements. --- lib/jsonParse.ll | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 lib/jsonParse.ll (limited to 'lib/jsonParse.ll') diff --git a/lib/jsonParse.ll b/lib/jsonParse.ll new file mode 100644 index 0000000..0fc27e9 --- /dev/null +++ b/lib/jsonParse.ll @@ -0,0 +1,156 @@ +%option batch +%option c++ +%option noyywrap +%option 8bit +%option stack +%option yylineno +%option yyclass="json::jsonParser" +%option prefix="jsonBase" + +%{ +#include +#include "jsonParse.h" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wnull-conversion" +#endif +%} + +beginobj "{" +endobj "}" +beginarray "[" +endarray "]" +beginstr "\"" +endstr "\"" +true "true" +false "false" +null "null" +number [-+]?[0-9]+(\.[0-9]+)? +colon ":" +separator "," +escape "\\" +text [^\\\"]* + +%x OBJECT_ITEM +%x OBJECT_ITEM_OR_END +%x OBJECT_NEXT +%x ARRAY_ITEM +%x ARRAY_NEXT +%x COLON +%x TEXT +%x STRING +%x ESCAPE + +%% + +{true} { + PushBoolean(true); + yy_pop_state(); +} + +{false} { + PushBoolean(false); + yy_pop_state(); +} + +{number} { + PushNumber(std::strtof(YYText(), NULL)); + yy_pop_state(); +} + +{null} { + PushNull(); + yy_pop_state(); +} + +{beginstr} { + yy_push_state(STRING); +} + +{beginobj} { + BeginObject(); + BEGIN(OBJECT_ITEM_OR_END); +} + +{beginarray} { + BeginArray(); + BEGIN(ARRAY_NEXT); + yy_push_state(ARRAY_ITEM); +} + +{endstr} { + yy_pop_state(); + switch (YY_START) { + case ARRAY_ITEM: + case INITIAL: + PushText(std::move(buf)); + yy_pop_state(); + break; + case OBJECT_ITEM: + case OBJECT_ITEM_OR_END: + PushKey(std::move(buf)); + BEGIN(COLON); + break; + } + buf.clear(); +} + +{endobj} { + EndObject(); + yy_pop_state(); +} + +{endarray} { + EndArray(); + yy_pop_state(); + yy_pop_state(); +} + +{endarray} { + EndArray(); + yy_pop_state(); +} + +{colon} { + BEGIN(OBJECT_NEXT); + yy_push_state(INITIAL); +} + +{separator} { + BEGIN(OBJECT_ITEM); +} + +{separator} { + yy_push_state(INITIAL); +} + +{escape} { + yy_push_state(ESCAPE); +} + +"\"" { buf += "\""; yy_pop_state(); } +"\\" { buf += "\\"; yy_pop_state(); } +"/" { buf += "/"; yy_pop_state(); } +"b" { buf += "\b"; yy_pop_state(); } +"f" { buf += "\f"; yy_pop_state(); } +"n" { buf += "\n"; yy_pop_state(); } +"r" { buf += "\r"; yy_pop_state(); } +"t" { buf += "\t"; yy_pop_state(); } + +"u"[0-9a-fA-Z]{4} { + appendEscape(YYText(), buf); + yy_pop_state(); +} + +{text} { + buf += YYText(); +} + +<*>[ \t\r\n\f] { +} + +%% + +// Make iwyu think unistd.h is required +[[maybe_unused]]static auto x=getpid; -- cgit v1.2.3