commit 42383fb6a68c2273b33e14b9326390da9952bdec
parent c129685e6943de9df39a1a400535c8aa5d809368
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Fri, 16 Jan 2026 17:53:13 +0000
added a bnf notation to the program
Diffstat:
4 files changed, 68 insertions(+), 24 deletions(-)
diff --git a/cmd/splc/main.ha b/cmd/splc/main.ha
@@ -9,22 +9,6 @@ export fn main() void = {
let l = &lexer::lexer{in = strings::toutf8(in), pos = 0, prev = []};
defer lexer::finish(l);
- let ts: []lexer::token = [];
- defer free(ts);
- for (true) {
- let t = match (lexer::next(l)) {
- case let t: lexer::token => yield t;
- case let e: lexer::unknowntoken =>
- fmt::println(lexer::strerror(e, l))!;
- continue;
- };
- if (t.ty == lexer::ttype::EOF) break;
-
- append(ts, t)!;
- };
-
- for (let t .. ts)
- fmt::println("token:", strings::fromutf8(l.in[t.data.0 .. t.data.1])!)!;
};
diff --git a/spl.bnf b/spl.bnf
@@ -0,0 +1,63 @@
+prog := prog node
+ | node
+
+node := fdec
+ | assign
+ | ...imports...
+
+assign := name type '=' value
+ | name type
+
+reassign:= name '=' value
+
+fdec := "func" name '(' assigns ')' type '=' '{' body '}'
+ | "func" name '(' assigns ')' type
+ | "symbol" NAME '(' assigns ')' type
+
+
+assigns := assigns assign
+ | assign
+
+type := name
+ | '*' type
+ | '[' ']' type
+ | '[' value ']' type
+ | func '(' types ')'
+
+types := types ',' type
+ | type
+
+value := name
+ | name '[' value ']'
+ | value ':' type
+ | fcall
+ | lit
+ | expr
+
+values := values ',' value | value
+
+fcall := name '(' values ')'
+
+expr := value '+' value
+ | value '-' value
+ | value '*' value
+ | value '/' value
+ | value '%' value
+ | '&' value
+ | '*' value
+
+lit := name
+ | int
+ | float
+ | str
+
+name := NAME
+ | name::NAME
+
+body := body block ';'
+ | block ';'
+
+block := assign
+ | fcall
+ | reassign
+ | fdec
diff --git a/spl/lexer/lex.ha b/spl/lexer/lex.ha
@@ -154,11 +154,10 @@ export fn next(l: *lexer) (token | error) = {
case => yield;
};
- if (ascii::isalpha(l.in[l.pos]: rune))
+ if (ascii::isalpha(l.in[l.pos]: rune))
return token{ty = ttype::NAME, data = readblock(l, &isname)}
- else if (isnumber(l.in[l.pos]: rune)) {
+ else if (isnumber(l.in[l.pos]: rune))
return token{ty = ttype::NUMBER, data = readblock(l, &isnumber)};
- };
defer l.pos += 1;
return (l.pos, l.pos + 1): unknowntoken;
diff --git a/spl/parser/parse.ha b/spl/parser/parse.ha
@@ -1,4 +1,4 @@
-use spl::lexer;
+use spl::lexer::*;
export type unexpectedeof = !void;
export type unexpectedtoken = !void;
@@ -48,8 +48,6 @@ export type expr = (*(fcall | binop | expr), ty);
// functions as left hand side expression
export type node = (reassign | assign | fcall | fdec);
-fn get(ts: []lexer::token, pos: *size) token = {
- if (ts[pos].ty == lexer::ttype::EOF) fmt::fatal("unexpected EOF");
- defer pos += 1;
- return ts[pos];
+export fn parse(l: *lexer) node = {
+
};