1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:37:35 +00:00

LibCpp: Parse Bitwise & Logical Or & And operators

This commit is contained in:
Itamar 2021-04-02 10:28:17 +03:00 committed by Andreas Kling
parent 8962581c9c
commit 575d6a8ee1
3 changed files with 27 additions and 2 deletions

View file

@ -209,6 +209,12 @@ void BinaryExpression::dump(size_t indent) const
case BinaryOp::NotEqual: case BinaryOp::NotEqual:
op_string = "!="; op_string = "!=";
break; break;
case BinaryOp::LogicalOr:
op_string = "||";
break;
case BinaryOp::LogicalAnd:
op_string = "&&";
break;
} }
m_lhs->dump(indent + 1); m_lhs->dump(indent + 1);
@ -319,6 +325,9 @@ void UnaryExpression::dump(size_t indent) const
case UnaryOp::PlusPlus: case UnaryOp::PlusPlus:
op_string = "++"; op_string = "++";
break; break;
case UnaryOp::Address:
op_string = "&";
break;
default: default:
op_string = "<invalid>"; op_string = "<invalid>";
} }

View file

@ -420,6 +420,8 @@ enum class BinaryOp {
RightShift, RightShift,
EqualsEquals, EqualsEquals,
NotEqual, NotEqual,
LogicalOr,
LogicalAnd,
}; };
class BinaryExpression : public Expression { class BinaryExpression : public Expression {
@ -582,6 +584,7 @@ enum class UnaryOp {
Plus, Plus,
Minus, Minus,
PlusPlus, PlusPlus,
Address,
}; };
class UnaryExpression : public Expression { class UnaryExpression : public Expression {

View file

@ -421,7 +421,8 @@ bool Parser::match_secondary_expression()
|| type == Token::Type::EqualsEquals || type == Token::Type::EqualsEquals
|| type == Token::Type::AndAnd || type == Token::Type::AndAnd
|| type == Token::Type::PipePipe || type == Token::Type::PipePipe
|| type == Token::Type::ExclamationMarkEquals; || type == Token::Type::ExclamationMarkEquals
|| type == Token::Type::PipePipe;
} }
NonnullRefPtr<Expression> Parser::parse_primary_expression(ASTNode& parent) NonnullRefPtr<Expression> Parser::parse_primary_expression(ASTNode& parent)
@ -481,7 +482,8 @@ bool Parser::match_unary_expression()
|| type == Token::Type::ExclamationMark || type == Token::Type::ExclamationMark
|| type == Token::Type::Tilde || type == Token::Type::Tilde
|| type == Token::Type::Plus || type == Token::Type::Plus
|| type == Token::Type::Minus; || type == Token::Type::Minus
|| type == Token::Type::And;
} }
NonnullRefPtr<UnaryExpression> Parser::parse_unary_expression(ASTNode& parent) NonnullRefPtr<UnaryExpression> Parser::parse_unary_expression(ASTNode& parent)
@ -505,6 +507,9 @@ NonnullRefPtr<UnaryExpression> Parser::parse_unary_expression(ASTNode& parent)
case Token::Type::PlusPlus: case Token::Type::PlusPlus:
op = UnaryOp::PlusPlus; op = UnaryOp::PlusPlus;
break; break;
case Token::Type::And:
op = UnaryOp::Address;
break;
default: default:
break; break;
} }
@ -555,6 +560,14 @@ NonnullRefPtr<Expression> Parser::parse_secondary_expression(ASTNode& parent, No
return parse_binary_expression(parent, lhs, BinaryOp::EqualsEquals); return parse_binary_expression(parent, lhs, BinaryOp::EqualsEquals);
case Token::Type::ExclamationMarkEquals: case Token::Type::ExclamationMarkEquals:
return parse_binary_expression(parent, lhs, BinaryOp::NotEqual); return parse_binary_expression(parent, lhs, BinaryOp::NotEqual);
case Token::Type::And:
return parse_binary_expression(parent, lhs, BinaryOp::BitwiseAnd);
case Token::Type::AndAnd:
return parse_binary_expression(parent, lhs, BinaryOp::LogicalAnd);
case Token::Type::Pipe:
return parse_binary_expression(parent, lhs, BinaryOp::BitwiseOr);
case Token::Type::PipePipe:
return parse_binary_expression(parent, lhs, BinaryOp::LogicalOr);
case Token::Type::Equals: case Token::Type::Equals:
return parse_assignment_expression(parent, lhs, AssignmentOp::Assignment); return parse_assignment_expression(parent, lhs, AssignmentOp::Assignment);
case Token::Type::Dot: { case Token::Type::Dot: {