You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Implement exponential operator (**) to GDScript/Expressions
This commit is contained in:
committed by
Yuri Rubinsky
parent
9963ae3553
commit
dbd7a31507
@@ -155,7 +155,12 @@ Error Expression::_get_token(Token &r_token) {
|
||||
return OK;
|
||||
}
|
||||
case '*': {
|
||||
r_token.type = TK_OP_MUL;
|
||||
if (expression[str_ofs] == '*') {
|
||||
r_token.type = TK_OP_POW;
|
||||
str_ofs++;
|
||||
} else {
|
||||
r_token.type = TK_OP_MUL;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
case '%': {
|
||||
@@ -542,6 +547,7 @@ const char *Expression::token_name[TK_MAX] = {
|
||||
"OP MUL",
|
||||
"OP DIV",
|
||||
"OP MOD",
|
||||
"OP POW",
|
||||
"OP SHIFT LEFT",
|
||||
"OP SHIFT RIGHT",
|
||||
"OP BIT AND",
|
||||
@@ -1013,6 +1019,9 @@ Expression::ENode *Expression::_parse_expression() {
|
||||
case TK_OP_MOD:
|
||||
op = Variant::OP_MODULE;
|
||||
break;
|
||||
case TK_OP_POW:
|
||||
op = Variant::OP_POWER;
|
||||
break;
|
||||
case TK_OP_SHIFT_LEFT:
|
||||
op = Variant::OP_SHIFT_LEFT;
|
||||
break;
|
||||
@@ -1066,56 +1075,59 @@ Expression::ENode *Expression::_parse_expression() {
|
||||
bool unary = false;
|
||||
|
||||
switch (expression[i].op) {
|
||||
case Variant::OP_BIT_NEGATE:
|
||||
case Variant::OP_POWER:
|
||||
priority = 0;
|
||||
break;
|
||||
case Variant::OP_BIT_NEGATE:
|
||||
priority = 1;
|
||||
unary = true;
|
||||
break;
|
||||
case Variant::OP_NEGATE:
|
||||
priority = 1;
|
||||
priority = 2;
|
||||
unary = true;
|
||||
break;
|
||||
case Variant::OP_MULTIPLY:
|
||||
case Variant::OP_DIVIDE:
|
||||
case Variant::OP_MODULE:
|
||||
priority = 2;
|
||||
priority = 3;
|
||||
break;
|
||||
case Variant::OP_ADD:
|
||||
case Variant::OP_SUBTRACT:
|
||||
priority = 3;
|
||||
priority = 4;
|
||||
break;
|
||||
case Variant::OP_SHIFT_LEFT:
|
||||
case Variant::OP_SHIFT_RIGHT:
|
||||
priority = 4;
|
||||
break;
|
||||
case Variant::OP_BIT_AND:
|
||||
priority = 5;
|
||||
break;
|
||||
case Variant::OP_BIT_XOR:
|
||||
case Variant::OP_BIT_AND:
|
||||
priority = 6;
|
||||
break;
|
||||
case Variant::OP_BIT_OR:
|
||||
case Variant::OP_BIT_XOR:
|
||||
priority = 7;
|
||||
break;
|
||||
case Variant::OP_BIT_OR:
|
||||
priority = 8;
|
||||
break;
|
||||
case Variant::OP_LESS:
|
||||
case Variant::OP_LESS_EQUAL:
|
||||
case Variant::OP_GREATER:
|
||||
case Variant::OP_GREATER_EQUAL:
|
||||
case Variant::OP_EQUAL:
|
||||
case Variant::OP_NOT_EQUAL:
|
||||
priority = 8;
|
||||
priority = 9;
|
||||
break;
|
||||
case Variant::OP_IN:
|
||||
priority = 10;
|
||||
priority = 11;
|
||||
break;
|
||||
case Variant::OP_NOT:
|
||||
priority = 11;
|
||||
priority = 12;
|
||||
unary = true;
|
||||
break;
|
||||
case Variant::OP_AND:
|
||||
priority = 12;
|
||||
priority = 13;
|
||||
break;
|
||||
case Variant::OP_OR:
|
||||
priority = 13;
|
||||
priority = 14;
|
||||
break;
|
||||
default: {
|
||||
_set_error("Parser bug, invalid operator in expression: " + itos(expression[i].op));
|
||||
|
||||
Reference in New Issue
Block a user