]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Implement an import system
[libs/gl.git] / source / programparser.cpp
index 11c9a9fe4060acd391b390cbb36749b82f998d6f..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));
                }
@@ -522,7 +536,7 @@ Expression *ProgramParser::parse_expression(unsigned precedence)
 
 BinaryExpression *ProgramParser::parse_binary(Expression *left, const Operator *oper)
 {
-       RefPtr<BinaryExpression> binary = new BinaryExpression;
+       RefPtr<BinaryExpression> binary = (oper->precedence==16 ? new Assignment : new BinaryExpression);
        binary->left = left;
        binary->oper = parse_token();
        if(binary->oper=="[")
@@ -533,7 +547,6 @@ BinaryExpression *ProgramParser::parse_binary(Expression *left, const Operator *
        }
        else
                binary->right = parse_expression(oper->precedence+(oper->assoc==RIGHT_TO_LEFT));
-       binary->assignment = (oper->precedence==16);
        return binary.release();
 }
 
@@ -629,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==";")