X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fparser.cpp;h=0c3a5e35a57a35033024989aa96076b06bd141cd;hp=b4631daf6d1c4e5b3cafa638400bd94e9d157074;hb=3a1fe833ea04df75449706f1d773f6e65521a392;hpb=1476e64621ecbd7b17b00ae2c958322fd39918de diff --git a/source/glsl/parser.cpp b/source/glsl/parser.cpp index b4631daf..0c3a5e35 100644 --- a/source/glsl/parser.cpp +++ b/source/glsl/parser.cpp @@ -449,7 +449,7 @@ RefPtr Parser::parse_expression(const Operator *outer_oper) oper = i; bool lower_precedence = (oper && oper->type!=Operator::PREFIX && oper->precedence>=outer_precedence); - if(token==";" || token==")" || token=="]" || token=="," || lower_precedence) + if(token==";" || token==")" || token=="]" || token=="," || token==":" || lower_precedence) { if(left) return left; @@ -483,6 +483,8 @@ RefPtr Parser::parse_expression(const Operator *outer_oper) } else if(oper && oper->type==Operator::BINARY) left = parse_binary(left, *oper); + else if(oper && oper->type==Operator::TERNARY) + left = parse_ternary(left, *oper); else throw parse_error(tokenizer.get_location(), token, "an operator"); left_var = 0; @@ -557,6 +559,18 @@ RefPtr Parser::parse_binary(const RefPtr &left, co return binary; } +RefPtr Parser::parse_ternary(const RefPtr &cond, const Operator &oper) +{ + RefPtr ternary = create_node(); + ternary->condition = cond; + ternary->oper = &oper; + tokenizer.expect("?"); + ternary->true_expr = parse_expression(&oper); + tokenizer.expect(":"); + ternary->false_expr = parse_expression(&oper); + return ternary; +} + RefPtr Parser::parse_function_call(const VariableReference &var) { RefPtr call = create_node();