+Literal *Parser::ParseScript() {
+ std::string msg("error parsing script");
+ Tokenizer::Token t(GetToken());
+ AssertTokenType(t.type, Tokenizer::Token::SCRIPT_BEGIN, msg);
+
+ vector<ScriptToken *> script;
+ try {
+ while (t.type != Tokenizer::Token::SCRIPT_END) {
+ if (BeginningOfPrimitiveLiteral(t)) {
+ tok.Putback(t);
+ script.push_back(new ScriptToken(ParseLiteral()));
+ } else {
+ switch (t.type) {
+ case Tokenizer::Token::COMMAND: {
+ Tokenizer::Token t2(GetToken());
+ AssertTokenType(t.type, Tokenizer::Token::IDENTIFIER, msg);
+ script.push_back(new ScriptToken(t2.str, ScriptToken::COMMAND));
+ break;
+ }
+ case Tokenizer::Token::IDENTIFIER: {
+ script.push_back(new ScriptToken(t.str, ScriptToken::IDENTIFIER));
+ break;
+ }
+ case Tokenizer::Token::REGISTER: {
+ Tokenizer::Token t2(GetToken());
+ AssertTokenType(t.type, Tokenizer::Token::IDENTIFIER, msg);
+ script.push_back(new ScriptToken(t2.str, ScriptToken::REGISTER));
+ break;
+ }
+ default:
+ throw Error(file, tok.Line(), string("unexpected token in script: ") + TokenTypeToString(t.type));
+ }
+ }
+ t = GetToken();
+ }
+ } catch (...) {
+ for (vector<ScriptToken *>::const_iterator i(script.begin()), end(script.end()); i != end; ++i) {
+ delete *i;
+ }
+ throw;
+ }
+ return new Literal(script);
+}
+
+