From c30e3e67132eb1f92bffff4d787313cfa9652983 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Wed, 14 May 2025 19:41:57 -0400 Subject: [PATCH] Fix parsing empty arrays/objects --- src/test.cpp | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index 64f8b5b..909e7e7 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -143,6 +143,8 @@ enum Symbol : int8_t { T_COLON, // Nonterminals N_VALUE, + N_ARRAY_VALUE_OR_END, + N_OBJECT_VALUE_OR_END, N_ARRAY_MAYBE_CONTINUE, N_OBJECT_MAYBE_CONTINUE, N_PAST_END, // Must be last nonterminal @@ -152,6 +154,8 @@ const char *symbolNames[] = { "T_STRING", "T_COLON", "N_VALUE", + "N_ARRAY_VALUE_OR_END", + "N_OBJECT_VALUE_OR_END", "N_ARRAY_MAYBE_CONTINUE", "N_OBJECT_MAYBE_CONTINUE", }; @@ -531,14 +535,14 @@ private: } else if (self->parseLiteral("{")) { self->pop(); self->callbacks->on_begin_object(self->data); - if (!self->push({T_STRING, T_COLON, N_VALUE, N_OBJECT_MAYBE_CONTINUE})) { + if (!self->push({N_OBJECT_VALUE_OR_END})) { return false; } MUSTTAIL return keepGoing(self); } else if (self->parseLiteral("[")) { self->pop(); self->callbacks->on_begin_array(self->data); - if (!self->push({N_VALUE, N_ARRAY_MAYBE_CONTINUE})) { + if (!self->push({N_ARRAY_VALUE_OR_END})) { return false; } MUSTTAIL return keepGoing(self); @@ -557,6 +561,33 @@ private: } return false; } + static bool arrayOrEnd(Parser2 *self) { + if (self->parseLiteral("]")) { + self->pop(); + self->callbacks->on_end_array(self->data); + MUSTTAIL return keepGoing(self); + } else { + self->pop(); + if (!self->push({N_VALUE, N_ARRAY_MAYBE_CONTINUE})) { + return false; + } + MUSTTAIL return keepGoing(self); + } + } + static bool objectOrEnd(Parser2 *self) { + if (self->parseLiteral("}")) { + self->pop(); + self->callbacks->on_end_object(self->data); + MUSTTAIL return keepGoing(self); + } else { + self->pop(); + if (!self->push({T_STRING, T_COLON, N_VALUE, N_OBJECT_MAYBE_CONTINUE})) { + return false; + } + MUSTTAIL return keepGoing(self); + } + return false; + } static bool arrayContinue(Parser2 *self) { if (self->parseLiteral(",")) { self->pop(); @@ -590,6 +621,8 @@ private: /*T_STRING*/ string, /*T_COLON*/ colon, /*N_VALUE*/ value, + /*N_ARRAY_VALUE_OR_END*/ arrayOrEnd, + /*N_OBJECT_VALUE_OR_END*/ objectOrEnd, /*N_ARRAY_MAYBE_CONTINUE*/ arrayContinue, /*N_OBJECT_MAYBE_CONTINUE*/ objectContinue, };