-/*
- * Parser.cpp
- *
- * Created on: Aug 26, 2012
- * Author: holy
- */
-
#include "Parser.h"
+#include "ParsedSource.h"
#include "utility.h"
#include <auto_ptr.h>
#include <fstream>
+#include <string>
+#include <vector>
using std::auto_ptr;
using std::ifstream;
Token probe(GetToken());
if (probe.type == Token::TYPE_NAME) {
- vector<PropertyList *> 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<PropertyList *> 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<string> 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);
Token t(GetToken());
AssertTokenType(t.type, Token::SCRIPT_BEGIN, msg);
+ t = GetToken();
vector<ScriptToken *> script;
try {
while (t.type != Token::SCRIPT_END) {
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;
}