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";