X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FParser.cpp;h=6ced1be4ee38707641c9cd7be956c73b6812082a;hb=ab772977707672896ec6ce7a23add2bdb044170a;hp=cbb006c779f6645513c06810af7502937f1d39b2;hpb=8d3decb97c252bc7b0ba4b9b5def0b04dfcb8e00;p=l2e.git diff --git a/src/loader/Parser.cpp b/src/loader/Parser.cpp index cbb006c..6ced1be 100644 --- a/src/loader/Parser.cpp +++ b/src/loader/Parser.cpp @@ -44,12 +44,10 @@ void Parser::ParseStatement() { } } -Tokenizer::Token Parser::GetToken() { - try { - return tok.GetNext(); - } catch (Tokenizer::LexerError &e) { - throw Error(file, e.Line(), e.what()); - } +Tokenizer::Token Parser::GetToken() try { + return tok.GetNext(); +} catch (Tokenizer::LexerError &e) { + throw Error(file, e.Line(), e.what()); } void Parser::ParseExportDirective() { @@ -77,15 +75,17 @@ Declaration *Parser::ProbeDefinition() { Tokenizer::Token t(GetToken()); tok.Putback(t); if (BeginOfPropertyList(t)) { - PropertyList *propertyList(ParsePropertyList()); - Definition *dfn(new Definition(typeName, identifier)); - dfn->SetValue(propertyList); - return dfn; + auto_ptr propertyList(ParsePropertyList()); + auto_ptr dfn(new Definition(typeName, identifier)); + dfn->SetValue(propertyList.release()); + product.AddDefinition(dfn.get()); + return dfn.release(); } else if (BeginningOfLiteral(t)) { - Literal *literal(ParseLiteral()); - Definition *dfn(new Definition(typeName, identifier)); - dfn->SetValue(literal); - return dfn; + auto_ptr literal(ParseLiteral()); + auto_ptr dfn(new Definition(typeName, identifier)); + dfn->SetValue(literal.release()); + product.AddDefinition(dfn.get()); + return dfn.release(); } else { return new Declaration(typeName, identifier); } @@ -218,19 +218,34 @@ Literal *Parser::ParseArray() { Tokenizer::Token t(GetToken()); AssertTokenType(t.type, Tokenizer::Token::BRACKET_OPEN); - vector values; + Tokenizer::Token probe(GetToken()); + tok.Putback(probe); - while (t.type != Tokenizer::Token::ANGLE_BRACKET_CLOSE) { - Value *value(ParseValue()); - values.push_back(value); + if (probe.type == Tokenizer::Token::ANGLE_BRACKET_OPEN) { + vector values; + while (t.type != Tokenizer::Token::BRACKET_CLOSE) { + PropertyList *value(ParsePropertyList()); + values.push_back(value); - t = GetToken(); - if (t.type != Tokenizer::Token::BRACKET_CLOSE && t.type != Tokenizer::Token::COMMA) { - throw Error(file, tok.Line(), string("unexpected token ") + TokenTypeToString(t.type) + ", expected , or ]"); + t = GetToken(); + if (t.type != Tokenizer::Token::BRACKET_CLOSE && t.type != Tokenizer::Token::COMMA) { + throw Error(file, tok.Line(), string("unexpected token ") + TokenTypeToString(t.type) + ", expected , or ]"); + } } + return new Literal(values); + } else { + vector values; + while (t.type != Tokenizer::Token::BRACKET_CLOSE) { + Value *value(ParseValue()); + values.push_back(value); + + t = GetToken(); + if (t.type != Tokenizer::Token::BRACKET_CLOSE && t.type != Tokenizer::Token::COMMA) { + throw Error(file, tok.Line(), string("unexpected token ") + TokenTypeToString(t.type) + ", expected , or ]"); + } + } + return new Literal(values); } - - return new Literal(values); } Literal *Parser::ParseColor() {