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;
}
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;
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>();