X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FParser.cpp;h=25a99b6d2314dbc7f7e6e591e80dee875a040b2e;hb=5cca794c5b6549b7750c88b5c2217d659fa963dd;hp=8ba370408206bc60f0cfa4d98574e56f6222d624;hpb=fa339aa45524243e716fd234a09c929d0eec95f8;p=l2e.git diff --git a/src/loader/Parser.cpp b/src/loader/Parser.cpp index 8ba3704..25a99b6 100644 --- a/src/loader/Parser.cpp +++ b/src/loader/Parser.cpp @@ -1,18 +1,14 @@ -/* - * Parser.cpp - * - * Created on: Aug 26, 2012 - * Author: holy - */ - #include "Parser.h" +#include "ParsedSource.h" #include "utility.h" -#include #include +#include +#include +#include -using std::auto_ptr; +using std::unique_ptr; using std::ifstream; using std::string; using std::vector; @@ -91,14 +87,14 @@ Declaration *Parser::ProbeDefinition() { Token t(GetToken()); tok.Putback(t); if (BeginOfPropertyList(t)) { - auto_ptr propertyList(ParsePropertyList()); - auto_ptr dfn(new Definition(typeName, identifier)); + unique_ptr propertyList(ParsePropertyList()); + unique_ptr dfn(new Definition(typeName, identifier)); dfn->SetValue(propertyList.release()); product.AddDefinition(dfn.get()); return dfn.release(); } else if (BeginningOfPrimitiveLiteral(t)) { - auto_ptr literal(ParseLiteral()); - auto_ptr dfn(new Definition(typeName, identifier)); + unique_ptr literal(ParseLiteral()); + unique_ptr dfn(new Definition(typeName, identifier)); dfn->SetValue(literal.release()); product.AddDefinition(dfn.get()); return dfn.release(); @@ -186,7 +182,7 @@ PropertyList *Parser::ParsePropertyList() { Token t(GetToken()); AssertTokenType(t.type, Token::ANGLE_BRACKET_OPEN); - auto_ptr props(new PropertyList); + unique_ptr props(new PropertyList); while (t.type != Token::ANGLE_BRACKET_CLOSE) { Token name(GetToken()); @@ -266,17 +262,33 @@ Literal *Parser::ParseArray() { Token probe(GetToken()); if (probe.type == Token::TYPE_NAME) { - vector values; - while (t.type != Token::BRACKET_CLOSE) { - PropertyList *value(ParsePropertyList()); - values.push_back(value); + t = GetToken(); + tok.Putback(t); + if (t.type == Token::ANGLE_BRACKET_OPEN) { + vector values; + while (t.type != Token::BRACKET_CLOSE) { + PropertyList *value(ParsePropertyList()); + values.push_back(value); - t = GetToken(); - if (t.type != Token::BRACKET_CLOSE && t.type != Token::COMMA) { - throw Error(file, tok.Line(), string("unexpected token ") + TokenTypeToString(t.type) + ", expected , or ]"); + t = GetToken(); + if (t.type != Token::BRACKET_CLOSE && t.type != Token::COMMA) { + throw Error(file, tok.Line(), string("unexpected token ") + TokenTypeToString(t.type) + ", expected , or ]"); + } + } + return new Literal(probe.str, values); + } else { + vector values; + while (t.type != Token::BRACKET_CLOSE) { + string value(ParseIdentifier()); + values.push_back(value); + + t = GetToken(); + if (t.type != Token::BRACKET_CLOSE && t.type != Token::COMMA) { + throw Error(file, tok.Line(), string("unexpected token ") + TokenTypeToString(t.type) + ", expected , or ]"); + } } + return new Literal(probe.str, values); } - return new Literal(probe.str, values); } else { tok.Putback(probe); @@ -355,6 +367,7 @@ Literal *Parser::ParseScript() { Token t(GetToken()); AssertTokenType(t.type, Token::SCRIPT_BEGIN, msg); + t = GetToken(); vector script; try { while (t.type != Token::SCRIPT_END) { @@ -365,17 +378,23 @@ Literal *Parser::ParseScript() { switch (t.type) { case Token::COMMAND: { Token t2(GetToken()); - AssertTokenType(t.type, Token::IDENTIFIER, msg); + AssertTokenType(t2.type, Token::IDENTIFIER, msg); script.push_back(new ScriptToken(t2.str, ScriptToken::COMMAND)); break; } case Token::IDENTIFIER: { - script.push_back(new ScriptToken(t.str, ScriptToken::IDENTIFIER)); + Token t2(GetToken()); + if (t2.type == Token::COLON) { + script.push_back(new ScriptToken(t.str, ScriptToken::LABEL)); + } else { + tok.Putback(t2); + script.push_back(new ScriptToken(t.str, ScriptToken::IDENTIFIER)); + } break; } case Token::REGISTER: { Token t2(GetToken()); - AssertTokenType(t.type, Token::IDENTIFIER, msg); + AssertTokenType(t2.type, Token::IDENTIFIER, msg); script.push_back(new ScriptToken(t2.str, ScriptToken::REGISTER)); break; }