1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:38:10 +00:00

LibJS: Implement +=, -=, *=, and /= assignment operators

This commit is contained in:
Conrad Pankoff 2020-03-12 23:09:15 +11:00 committed by Andreas Kling
parent 0fe87c5fec
commit 2b36b4f09f
3 changed files with 48 additions and 0 deletions

View file

@ -383,6 +383,22 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const
case AssignmentOp::Assign: case AssignmentOp::Assign:
interpreter.set_variable(name, rhs_result); interpreter.set_variable(name, rhs_result);
break; break;
case AssignmentOp::PlusEquals:
rhs_result = add(m_lhs->execute(interpreter), rhs_result);
interpreter.set_variable(name, rhs_result);
break;
case AssignmentOp::MinusEquals:
rhs_result = sub(m_lhs->execute(interpreter), rhs_result);
interpreter.set_variable(name, rhs_result);
break;
case AssignmentOp::AsteriskEquals:
rhs_result = mul(m_lhs->execute(interpreter), rhs_result);
interpreter.set_variable(name, rhs_result);
break;
case AssignmentOp::SlashEquals:
rhs_result = div(m_lhs->execute(interpreter), rhs_result);
interpreter.set_variable(name, rhs_result);
break;
} }
return rhs_result; return rhs_result;
} }
@ -394,6 +410,18 @@ void AssignmentExpression::dump(int indent) const
case AssignmentOp::Assign: case AssignmentOp::Assign:
op_string = "="; op_string = "=";
break; break;
case AssignmentOp::PlusEquals:
op_string = "+=";
break;
case AssignmentOp::MinusEquals:
op_string = "-=";
break;
case AssignmentOp::AsteriskEquals:
op_string = "*=";
break;
case AssignmentOp::SlashEquals:
op_string = "/=";
break;
} }
ASTNode::dump(indent); ASTNode::dump(indent);

View file

@ -391,6 +391,10 @@ private:
enum class AssignmentOp { enum class AssignmentOp {
Assign, Assign,
PlusEquals,
MinusEquals,
AsteriskEquals,
SlashEquals,
}; };
class AssignmentExpression : public Expression { class AssignmentExpression : public Expression {

View file

@ -124,15 +124,27 @@ NonnullOwnPtr<Expression> Parser::parse_secondary_expression(NonnullOwnPtr<Expre
case TokenType::Plus: case TokenType::Plus:
consume(); consume();
return make<BinaryExpression>(BinaryOp::Plus, move(lhs), parse_expression()); return make<BinaryExpression>(BinaryOp::Plus, move(lhs), parse_expression());
case TokenType::PlusEquals:
consume();
return make<AssignmentExpression>(AssignmentOp::PlusEquals, move(lhs), parse_expression());
case TokenType::Minus: case TokenType::Minus:
consume(); consume();
return make<BinaryExpression>(BinaryOp::Minus, move(lhs), parse_expression()); return make<BinaryExpression>(BinaryOp::Minus, move(lhs), parse_expression());
case TokenType::MinusEquals:
consume();
return make<AssignmentExpression>(AssignmentOp::MinusEquals, move(lhs), parse_expression());
case TokenType::Asterisk: case TokenType::Asterisk:
consume(); consume();
return make<BinaryExpression>(BinaryOp::Asterisk, move(lhs), parse_expression()); return make<BinaryExpression>(BinaryOp::Asterisk, move(lhs), parse_expression());
case TokenType::AsteriskEquals:
consume();
return make<AssignmentExpression>(AssignmentOp::AsteriskEquals, move(lhs), parse_expression());
case TokenType::Slash: case TokenType::Slash:
consume(); consume();
return make<BinaryExpression>(BinaryOp::Slash, move(lhs), parse_expression()); return make<BinaryExpression>(BinaryOp::Slash, move(lhs), parse_expression());
case TokenType::SlashEquals:
consume();
return make<AssignmentExpression>(AssignmentOp::SlashEquals, move(lhs), parse_expression());
case TokenType::GreaterThanEquals: case TokenType::GreaterThanEquals:
consume(); consume();
return make<BinaryExpression>(BinaryOp::GreaterThanEquals, move(lhs), parse_expression()); return make<BinaryExpression>(BinaryOp::GreaterThanEquals, move(lhs), parse_expression());
@ -250,9 +262,13 @@ bool Parser::match_secondary_expression() const
{ {
auto type = m_current_token.type(); auto type = m_current_token.type();
return type == TokenType::Plus return type == TokenType::Plus
|| type == TokenType::PlusEquals
|| type == TokenType::Minus || type == TokenType::Minus
|| type == TokenType::MinusEquals
|| type == TokenType::Asterisk || type == TokenType::Asterisk
|| type == TokenType::AsteriskEquals
|| type == TokenType::Slash || type == TokenType::Slash
|| type == TokenType::SlashEquals
|| type == TokenType::Equals || type == TokenType::Equals
|| type == TokenType::GreaterThanEquals || type == TokenType::GreaterThanEquals
|| type == TokenType::LessThanEquals || type == TokenType::LessThanEquals