Fixed order of operations

This commit is contained in:
2023-03-07 06:49:17 +11:00
parent f869c9425a
commit f84cdff883
2 changed files with 12 additions and 5 deletions

View File

@@ -341,27 +341,27 @@ static Toy_Opcode binary(Toy_Parser* parser, Toy_ASTNode** nodeHandle) {
switch(parser->previous.type) { switch(parser->previous.type) {
//arithmetic //arithmetic
case TOY_TOKEN_PLUS: { case TOY_TOKEN_PLUS: {
parsePrecedence(parser, nodeHandle, PREC_TERM); parsePrecedence(parser, nodeHandle, PREC_TERM + 1);
return TOY_OP_ADDITION; return TOY_OP_ADDITION;
} }
case TOY_TOKEN_MINUS: { case TOY_TOKEN_MINUS: {
parsePrecedence(parser, nodeHandle, PREC_TERM); parsePrecedence(parser, nodeHandle, PREC_TERM + 1);
return TOY_OP_SUBTRACTION; return TOY_OP_SUBTRACTION;
} }
case TOY_TOKEN_MULTIPLY: { case TOY_TOKEN_MULTIPLY: {
parsePrecedence(parser, nodeHandle, PREC_FACTOR); parsePrecedence(parser, nodeHandle, PREC_FACTOR + 1);
return TOY_OP_MULTIPLICATION; return TOY_OP_MULTIPLICATION;
} }
case TOY_TOKEN_DIVIDE: { case TOY_TOKEN_DIVIDE: {
parsePrecedence(parser, nodeHandle, PREC_FACTOR); parsePrecedence(parser, nodeHandle, PREC_FACTOR + 1);
return TOY_OP_DIVISION; return TOY_OP_DIVISION;
} }
case TOY_TOKEN_MODULO: { case TOY_TOKEN_MODULO: {
parsePrecedence(parser, nodeHandle, PREC_FACTOR); parsePrecedence(parser, nodeHandle, PREC_FACTOR + 1);
return TOY_OP_MODULO; return TOY_OP_MODULO;
} }

View File

@@ -38,5 +38,12 @@ s += "bar";
assert s == "foobar", "string addition failed (wasn't sticky enough)"; assert s == "foobar", "string addition failed (wasn't sticky enough)";
//check order of operations
assert 30 / 3 * 2 == 20, "Order of operations failed (raw numbers)";
var x = 30;
var y = 3;
var z = 2;
assert x / y * z == 20, "Order of operations failed (variables)";
print "All good"; print "All good";