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:
parent
0fe87c5fec
commit
2b36b4f09f
3 changed files with 48 additions and 0 deletions
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue