]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Parser.cpp
added interpretation of colors
[l2e.git] / src / loader / Parser.cpp
index 6ced1be4ee38707641c9cd7be956c73b6812082a..01ddbe2bbdd19670bee0bcd0f88244063497d542 100644 (file)
@@ -7,6 +7,8 @@
 
 #include "Parser.h"
 
+#include "utility.h"
+
 #include <auto_ptr.h>
 #include <fstream>
 
@@ -17,6 +19,17 @@ using std::vector;
 
 namespace loader {
 
+Parser::Parser(const string &file, ParsedSource &product)
+: file(file)
+, dirname(Dirname(file))
+, in(this->file.c_str())
+, tok(in)
+, product(product) {
+       if (!in) {
+               throw Error(file, 0, "unable to read file");
+       }
+}
+
 void Parser::Parse() {
        while (tok.HasMore()) {
                ParseStatement();
@@ -64,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();
 }
 
@@ -94,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:
@@ -192,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();
@@ -269,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());