// ------------------------------------------------------------------------------------------------ Scope::Scope(Parser& parser,bool topLevel) { if(!topLevel) { TokenPtr t = parser.CurrentToken(); if (t->Type() != TokenType_OPEN_BRACKET) { ParseError("expected open bracket",t); } } TokenPtr n = parser.AdvanceToNextToken(); if(n == NULL) { ParseError("unexpected end of file"); } // note: empty scopes are allowed while(n->Type() != TokenType_CLOSE_BRACKET) { if (n->Type() != TokenType_KEY) { ParseError("unexpected token, expected TOK_KEY",n); } const std::string& str = n->StringContents(); elements.insert(ElementMap::value_type(str,new_Element(*n,parser))); // Element() should stop at the next Key token (or right after a Close token) n = parser.CurrentToken(); if(n == NULL) { if (topLevel) { return; } ParseError("unexpected end of file",parser.LastToken()); } } }
// ------------------------------------------------------------------------------------------------ Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) { TokenPtr n = NULL; do { n = parser.AdvanceToNextToken(); if(!n) { ParseError("unexpected end of file, expected closing bracket",parser.LastToken()); } if (n->Type() == TokenType_DATA) { tokens.push_back(n); TokenPtr prev = n; n = parser.AdvanceToNextToken(); if(!n) { ParseError("unexpected end of file, expected bracket, comma or key",parser.LastToken()); } const TokenType ty = n->Type(); // some exporters are missing a comma on the next line if (ty == TokenType_DATA && prev->Type() == TokenType_DATA && (n->Line() == prev->Line() + 1)) { tokens.push_back(n); continue; } if (ty != TokenType_OPEN_BRACKET && ty != TokenType_CLOSE_BRACKET && ty != TokenType_COMMA && ty != TokenType_KEY) { ParseError("unexpected token; expected bracket, comma or key",n); } } if (n->Type() == TokenType_OPEN_BRACKET) { compound.reset(new Scope(parser)); // current token should be a TOK_CLOSE_BRACKET n = parser.CurrentToken(); ai_assert(n); if (n->Type() != TokenType_CLOSE_BRACKET) { ParseError("expected closing bracket",n); } parser.AdvanceToNextToken(); return; } } while(n->Type() != TokenType_KEY && n->Type() != TokenType_CLOSE_BRACKET); }