summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/basics.gn0
-rw-r--r--examples/test.gn21
-rw-r--r--examples/usage.gn8
-rw-r--r--src/lexer.zig1
-rw-r--r--src/main.zig3
-rw-r--r--src/parser.zig58
-rw-r--r--src/tokenizer.zig71
7 files changed, 96 insertions, 66 deletions
diff --git a/examples/basics.gn b/examples/basics.gn
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/examples/basics.gn
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; },
-// };
-
-// }