X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramparser.cpp;h=596ed0456b8e789ec2bd5ac636790a7d97bc8c4c;hb=8812fe9fc71b997246ddfdedb8a91932b679d2d3;hp=11c9a9fe4060acd391b390cbb36749b82f998d6f;hpb=5945ad9b63bbc55c3ed21f0c023d17f73aaac370;p=libs%2Fgl.git diff --git a/source/programparser.cpp b/source/programparser.cpp index 11c9a9fe..596ed045 100644 --- a/source/programparser.cpp +++ b/source/programparser.cpp @@ -332,8 +332,27 @@ bool ProgramParser::is_identifier(const string &token) Node *ProgramParser::parse_global_declaration() { string token = peek_token(); - if(token=="layout") - return parse_layout(); + if(token=="import") + return parse_import(); + else if(token=="layout") + { + RefPtr layout = parse_layout(); + token = peek_token(); + if(is_interface_qualifier(token) && peek_token(1)==";") + { + RefPtr iface_lo = new InterfaceLayout; + iface_lo->layout.qualifiers = layout->qualifiers; + iface_lo->interface = parse_token(); + expect(";"); + return iface_lo.release(); + } + else + { + VariableDeclaration *var = parse_variable_declaration(); + var->layout = layout.release(); + return var; + } + } else if(token=="struct") return parse_struct_declaration(); else if(is_sampling_qualifier(token) || token=="const") @@ -383,6 +402,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 = new Import; + import->module = parse_token(); + expect(";"); + return import.release(); +} + Layout *ProgramParser::parse_layout() { expect("layout"); @@ -407,8 +438,6 @@ Layout *ProgramParser::parse_layout() expect(","); } expect(")"); - layout->interface = parse_token(); - expect(";"); return layout.release(); } @@ -493,6 +522,12 @@ Expression *ProgramParser::parse_expression(unsigned precedence) expect(")"); left = parexpr; } + else if(isdigit(token[0]) || token=="true" || token=="false") + { + RefPtr literal = new Literal; + literal->token = parse_token(); + left = literal; + } else if(is_identifier(token)) { RefPtr var = new VariableReference; @@ -508,12 +543,6 @@ Expression *ProgramParser::parse_expression(unsigned precedence) unary->expression = parse_expression(oper->precedence); left = unary; } - else if(isdigit(token[0])) - { - RefPtr literal = new Literal; - literal->token = parse_token(); - left = literal; - } else throw runtime_error(format("Parse error at '%s': expected an expression", token)); } @@ -522,7 +551,7 @@ Expression *ProgramParser::parse_expression(unsigned precedence) BinaryExpression *ProgramParser::parse_binary(Expression *left, const Operator *oper) { - RefPtr binary = new BinaryExpression; + RefPtr binary = (oper->precedence==16 ? new Assignment : new BinaryExpression); binary->left = left; binary->oper = parse_token(); if(binary->oper=="[") @@ -533,7 +562,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 +657,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==";")