diff --git a/source/toy_parser.c b/source/toy_parser.c index c195af4..92510a4 100644 --- a/source/toy_parser.c +++ b/source/toy_parser.c @@ -263,7 +263,7 @@ static Toy_AstFlag atomic(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** roo default: printError(parser, parser->previous, "Unexpected token passed to atomic precedence rule"); - Toy_private_emitAstError(bucket, root); //TODO: better error message here? + Toy_private_emitAstError(bucket, root); return TOY_AST_FLAG_NONE; } } @@ -303,7 +303,7 @@ static Toy_AstFlag unary(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** root else { printError(parser, parser->previous, "Unexpected token passed to unary precedence rule"); - Toy_private_emitAstError(bucket, root); //TODO: better error message here? + Toy_private_emitAstError(bucket, root); } return TOY_AST_FLAG_NONE; @@ -404,7 +404,7 @@ static Toy_AstFlag binary(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** roo default: printError(parser, parser->previous, "Unexpected token passed to binary precedence rule"); - Toy_private_emitAstError(bucket, root); //TODO: better error message here? + Toy_private_emitAstError(bucket, root); return TOY_AST_FLAG_NONE; } } @@ -415,12 +415,13 @@ static Toy_AstFlag group(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** root parsePrecedence(bucket, parser, root, PREC_GROUP); consume(parser, TOY_TOKEN_OPERATOR_PAREN_RIGHT, "Expected ')' at end of group"); - Toy_private_emitAstGroup(bucket, root); + //Toy_AstGroup is omitted from generation, as an optimisation + // Toy_private_emitAstGroup(bucket, root); } else { printError(parser, parser->previous, "Unexpected token passed to grouping precedence rule"); - Toy_private_emitAstError(bucket, root); //TODO: better error message here? + Toy_private_emitAstError(bucket, root); } return TOY_AST_FLAG_NONE; @@ -440,7 +441,7 @@ static void parsePrecedence(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** r if (prefix == NULL) { printError(parser, parser->previous, "Expected expression"); - Toy_private_emitAstError(bucket, root); //TODO: better error message here? + Toy_private_emitAstError(bucket, root); return; } @@ -452,7 +453,7 @@ static void parsePrecedence(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** r if (infix == NULL) { printError(parser, parser->previous, "Expected operator"); - Toy_private_emitAstError(bucket, root); //TODO: better error message here? + Toy_private_emitAstError(bucket, root); return; } @@ -537,7 +538,7 @@ static void makeBlockStmt(Toy_Bucket** bucket, Toy_Parser* parser, Toy_Ast** roo synchronize(parser); Toy_Ast* err = NULL; - Toy_private_emitAstError(bucket, &err); //TODO: better error message here? + Toy_private_emitAstError(bucket, &err); Toy_private_appendAstBlock(bucket, root, err); continue; @@ -562,8 +563,6 @@ Toy_Ast* Toy_scanParser(Toy_Bucket** bucket, Toy_Parser* parser) { return root; } - //TODO: better errors, check for unbound parser, etc. - makeBlockStmt(bucket, parser, &root); return root; diff --git a/tests/cases/test_parser.c b/tests/cases/test_parser.c index 34b9fb9..409fbbc 100644 --- a/tests/cases/test_parser.c +++ b/tests/cases/test_parser.c @@ -292,13 +292,9 @@ int test_unary(Toy_Bucket* bucket) { ast == NULL || ast->type != TOY_AST_BLOCK || ast->block.child == NULL || - ast->block.child->type != TOY_AST_UNARY || - ast->block.child->unary.child == NULL || - ast->block.child->unary.child->type != TOY_AST_GROUP || - ast->block.child->unary.child->group.child == NULL || - ast->block.child->unary.child->group.child->type != TOY_AST_VALUE || - TOY_VALUE_IS_INTEGER(ast->block.child->unary.child->group.child->value.value) == false || - TOY_VALUE_AS_INTEGER(ast->block.child->unary.child->group.child->value.value) != 42) + ast->block.child->type != TOY_AST_VALUE || + TOY_VALUE_IS_INTEGER(ast->block.child->value.value) == false || + TOY_VALUE_AS_INTEGER(ast->block.child->value.value) != -42) { fprintf(stderr, TOY_CC_ERROR "ERROR: unexpected successful unary negation in parser with grouped value -(42)\n" TOY_CC_RESET); return -1; @@ -532,34 +528,28 @@ int test_precedence(Toy_Bucket* bucket) { ast->block.child->binary.flag != TOY_AST_FLAG_MULTIPLY || ast->block.child->binary.left == NULL || - ast->block.child->binary.left->type != TOY_AST_GROUP || - ast->block.child->binary.left->group.child == NULL || - - ast->block.child->binary.left->group.child->type != TOY_AST_BINARY || - ast->block.child->binary.left->group.child->binary.flag != TOY_AST_FLAG_ADD || - ast->block.child->binary.left->group.child->binary.left == NULL || - ast->block.child->binary.left->group.child->binary.left->type != TOY_AST_VALUE || - TOY_VALUE_IS_INTEGER(ast->block.child->binary.left->group.child->binary.left->value.value) == false || - TOY_VALUE_AS_INTEGER(ast->block.child->binary.left->group.child->binary.left->value.value) != 1 || - ast->block.child->binary.left->group.child->binary.right == NULL || - ast->block.child->binary.left->group.child->binary.right->type != TOY_AST_VALUE || - TOY_VALUE_IS_INTEGER(ast->block.child->binary.left->group.child->binary.right->value.value) == false || - TOY_VALUE_AS_INTEGER(ast->block.child->binary.left->group.child->binary.right->value.value) != 2 || + ast->block.child->binary.left->type != TOY_AST_BINARY || + ast->block.child->binary.left->binary.flag != TOY_AST_FLAG_ADD || + ast->block.child->binary.left->binary.left == NULL || + ast->block.child->binary.left->binary.left->type != TOY_AST_VALUE || + TOY_VALUE_IS_INTEGER(ast->block.child->binary.left->binary.left->value.value) == false || + TOY_VALUE_AS_INTEGER(ast->block.child->binary.left->binary.left->value.value) != 1 || + ast->block.child->binary.left->binary.right == NULL || + ast->block.child->binary.left->binary.right->type != TOY_AST_VALUE || + TOY_VALUE_IS_INTEGER(ast->block.child->binary.left->binary.right->value.value) == false || + TOY_VALUE_AS_INTEGER(ast->block.child->binary.left->binary.right->value.value) != 2 || ast->block.child->binary.right == NULL || - ast->block.child->binary.right->type != TOY_AST_GROUP || - ast->block.child->binary.right->group.child == NULL || - - ast->block.child->binary.right->group.child->type != TOY_AST_BINARY || - ast->block.child->binary.right->group.child->binary.flag != TOY_AST_FLAG_ADD || - ast->block.child->binary.right->group.child->binary.left == NULL || - ast->block.child->binary.right->group.child->binary.left->type != TOY_AST_VALUE || - TOY_VALUE_IS_INTEGER(ast->block.child->binary.right->group.child->binary.left->value.value) == false || - TOY_VALUE_AS_INTEGER(ast->block.child->binary.right->group.child->binary.left->value.value) != 3 || - ast->block.child->binary.right->group.child->binary.right == NULL || - ast->block.child->binary.right->group.child->binary.right->type != TOY_AST_VALUE || - TOY_VALUE_IS_INTEGER(ast->block.child->binary.right->group.child->binary.right->value.value) == false || - TOY_VALUE_AS_INTEGER(ast->block.child->binary.right->group.child->binary.right->value.value) != 4) + ast->block.child->binary.right->type != TOY_AST_BINARY || + ast->block.child->binary.right->binary.flag != TOY_AST_FLAG_ADD || + ast->block.child->binary.right->binary.left == NULL || + ast->block.child->binary.right->binary.left->type != TOY_AST_VALUE || + TOY_VALUE_IS_INTEGER(ast->block.child->binary.right->binary.left->value.value) == false || + TOY_VALUE_AS_INTEGER(ast->block.child->binary.right->binary.left->value.value) != 3 || + ast->block.child->binary.right->binary.right == NULL || + ast->block.child->binary.right->binary.right->type != TOY_AST_VALUE || + TOY_VALUE_IS_INTEGER(ast->block.child->binary.right->binary.right->value.value) == false || + TOY_VALUE_AS_INTEGER(ast->block.child->binary.right->binary.right->value.value) != 4) { fprintf(stderr, TOY_CC_ERROR "ERROR: failed to run the parser precedence '(1 + 2) * (3 + 4)' (group)\n" TOY_CC_RESET); return -1;