]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/parser.cpp
Implement the ternary operator in GLSL
[libs/gl.git] / source / glsl / parser.cpp
index b4631daf6d1c4e5b3cafa638400bd94e9d157074..0c3a5e35a57a35033024989aa96076b06bd141cd 100644 (file)
@@ -449,7 +449,7 @@ RefPtr<Expression> 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<Expression> 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<BinaryExpression> Parser::parse_binary(const RefPtr<Expression> &left, co
        return binary;
 }
 
+RefPtr<TernaryExpression> Parser::parse_ternary(const RefPtr<Expression> &cond, const Operator &oper)
+{
+       RefPtr<TernaryExpression> ternary = create_node<TernaryExpression>();
+       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<FunctionCall> Parser::parse_function_call(const VariableReference &var)
 {
        RefPtr<FunctionCall> call = create_node<FunctionCall>();