From 0a286901b4b91a61401cd9db3bf21353e9608725 Mon Sep 17 00:00:00 2001 From: Nic Gaffney Date: Fri, 30 Jan 2026 21:11:06 -0600 Subject: begin on parser --- examples/basics.gn | 0 examples/test.gn | 21 ++++++++++------ examples/usage.gn | 8 ++++++ src/lexer.zig | 1 - src/main.zig | 3 +++ src/parser.zig | 58 ++++++++++++++++++++++++++++++++++++++++++++ src/tokenizer.zig | 71 +++++++++++------------------------------------------- 7 files changed, 96 insertions(+), 66 deletions(-) create mode 100644 examples/basics.gn create mode 100644 examples/usage.gn delete mode 100644 src/lexer.zig create mode 100644 src/parser.zig diff --git a/examples/basics.gn b/examples/basics.gn new file mode 100644 index 0000000..e69de29 diff --git a/examples/test.gn b/examples/test.gn index 99e7ef6..5147097 100644 --- a/examples/test.gn +++ b/examples/test.gn @@ -1,11 +1,16 @@ -!use defaults -> io -> println. -!use defaults -> effects. -!use defaults -> math -> +. -!use builtin -> block. -!use builtin -> return. +?? Comments begin with a ? +!insert "usage.gn". +!insert "math.gn". + !entrypoint <- main. + +?? Type definitions begin with the name wrapped in () +(add <- Int <- Int) -> Int. +add a b -> a + b. + (main) -> Int ? (effects -> IO). +?? Function definitions begin with the name and have an -> main -> match (x <- println "Hello World") ( - (x >= 0) -> 0, - (x < 0)-> 1, -) + (x >= 0) -> x, + (x < 0)-> add x 10, +). diff --git a/examples/usage.gn b/examples/usage.gn new file mode 100644 index 0000000..0f8ffc3 --- /dev/null +++ b/examples/usage.gn @@ -0,0 +1,8 @@ +!use builtin -> types -> Int. +!use builtin -> operators -> +. +!use builtin -> operators -> >=. +!use builtin -> operators -> <. +!use builtin -> match. + +!use defaults -> io -> println. +!use defaults -> effects. diff --git a/src/lexer.zig b/src/lexer.zig deleted file mode 100644 index 95a0b68..0000000 --- a/src/lexer.zig +++ /dev/null @@ -1 +0,0 @@ -const std = @import("std"); diff --git a/src/main.zig b/src/main.zig index 6095e81..91ce155 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,5 +1,6 @@ const std = @import("std"); const tok = @import("tokenizer.zig"); +const pars = @import("parser.zig"); pub fn main() !void { const inneralloc = std.heap.smp_allocator; @@ -37,4 +38,6 @@ pub fn main() !void { for (tokens) |t| try stdout.print("{s}\n", .{ try t.print(alloc) }); try stdout.flush(); + + pars.parse(tokens); } diff --git a/src/parser.zig b/src/parser.zig new file mode 100644 index 0000000..4252e3b --- /dev/null +++ b/src/parser.zig @@ -0,0 +1,58 @@ +const std = @import("std"); +const tok = @import("tokenizer.zig"); +const Token = tok.Token; + +const typ = union { + Funct: struct { + inputtyp: []*typ, + bodytyp: *typ, + rettyp: *typ, + }, + Type: union { + Int: u32, + Float: f32, + Bool: bool, + String: []const u8, + }, +}; + +var typmap: std.AutoHashMap([]const u8, typ) = undefined; + +var index: u32 = 0; +pub fn parse(allocator: std.mem.Allocator, toks: []Token) void { + typmap = std.AutoHashMap([]const u8, typ).init(allocator); + + parser: switch (toks[0]) { + .LPAREN => break :parser typedef(toks), + .BUILTIN => |b| break :parser builtin(toks, b), + .FUNC => |f| break :parser funcdef(toks, f), + } +} + +fn typedef(allocator: std.mem.Allocator, toks: []Token) !Token { + index += 1; + const name = toks[index]; + var inputTyp: typ = undefined; + switch (name) { + .FUNC => { + var inputArr = std.ArrayList(typ){}; + while (toks[index] != .RPAREN) : (index += 1) { + if (toks[index] != .LARROW) return error{UnexpectedToken}; + index += 1; + inputArr.append(allocator, toks[index]); + // fix this please + + + } + }, + } + + while (toks[index] != .PERIOD) : (index += 1) { + switch (toks[index]) { + + } + } + return toks[index]; +} +fn builtin(toks: []Token, fun: []const u8) Token { _=fun; _=toks; } +fn funcdef(toks: []Token, fun: []const u8) Token { _=fun; _=toks; } diff --git a/src/tokenizer.zig b/src/tokenizer.zig index dc700c8..91cae39 100644 --- a/src/tokenizer.zig +++ b/src/tokenizer.zig @@ -3,7 +3,6 @@ const std = @import("std"); pub const Token_enum = enum { RARROW, // -> LARROW, // <- - BACKTICK, // ` PERIOD, // . COMMA, // , QMARK, // ? @@ -19,7 +18,6 @@ pub const Token_enum = enum { pub const Token = union(Token_enum) { RARROW, // -> LARROW, // <- - BACKTICK, // ` PERIOD, // . COMMA, // , QMARK, // ? @@ -35,7 +33,6 @@ pub const Token = union(Token_enum) { return switch (self) { .RARROW => "->", .LARROW => "<-", - .BACKTICK => "`", .PERIOD => ".", .COMMA => ",", .QMARK => "?", @@ -92,16 +89,17 @@ pub fn Iterator(comptime typ: type) type { pub fn consumeuntil(self: *SelfType, alloc: std.mem.Allocator, delims: []const typ) !?[]typ { var arr = try std.ArrayList(typ).initCapacity(alloc, 128); - while (self.peek()) |item| { + out: while (self.peek()) |item| { for (delims) |d| - if (std.meta.eql(item, d)) break; + if (std.meta.eql(item, d)) break :out; self.skip(); try arr.append(alloc, item); } return try arr.toOwnedSlice(alloc); } - pub fn consumeuntilescape(self: *SelfType, alloc: std.mem.Allocator, delims: []const typ, escape: typ) !?[]typ { var arr = try std.ArrayList(typ).initCapacity(alloc, 128); + pub fn consumeuntilescape(self: *SelfType, alloc: std.mem.Allocator, delims: []const typ, escape: typ) !?[]typ { + var arr = try std.ArrayList(typ).initCapacity(alloc, 128); var previous: typ = undefined; while (self.peek()) |item| { for (delims) |d| @@ -152,16 +150,22 @@ pub fn tokenize(allocator: std.mem.Allocator, input: []const u8) ![]Token { }; while (src.peek()) |char| { + std.debug.print("{}\n", .{char}); switch (char) { - '`' => { + ',' => { src.skip(); try internals.clearbuff(allocator, &toks, &buff); - try toks.append(allocator, .BACKTICK); + try toks.append(allocator, .COMMA); }, - ',' => { + '?' => { src.skip(); + if (src.peek().? != '?') { + try toks.append(allocator, .QMARK); + continue; + } try internals.clearbuff(allocator, &toks, &buff); - try toks.append(allocator, .COMMA); + const comment = try src.consumeuntil(allocator, "\n\r"); + allocator.free(comment.?); }, '.' => { src.skip(); @@ -241,50 +245,3 @@ pub fn tokenize(allocator: std.mem.Allocator, input: []const u8) ![]Token { } return toks.toOwnedSlice(allocator); } - -// pub fn tokenize(allocator: std.mem.Allocator, input: []const u8) ![]Token { -// var arr = try std.ArrayList(Token).initCapacity(allocator, 1024); -// defer arr.deinit(allocator); -// var iterator = Iterator(u8).init(input); -// return parse: switch (iterator.next().?) { -// '-' => { -// if (iterator.maybe('>')) |_| try arr.append(allocator, .RARROW); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '<' => { -// if (iterator.maybe('-')) |_| try arr.append(allocator, .LARROW); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '.' => { -// try arr.append(allocator, .PERIOD); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// ',' => { -// try arr.append(allocator, .COMMA); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '`' => { -// try arr.append(allocator, .QMARK); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '?' => { -// try arr.append(allocator, .QMARK); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '!' => { -// const name = try iterator.consumeuntil(allocator, &std.ascii.whitespace); -// try arr.append(allocator, Token{.BUILTIN = name.?}); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '"' => { -// const name = try iterator.consumeuntilescape(allocator, "\"", '\\'); -// try arr.append(allocator, Token{.STRING = name.?}); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// 'A'...'Z' => { -// const name = try iterator.consumeuntil(allocator, &std.ascii.whitespace); -// try arr.append(allocator, Token{.TYP = name.?}); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// '0'...'9' => { -// const name = try iterator.consumewhile(allocator, "0123456789"); -// try arr.append(allocator, Token{.FUNC = name.?}); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// else => { -// const name = try iterator.consumeuntil(allocator, @constCast(&std.ascii.whitespace)); -// try arr.append(allocator, Token{.FUNC = name.?}); -// if (iterator.peek()) |pk| continue :parse pk else break :parse arr.items; }, -// }; - -// } -- cgit v1.2.3