|
@@ -972,6 +972,7 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
|
|
bool unary = false;
|
|
bool unary = false;
|
|
bool ternary = false;
|
|
bool ternary = false;
|
|
bool error = false;
|
|
bool error = false;
|
|
|
|
+ bool right_to_left = false;
|
|
|
|
|
|
switch (expression[i].op) {
|
|
switch (expression[i].op) {
|
|
|
|
|
|
@@ -1022,11 +1023,13 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
|
|
case OperatorNode::OP_TERNARY_IF:
|
|
case OperatorNode::OP_TERNARY_IF:
|
|
priority = 14;
|
|
priority = 14;
|
|
ternary = true;
|
|
ternary = true;
|
|
|
|
+ right_to_left = true;
|
|
break;
|
|
break;
|
|
case OperatorNode::OP_TERNARY_ELSE:
|
|
case OperatorNode::OP_TERNARY_ELSE:
|
|
priority = 14;
|
|
priority = 14;
|
|
error = true;
|
|
error = true;
|
|
- break; // Errors out when found without IF (since IF would consume it)
|
|
|
|
|
|
+ // Rigth-to-left should be false in this case, otherwise it would always error.
|
|
|
|
+ break;
|
|
|
|
|
|
case OperatorNode::OP_ASSIGN: priority = 15; break;
|
|
case OperatorNode::OP_ASSIGN: priority = 15; break;
|
|
case OperatorNode::OP_ASSIGN_ADD: priority = 15; break;
|
|
case OperatorNode::OP_ASSIGN_ADD: priority = 15; break;
|
|
@@ -1046,13 +1049,13 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (priority < min_priority) {
|
|
|
|
|
|
+ if (priority < min_priority || (right_to_left && priority == min_priority)) {
|
|
|
|
+ // < is used for left to right (default)
|
|
|
|
+ // <= is used for right to left
|
|
if (error) {
|
|
if (error) {
|
|
_set_error("Unexpected operator");
|
|
_set_error("Unexpected operator");
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
- // < is used for left to right (default)
|
|
|
|
- // <= is used for right to left
|
|
|
|
next_op = i;
|
|
next_op = i;
|
|
min_priority = priority;
|
|
min_priority = priority;
|
|
is_unary = unary;
|
|
is_unary = unary;
|