1
0
mirror of synced 2025-02-17 18:59:21 +01:00

pattern: Fixed precedence of comparison operators

This commit is contained in:
WerWolv 2022-02-07 21:37:10 +01:00
parent 94506848e0
commit 137bfe48ca
2 changed files with 44 additions and 42 deletions

View File

@ -79,14 +79,14 @@ namespace hex::pl {
ASTNode *parseMultiplicativeExpression();
ASTNode *parseAdditiveExpression();
ASTNode *parseShiftExpression();
ASTNode *parseRelationExpression();
ASTNode *parseEqualityExpression();
ASTNode *parseBinaryAndExpression();
ASTNode *parseBinaryXorExpression();
ASTNode *parseBinaryOrExpression();
ASTNode *parseBooleanAnd();
ASTNode *parseBooleanXor();
ASTNode *parseBooleanOr();
ASTNode *parseRelationExpression();
ASTNode *parseEqualityExpression();
ASTNode *parseTernaryConditional();
ASTNode *parseMathematicalExpression();
@ -149,7 +149,9 @@ namespace hex::pl {
/* Token consuming */
enum class Setting { };
enum class Setting
{
};
constexpr static auto Normal = static_cast<Setting>(0);
constexpr static auto Not = static_cast<Setting>(1);

View File

@ -250,46 +250,14 @@ namespace hex::pl {
return node;
}
// (parseAdditiveExpression) < >=|<=|>|< > (parseAdditiveExpression)
ASTNode *Parser::parseRelationExpression() {
// (parseShiftExpression) & (parseShiftExpression)
ASTNode *Parser::parseBinaryAndExpression() {
auto node = this->parseShiftExpression();
auto nodeCleanup = SCOPE_GUARD { delete node; };
while (MATCHES(sequence(OPERATOR_BOOLGREATERTHAN) || sequence(OPERATOR_BOOLLESSTHAN) || sequence(OPERATOR_BOOLGREATERTHANOREQUALS) || sequence(OPERATOR_BOOLLESSTHANOREQUALS))) {
auto op = getValue<Token::Operator>(-1);
node = create(new ASTNodeMathematicalExpression(node, this->parseShiftExpression(), op));
}
nodeCleanup.release();
return node;
}
// (parseRelationExpression) <==|!=> (parseRelationExpression)
ASTNode *Parser::parseEqualityExpression() {
auto node = this->parseRelationExpression();
auto nodeCleanup = SCOPE_GUARD { delete node; };
while (MATCHES(sequence(OPERATOR_BOOLEQUALS) || sequence(OPERATOR_BOOLNOTEQUALS))) {
auto op = getValue<Token::Operator>(-1);
node = create(new ASTNodeMathematicalExpression(node, this->parseRelationExpression(), op));
}
nodeCleanup.release();
return node;
}
// (parseEqualityExpression) & (parseEqualityExpression)
ASTNode *Parser::parseBinaryAndExpression() {
auto node = this->parseEqualityExpression();
auto nodeCleanup = SCOPE_GUARD { delete node; };
while (MATCHES(sequence(OPERATOR_BITAND))) {
node = create(new ASTNodeMathematicalExpression(node, this->parseEqualityExpression(), Token::Operator::BitAnd));
node = create(new ASTNodeMathematicalExpression(node, this->parseShiftExpression(), Token::Operator::BitAnd));
}
nodeCleanup.release();
@ -372,19 +340,51 @@ namespace hex::pl {
return node;
}
// (parseBooleanOr) ? (parseBooleanOr) : (parseBooleanOr)
ASTNode *Parser::parseTernaryConditional() {
// (parseBooleanOr) < >=|<=|>|< > (parseBooleanOr)
ASTNode *Parser::parseRelationExpression() {
auto node = this->parseBooleanOr();
auto nodeCleanup = SCOPE_GUARD { delete node; };
while (MATCHES(sequence(OPERATOR_BOOLGREATERTHAN) || sequence(OPERATOR_BOOLLESSTHAN) || sequence(OPERATOR_BOOLGREATERTHANOREQUALS) || sequence(OPERATOR_BOOLLESSTHANOREQUALS))) {
auto op = getValue<Token::Operator>(-1);
node = create(new ASTNodeMathematicalExpression(node, this->parseBooleanOr(), op));
}
nodeCleanup.release();
return node;
}
// (parseRelationExpression) <==|!=> (parseRelationExpression)
ASTNode *Parser::parseEqualityExpression() {
auto node = this->parseRelationExpression();
auto nodeCleanup = SCOPE_GUARD { delete node; };
while (MATCHES(sequence(OPERATOR_BOOLEQUALS) || sequence(OPERATOR_BOOLNOTEQUALS))) {
auto op = getValue<Token::Operator>(-1);
node = create(new ASTNodeMathematicalExpression(node, this->parseRelationExpression(), op));
}
nodeCleanup.release();
return node;
}
// (parseEqualityExpression) ? (parseEqualityExpression) : (parseEqualityExpression)
ASTNode *Parser::parseTernaryConditional() {
auto node = this->parseEqualityExpression();
auto nodeCleanup = SCOPE_GUARD { delete node; };
while (MATCHES(sequence(OPERATOR_TERNARYCONDITIONAL))) {
auto second = this->parseBooleanOr();
auto second = this->parseEqualityExpression();
if (!MATCHES(sequence(OPERATOR_INHERIT)))
throwParserError("expected ':' in ternary expression");
auto third = this->parseBooleanOr();
auto third = this->parseEqualityExpression();
node = create(new ASTNodeTernaryExpression(node, second, third, Token::Operator::TernaryConditional));
}