@@ -2880,6 +2880,24 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_unary_operator(ExpressionN
28802880 push_error (R"( Expected expression after "+" operator.)" );
28812881 }
28822882 break ;
2883+ case GDScriptTokenizer::Token::MINUS_MINUS:
2884+ // Prefix -- operator
2885+ operation->operation = UnaryOpNode::OP_DECREMENT;
2886+ operation->variant_op = Variant::OP_DECREMENT;
2887+ operation->operand = parse_precedence (PREC_SIGN, false );
2888+ if (operation->operand == nullptr ) {
2889+ push_error (R"( Expected expression after prefix "--" operator.)" );
2890+ }
2891+ break ;
2892+ case GDScriptTokenizer::Token::PLUS_PLUS:
2893+ // Prefix ++ operator
2894+ operation->operation = UnaryOpNode::OP_INCREMENT;
2895+ operation->variant_op = Variant::OP_INCREMENT;
2896+ operation->operand = parse_precedence (PREC_SIGN, false );
2897+ if (operation->operand == nullptr ) {
2898+ push_error (R"( Expected expression after prefix "++" operator.)" );
2899+ }
2900+ break ;
28832901 case GDScriptTokenizer::Token::TILDE:
28842902 operation->operation = UnaryOpNode::OP_COMPLEMENT;
28852903 operation->variant_op = Variant::OP_BIT_NEGATE;
@@ -3766,6 +3784,32 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_invalid_token(ExpressionNo
37663784 return p_previous_operand;
37673785}
37683786
3787+ GDScriptParser::ExpressionNode *GDScriptParser::parse_increment_decrement (ExpressionNode *p_previous_operand, bool p_can_assign) {
3788+ GDScriptTokenizer::Token::Type op_type = previous.type ;
3789+ UnaryOpNode *operation = alloc_node<UnaryOpNode>();
3790+ reset_extents (operation, p_previous_operand);
3791+ update_extents (operation);
3792+
3793+ operation->operand = p_previous_operand;
3794+
3795+ switch (op_type) {
3796+ case GDScriptTokenizer::Token::MINUS_MINUS:
3797+ operation->operation = UnaryOpNode::OP_POST_DECREMENT;
3798+ operation->variant_op = Variant::OP_POST_DECREMENT;
3799+ break ;
3800+ case GDScriptTokenizer::Token::PLUS_PLUS:
3801+ operation->operation = UnaryOpNode::OP_POST_INCREMENT;
3802+ operation->variant_op = Variant::OP_POST_INCREMENT;
3803+ break ;
3804+ default :
3805+ complete_extents (operation);
3806+ return nullptr ; // Unreachable.
3807+ }
3808+ complete_extents (operation);
3809+
3810+ return operation;
3811+ }
3812+
37693813GDScriptParser::TypeNode *GDScriptParser::parse_type (bool p_allow_void) {
37703814 TypeNode *type = alloc_node<TypeNode>();
37713815 make_completion_context (p_allow_void ? COMPLETION_TYPE_NAME_OR_VOID : COMPLETION_TYPE_NAME, type);
@@ -4164,7 +4208,9 @@ GDScriptParser::ParseRule *GDScriptParser::get_rule(GDScriptTokenizer::Token::Ty
41644208 { nullptr , &GDScriptParser::parse_binary_operator, PREC_BIT_SHIFT }, // GREATER_GREATER,
41654209 // Math
41664210 { &GDScriptParser::parse_unary_operator, &GDScriptParser::parse_binary_operator, PREC_ADDITION_SUBTRACTION }, // PLUS,
4211+ { &GDScriptParser::parse_unary_operator, &GDScriptParser::parse_increment_decrement, PREC_ADDITION_SUBTRACTION }, // PLUS_PLUS,
41674212 { &GDScriptParser::parse_unary_operator, &GDScriptParser::parse_binary_operator, PREC_ADDITION_SUBTRACTION }, // MINUS,
4213+ { &GDScriptParser::parse_unary_operator, &GDScriptParser::parse_increment_decrement, PREC_ADDITION_SUBTRACTION }, // MINUS_MINUS,
41684214 { nullptr , &GDScriptParser::parse_binary_operator, PREC_FACTOR }, // STAR,
41694215 { nullptr , &GDScriptParser::parse_binary_operator, PREC_POWER }, // STAR_STAR,
41704216 { nullptr , &GDScriptParser::parse_binary_operator, PREC_FACTOR }, // SLASH,
@@ -6318,8 +6364,27 @@ void GDScriptParser::TreePrinter::print_unary_op(UnaryOpNode *p_unary_op) {
63186364 case UnaryOpNode::OP_COMPLEMENT:
63196365 push_text (" ~" );
63206366 break ;
6367+ case UnaryOpNode::OP_INCREMENT:
6368+ push_text (" ++" );
6369+ break ;
6370+ case UnaryOpNode::OP_DECREMENT:
6371+ push_text (" --" );
6372+ break ;
6373+ default :
6374+ break ;
63216375 }
63226376 print_expression (p_unary_op->operand );
6377+
6378+ switch (p_unary_op->operation ) {
6379+ case UnaryOpNode::OP_POST_DECREMENT:
6380+ push_text (" --" );
6381+ break ;
6382+ case UnaryOpNode::OP_POST_INCREMENT:
6383+ push_text (" ++" );
6384+ break ;
6385+ default :
6386+ break ;
6387+ }
63236388 // Surround in parenthesis for disambiguation.
63246389 push_text (" )" );
63256390}
0 commit comments