]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Implement an import system
[libs/gl.git] / source / programparser.cpp
index f003a835b56b0352e7abe2387bcaff24792d87ce..ddea96409dea4475e911e94fac01fda171451b57 100644 (file)
@@ -332,7 +332,9 @@ bool ProgramParser::is_identifier(const string &token)
 Node *ProgramParser::parse_global_declaration()
 {
        string token = peek_token();
-       if(token=="layout")
+       if(token=="import")
+               return parse_import();
+       else if(token=="layout")
                return parse_layout();
        else if(token=="struct")
                return parse_struct_declaration();
@@ -383,6 +385,18 @@ Node *ProgramParser::parse_statement()
                throw runtime_error(format("Syntax error at '%s': expected a statement", token));
 }
 
+Import *ProgramParser::parse_import()
+{
+       if(cur_stage->type!=SHARED)
+               throw runtime_error("Imports are only allowed in the shared section");
+
+       expect("import");
+       RefPtr<Import> import = new Import;
+       import->module = parse_token();
+       expect(";");
+       return import.release();
+}
+
 Layout *ProgramParser::parse_layout()
 {
        expect("layout");
@@ -493,6 +507,12 @@ Expression *ProgramParser::parse_expression(unsigned precedence)
                                expect(")");
                                left = parexpr;
                        }
+                       else if(isdigit(token[0]) || token=="true" || token=="false")
+                       {
+                               RefPtr<Literal> literal = new Literal;
+                               literal->token = parse_token();
+                               left = literal;
+                       }
                        else if(is_identifier(token))
                        {
                                RefPtr<VariableReference> var = new VariableReference;
@@ -508,12 +528,6 @@ Expression *ProgramParser::parse_expression(unsigned precedence)
                                unary->expression = parse_expression(oper->precedence);
                                left = unary;
                        }
-                       else if(isdigit(token[0]))
-                       {
-                               RefPtr<Literal> literal = new Literal;
-                               literal->token = parse_token();
-                               left = literal;
-                       }
                        else
                                throw runtime_error(format("Parse error at '%s': expected an expression", token));
                }
@@ -628,7 +642,7 @@ FunctionDeclaration *ProgramParser::parse_function_declaration()
        string token = peek_token();
        if(token=="{")
        {
-               func->definition = true;
+               func->definition = func.get();
                parse_block(func->body, true);
        }
        else if(token==";")