]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Parser.cpp
extracted menu properties to a non-template struct
[l2e.git] / src / loader / Parser.cpp
index d6abcc39561e4b70f8fce0ced7ce880580701ad0..01ddbe2bbdd19670bee0bcd0f88244063497d542 100644 (file)
@@ -7,6 +7,8 @@
 
 #include "Parser.h"
 
+#include "utility.h"
+
 #include <auto_ptr.h>
 #include <fstream>
 
@@ -17,9 +19,10 @@ using std::vector;
 
 namespace loader {
 
-Parser::Parser(const char *file, ParsedSource &product)
+Parser::Parser(const string &file, ParsedSource &product)
 : file(file)
-, in(file)
+, dirname(Dirname(file))
+, in(this->file.c_str())
 , tok(in)
 , product(product) {
        if (!in) {
@@ -74,7 +77,7 @@ void Parser::ParseExportDirective() {
 void Parser::ParseIncludeDirective() {
        Tokenizer::Token t(GetToken());
        AssertTokenType(t.type, Tokenizer::Token::STRING);
-       Parser sub(t.str.c_str(), product); // TODO: resolve path name
+       Parser sub(CatPath(dirname, t.str), product);
        sub.Parse();
 }
 
@@ -104,6 +107,7 @@ Declaration *Parser::ProbeDefinition() {
 bool Parser::BeginningOfLiteral(const Tokenizer::Token &t) const {
        switch (t.type) {
                case Tokenizer::Token::CHEVRON_OPEN:
+               case Tokenizer::Token::COLON:
                case Tokenizer::Token::BRACKET_OPEN:
                case Tokenizer::Token::PARENTHESIS_OPEN:
                case Tokenizer::Token::NUMBER:
@@ -202,6 +206,10 @@ Literal *Parser::ParseLiteral() {
                        case Tokenizer::Token::CHEVRON_OPEN:
                                tok.Putback(t);
                                return ParseVector();
+                       case Tokenizer::Token::COLON:
+                               t = GetToken();
+                               AssertTokenType(t.type, Tokenizer::Token::STRING);
+                               return new Literal(dirname, t.str);
                        case Tokenizer::Token::BRACKET_OPEN:
                                tok.Putback(t);
                                return ParseArray();
@@ -279,7 +287,7 @@ Literal *Parser::ParseColor() {
        AssertTokenType(blue.type, Tokenizer::Token::NUMBER, "error parsing blue component of color");
 
        t = GetToken();
-       if (t.type == Tokenizer::Token::BRACKET_CLOSE) {
+       if (t.type == Tokenizer::Token::PARENTHESIS_CLOSE) {
                return new Literal(red.number, green.number, blue.number);
        } else if (t.type != Tokenizer::Token::COMMA) {
                Tokenizer::Token alpha(GetToken());