mirror of
https://github.com/godotengine/godot.git
synced 2026-01-06 10:11:57 +03:00
Implement exponential operator (**) to GDScript/Expressions
This commit is contained in:
committed by
Yuri Rubinsky
parent
9963ae3553
commit
dbd7a31507
@@ -2320,6 +2320,10 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_binary_operator(Expression
|
||||
operation->operation = BinaryOpNode::OP_MODULO;
|
||||
operation->variant_op = Variant::OP_MODULE;
|
||||
break;
|
||||
case GDScriptTokenizer::Token::STAR_STAR:
|
||||
operation->operation = BinaryOpNode::OP_POWER;
|
||||
operation->variant_op = Variant::OP_POWER;
|
||||
break;
|
||||
case GDScriptTokenizer::Token::LESS_LESS:
|
||||
operation->operation = BinaryOpNode::OP_BIT_LEFT_SHIFT;
|
||||
operation->variant_op = Variant::OP_SHIFT_LEFT;
|
||||
@@ -2483,6 +2487,10 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_assignment(ExpressionNode
|
||||
assignment->operation = AssignmentNode::OP_MULTIPLICATION;
|
||||
assignment->variant_op = Variant::OP_MULTIPLY;
|
||||
break;
|
||||
case GDScriptTokenizer::Token::STAR_STAR_EQUAL:
|
||||
assignment->operation = AssignmentNode::OP_POWER;
|
||||
assignment->variant_op = Variant::OP_POWER;
|
||||
break;
|
||||
case GDScriptTokenizer::Token::SLASH_EQUAL:
|
||||
assignment->operation = AssignmentNode::OP_DIVISION;
|
||||
assignment->variant_op = Variant::OP_DIVIDE;
|
||||
@@ -3265,6 +3273,7 @@ GDScriptParser::ParseRule *GDScriptParser::get_rule(GDScriptTokenizer::Token::Ty
|
||||
{ &GDScriptParser::parse_unary_operator, &GDScriptParser::parse_binary_operator, PREC_ADDITION_SUBTRACTION }, // PLUS,
|
||||
{ &GDScriptParser::parse_unary_operator, &GDScriptParser::parse_binary_operator, PREC_ADDITION_SUBTRACTION }, // MINUS,
|
||||
{ nullptr, &GDScriptParser::parse_binary_operator, PREC_FACTOR }, // STAR,
|
||||
{ nullptr, &GDScriptParser::parse_binary_operator, PREC_FACTOR }, // STAR_STAR,
|
||||
{ nullptr, &GDScriptParser::parse_binary_operator, PREC_FACTOR }, // SLASH,
|
||||
{ nullptr, &GDScriptParser::parse_binary_operator, PREC_FACTOR }, // PERCENT,
|
||||
// Assignment
|
||||
@@ -3272,6 +3281,7 @@ GDScriptParser::ParseRule *GDScriptParser::get_rule(GDScriptTokenizer::Token::Ty
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // PLUS_EQUAL,
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // MINUS_EQUAL,
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // STAR_EQUAL,
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // STAR_STAR_EQUAL,
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // SLASH_EQUAL,
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // PERCENT_EQUAL,
|
||||
{ nullptr, &GDScriptParser::parse_assignment, PREC_ASSIGNMENT }, // LESS_LESS_EQUAL,
|
||||
@@ -3896,6 +3906,9 @@ void GDScriptParser::TreePrinter::print_assignment(AssignmentNode *p_assignment)
|
||||
case AssignmentNode::OP_MODULO:
|
||||
push_text("%");
|
||||
break;
|
||||
case AssignmentNode::OP_POWER:
|
||||
push_text("**");
|
||||
break;
|
||||
case AssignmentNode::OP_BIT_SHIFT_LEFT:
|
||||
push_text("<<");
|
||||
break;
|
||||
@@ -3944,6 +3957,9 @@ void GDScriptParser::TreePrinter::print_binary_op(BinaryOpNode *p_binary_op) {
|
||||
case BinaryOpNode::OP_MODULO:
|
||||
push_text(" % ");
|
||||
break;
|
||||
case BinaryOpNode::OP_POWER:
|
||||
push_text(" ** ");
|
||||
break;
|
||||
case BinaryOpNode::OP_BIT_LEFT_SHIFT:
|
||||
push_text(" << ");
|
||||
break;
|
||||
|
||||
@@ -360,6 +360,7 @@ public:
|
||||
OP_MULTIPLICATION,
|
||||
OP_DIVISION,
|
||||
OP_MODULO,
|
||||
OP_POWER,
|
||||
OP_BIT_SHIFT_LEFT,
|
||||
OP_BIT_SHIFT_RIGHT,
|
||||
OP_BIT_AND,
|
||||
@@ -393,6 +394,7 @@ public:
|
||||
OP_MULTIPLICATION,
|
||||
OP_DIVISION,
|
||||
OP_MODULO,
|
||||
OP_POWER,
|
||||
OP_BIT_LEFT_SHIFT,
|
||||
OP_BIT_RIGHT_SHIFT,
|
||||
OP_BIT_AND,
|
||||
|
||||
@@ -67,6 +67,7 @@ static const char *token_names[] = {
|
||||
"+", // PLUS,
|
||||
"-", // MINUS,
|
||||
"*", // STAR,
|
||||
"**", // STAR_STAR,
|
||||
"/", // SLASH,
|
||||
"%", // PERCENT,
|
||||
// Assignment
|
||||
@@ -74,6 +75,7 @@ static const char *token_names[] = {
|
||||
"+=", // PLUS_EQUAL,
|
||||
"-=", // MINUS_EQUAL,
|
||||
"*=", // STAR_EQUAL,
|
||||
"**=", // STAR_STAR_EQUAL,
|
||||
"/=", // SLASH_EQUAL,
|
||||
"%=", // PERCENT_EQUAL,
|
||||
"<<=", // LESS_LESS_EQUAL,
|
||||
@@ -1403,6 +1405,14 @@ GDScriptTokenizer::Token GDScriptTokenizer::scan() {
|
||||
if (_peek() == '=') {
|
||||
_advance();
|
||||
return make_token(Token::STAR_EQUAL);
|
||||
} else if (_peek() == '*') {
|
||||
if (_peek(1) == '=') {
|
||||
_advance();
|
||||
_advance(); // Advance both '*' and '='
|
||||
return make_token(Token::STAR_STAR_EQUAL);
|
||||
}
|
||||
_advance();
|
||||
return make_token(Token::STAR_STAR);
|
||||
} else {
|
||||
return make_token(Token::STAR);
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
PLUS,
|
||||
MINUS,
|
||||
STAR,
|
||||
STAR_STAR,
|
||||
SLASH,
|
||||
PERCENT,
|
||||
// Assignment
|
||||
@@ -85,6 +86,7 @@ public:
|
||||
PLUS_EQUAL,
|
||||
MINUS_EQUAL,
|
||||
STAR_EQUAL,
|
||||
STAR_STAR_EQUAL,
|
||||
SLASH_EQUAL,
|
||||
PERCENT_EQUAL,
|
||||
LESS_LESS_EQUAL,
|
||||
|
||||
Reference in New Issue
Block a user