29 bool acceptSingleValue,
30 bool accceptJsStyleKeys) :
32 acceptSingleValue(acceptSingleValue),
33 accceptJsStyleKeys(accceptJsStyleKeys),
34 previousTokenEndOffset(-1, -1, -1)
38 lexer->addRule(
eWhitespace,
"Whitespace",
"[\\r\\n\\s]+");
43 lexer->addRule(
eComma,
",",
",");
44 lexer->addRule(
eColon,
":",
"\\:");
46 eNumber,
"Number",
"-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?");
48 eString,
"String",
"\"([^\\\\\\\"]|\\\\.)*\"");
49 lexer->addRule(
eBoolean,
"Boolean",
"true|false");
50 lexer->addRule(
eNull,
"Null",
"null");
52 eId,
"ID",
"[_A-Za-z]\\w*");
73 if (lexer->currentTokenId != lexer->tokenFin)
75 error(
"end of string");
81 StructuralJsonParser::next()
84 previousTokenEndOffset = lexer->getPositionInfo(lexer->pos);
93 StructuralJsonParser::p_json()
95 if (acceptSingleValue)
109 return error(
"{ or [");
114 StructuralJsonParser::p_object()
117 o->setLexerStartOffset(lexer->getPositionInfo(lexer->pos));
123 o->setLexerEndOffset(previousTokenEndOffset);
127 if (!accceptJsStyleKeys && lexer->currentTokenId !=
eString)
129 return error(
"String or '}'", o);
131 else if (accceptJsStyleKeys && lexer->currentTokenId !=
eString &&
132 lexer->currentTokenId !=
eId)
134 return error(
"String, ID or '}'", o);
144 while (lexer->currentTokenId ==
eComma)
158 o->setLexerEndOffset(previousTokenEndOffset);
163 return error(
"',' or '}'", o);
170 if (!accceptJsStyleKeys && lexer->currentTokenId !=
eString)
175 else if (accceptJsStyleKeys && lexer->currentTokenId !=
eString &&
176 lexer->currentTokenId !=
eId)
178 error(
"String or ID");
184 if (accceptJsStyleKeys && lexer->currentTokenId ==
eId)
186 key = lexer->currentTokenValue;
196 if (lexer->currentTokenId !=
eColon)
214 StructuralJsonParser::p_array()
217 a->setLexerStartOffset(lexer->getPositionInfo(lexer->pos));
223 a->setLexerEndOffset(previousTokenEndOffset);
227 int posBeforeItem = lexer->pos;
233 if (posBeforeItem == lexer->pos)
236 return error(
"']', " + expected,
a);
244 while (lexer->currentTokenId ==
eComma)
259 a->setLexerEndOffset(previousTokenEndOffset);
264 return error(
", or ]",
a);
270 StructuralJsonParser::p_item()
272 switch (lexer->currentTokenId)
288 return error(
"'{', '[', String, Number, 'true', 'false' or 'null'");
293 StructuralJsonParser::p_leaf()
298 switch (lexer->currentTokenId)
304 return stringerror(val);
323 return error(
"String, Number, 'true', 'false' or 'null'");
326 value->setLexerStartOffset(lexer->getPositionInfo(lexer->pos));
328 value->setLexerEndOffset(previousTokenEndOffset);
333 StructuralJsonParser::error(
const std::string& expected,
const JsonDataPtr& toReturn)
335 this->err =
"Unexpected Token " + lexer->tokenIdToName(lexer->currentTokenId) +
" at " +
337 this->expected = expected;
342 StructuralJsonParser::stringerror(
const std::string& error,
const JsonDataPtr& toReturn)
345 this->expected = expected;
352 return err.length() > 0;
364 lexer->positionToLineAndColumn(lexer->lastPos, line, col);
371 lexer->positionToLineAndColumn(lexer->lastPos, line, col);
379 lexer->positionToLineAndColumn(lexer->lastPos, line, col);
388 std::string::const_iterator it =
s.begin();
389 std::string::const_iterator end =
s.end() - 1;
391 if (
s.length() < 1 || *it !=
'"')
393 res =
"Missing starting \"";
399 if (
s.length() < 2 || *end !=
'"')
401 res =
"Missing ending \"";
409 if (
c ==
'\\' && it !=
s.end())
446 res =
"\\u is not supported";
450 res =
"invalid escape sequence";