refactor: return null on expression unmatch

This commit is contained in:
Fernando Araoz 2025-01-27 19:34:24 -05:00
parent b1ada55ff2
commit 1a3bdc7592
2 changed files with 16 additions and 13 deletions

View File

@ -11,12 +11,12 @@ pub const Expression = union(enum) {
/// Attempts to parse an expression from a token stream. /// Attempts to parse an expression from a token stream.
/// ///
/// Receives a pointer to the memory for initialization /// Receives a pointer to the memory for initialization
pub fn init(self: *@This(), tokens: *const std.ArrayList(Token), pos: usize) error{Unmatched}!void { pub fn init(self: *@This(), tokens: *const std.ArrayList(Token), pos: usize) ?void {
std.debug.assert(pos < tokens.items.len); std.debug.assert(pos < tokens.items.len);
const t = tokens.items[pos]; const t = tokens.items[pos];
if (t.token_type != TokenType.Int) { if (t.token_type != TokenType.Int) {
return error.Unmatched; return null;
} }
self.* = .{ self.* = .{
@ -33,9 +33,12 @@ test "should parse expression" {
defer tokens.deinit(); defer tokens.deinit();
var expr: Expression = undefined; var expr: Expression = undefined;
try expr.init(&tokens, 0); if (expr.init(&tokens, 0)) |_| {
try std.testing.expectEqualDeep("322", expr.number.value); try std.testing.expectEqualDeep("322", expr.number.value);
try std.testing.expectEqualDeep(TokenType.Int, expr.number.token_type); try std.testing.expectEqualDeep(TokenType.Int, expr.number.token_type);
return;
}
try std.testing.expect(false);
} }
test "should fail on non expression" { test "should fail on non expression" {
@ -46,11 +49,10 @@ test "should fail on non expression" {
defer tokens.deinit(); defer tokens.deinit();
var expr: Expression = undefined; var expr: Expression = undefined;
expr.init(&tokens, 0) catch |err| { if (expr.init(&tokens, 0)) |_| {
try std.testing.expectEqual(ParseError.Unmatched, err); std.debug.print("v: {s}", .{expr.number.value});
return; try std.testing.expect(false);
}; }
std.debug.print("v: {s}", .{expr.number.value}); return;
try std.testing.expect(false);
} }

View File

@ -48,9 +48,10 @@ pub const VariableBinding = struct {
return ParseError.OutOfMemory; return ParseError.OutOfMemory;
}; };
errdefer allocator.destroy(exp); errdefer allocator.destroy(exp);
exp.init(tokens, pos + 3) catch { const res = exp.init(tokens, pos + 3);
if (res == null) {
return ParseError.Error; return ParseError.Error;
}; }
// return // return
target.* = .{ target.* = .{