X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fparser.cpp;h=b09d2b5550b47c321fba2a69feedc4d7c36f0293;hb=e195322eb1251f2eb0d6dfb8c2dc0fff02e5fcfc;hp=1f0d712467f3b43c2d9990dfa277bb1c46d0ff42;hpb=9ec831710f64a62ad5f2e896a55ae82a3519f29e;p=libs%2Fgl.git diff --git a/source/glsl/parser.cpp b/source/glsl/parser.cpp index 1f0d7124..b09d2b55 100644 --- a/source/glsl/parser.cpp +++ b/source/glsl/parser.cpp @@ -58,7 +58,7 @@ void Parser::parse_source(const string &name, int index) source_index = index; if(index>=0) source_reference(1, name); - tokenizer.begin(name, source); + tokenizer.begin(source, name); allow_stage_change = true; while(!tokenizer.peek_token().empty()) if(RefPtr statement = parse_with_recovery(&Parser::parse_global_declaration)) @@ -456,6 +456,7 @@ RefPtr Parser::parse_expression(unsigned precedence) { RefPtr memacc = new MemberAccess; memacc->left = left; + memacc->oper = oper; tokenizer.parse_token(); memacc->member = expect_identifier(); left = memacc; @@ -463,13 +464,13 @@ RefPtr Parser::parse_expression(unsigned precedence) else if(oper && oper->type==Operator::POSTFIX) { RefPtr unary = new UnaryExpression; - unary->oper = tokenizer.parse_token(); - unary->prefix = false; + unary->oper = oper; + tokenizer.parse_token(); unary->expression = left; left = unary; } else if(oper && oper->type==Operator::BINARY) - left = parse_binary(left, oper); + left = parse_binary(left, *oper); else throw parse_error(tokenizer.get_location(), token, "an operator"); left_var = 0; @@ -500,8 +501,8 @@ RefPtr Parser::parse_expression(unsigned precedence) else if(oper && oper->type==Operator::PREFIX) { RefPtr unary = new UnaryExpression; - unary->oper = tokenizer.parse_token(); - unary->prefix = true; + unary->oper = oper; + tokenizer.parse_token(); unary->expression = parse_expression(oper->precedence); left = unary; } @@ -511,19 +512,19 @@ RefPtr Parser::parse_expression(unsigned precedence) } } -RefPtr Parser::parse_binary(const RefPtr &left, const Operator *oper) +RefPtr Parser::parse_binary(const RefPtr &left, const Operator &oper) { - RefPtr binary = (oper->precedence==16 ? new Assignment : new BinaryExpression); + RefPtr binary = (oper.precedence==16 ? new Assignment : new BinaryExpression); binary->left = left; - binary->oper = tokenizer.parse_token(); - if(binary->oper=="[") + binary->oper = &oper; + tokenizer.expect(oper.token); + if(oper.token[0]=='[') { binary->right = parse_expression(); tokenizer.expect("]"); - binary->after = "]"; } else - binary->right = parse_expression(oper->precedence+(oper->assoc==Operator::RIGHT_TO_LEFT)); + binary->right = parse_expression(oper.precedence+(oper.assoc==Operator::RIGHT_TO_LEFT)); return binary; } @@ -532,6 +533,7 @@ RefPtr Parser::parse_function_call(const VariableReference &var) RefPtr call = new FunctionCall; call->name = var.name; call->constructor = is_type(call->name); + call->oper = &Operator::get_operator("(", Operator::POSTFIX); tokenizer.expect("("); while(tokenizer.peek_token()!=")") {