feat: implementar msg de error dinamicos
This commit is contained in:
parent
db55a00ad2
commit
63d618e06f
@ -18,6 +18,27 @@ pub const TokenType = enum {
|
|||||||
Newline,
|
Newline,
|
||||||
// Each keyword will have its own token
|
// Each keyword will have its own token
|
||||||
K_Var,
|
K_Var,
|
||||||
|
|
||||||
|
pub fn to_string(self: *TokenType) []const u8 {
|
||||||
|
return switch (self.*) {
|
||||||
|
TokenType.Int => "Int",
|
||||||
|
TokenType.Float => "Float",
|
||||||
|
TokenType.Identifier => "Identifier",
|
||||||
|
TokenType.Datatype => "Datatype",
|
||||||
|
TokenType.Operator => "Operator",
|
||||||
|
TokenType.Comment => "Comment",
|
||||||
|
TokenType.String => "String",
|
||||||
|
TokenType.LeftParen => "LeftParen",
|
||||||
|
TokenType.RightParen => "RightParen",
|
||||||
|
TokenType.LeftBracket => "LeftBracket",
|
||||||
|
TokenType.RightBracket => "RightBracket",
|
||||||
|
TokenType.LeftBrace => "LeftBrace",
|
||||||
|
TokenType.RightBrace => "RightBrace",
|
||||||
|
TokenType.Comma => "Comma",
|
||||||
|
TokenType.Newline => "Newline",
|
||||||
|
TokenType.K_Var => "K_Var",
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Token = struct {
|
pub const Token = struct {
|
||||||
|
@ -47,7 +47,20 @@ pub const VariableBinding = struct {
|
|||||||
|
|
||||||
// try to parse an identifier
|
// try to parse an identifier
|
||||||
const identifier = if (utils.expect_token_type(lexic.TokenType.Identifier, &tokens.items[pos + 1])) |i| i else {
|
const identifier = if (utils.expect_token_type(lexic.TokenType.Identifier, &tokens.items[pos + 1])) |i| i else {
|
||||||
// TODO: populate error information
|
const faulty_token = &tokens.items[pos + 1];
|
||||||
|
var err = try ctx.create_and_append_error(
|
||||||
|
"Invalid variable declaration",
|
||||||
|
faulty_token.start_pos,
|
||||||
|
faulty_token.start_pos + faulty_token.value.len,
|
||||||
|
);
|
||||||
|
const token_name = faulty_token.token_type.to_string();
|
||||||
|
const error_name = try std.fmt.allocPrint(ctx.allocator, "Expected an identifier here, found a {s}", .{token_name});
|
||||||
|
try err.add_label(ctx.create_error_label_alloc(
|
||||||
|
error_name,
|
||||||
|
faulty_token.start_pos,
|
||||||
|
faulty_token.start_pos + faulty_token.value.len,
|
||||||
|
));
|
||||||
|
|
||||||
return ParseError.Error;
|
return ParseError.Error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -64,6 +64,26 @@ pub const CompilerContext = struct {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new ErrorLabel with a dynamic message.
|
||||||
|
/// Resource cleanup is automatic.
|
||||||
|
///
|
||||||
|
/// `message` **must** be allocated with the allocator
|
||||||
|
/// of this context, because on cleanup this will be
|
||||||
|
/// passed to `ctx.allocator.destroy(message)`.
|
||||||
|
pub fn create_error_label_alloc(
|
||||||
|
self: *CompilerContext,
|
||||||
|
message: []u8,
|
||||||
|
start: usize,
|
||||||
|
end: usize,
|
||||||
|
) ErrorLabel {
|
||||||
|
_ = self;
|
||||||
|
return .{
|
||||||
|
.message = .{ .dynamic = message },
|
||||||
|
.start = start,
|
||||||
|
.end = end,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *CompilerContext) void {
|
pub fn deinit(self: *CompilerContext) void {
|
||||||
for (self.errors.items) |*error_item| {
|
for (self.errors.items) |*error_item| {
|
||||||
error_item.deinit(self.allocator);
|
error_item.deinit(self.allocator);
|
||||||
|
Loading…
Reference in New Issue
Block a user