spl2

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Mcmd/splc/main.ha | 16----------------
Aspl.bnf | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mspl/lexer/lex.ha | 5++---
Mspl/parser/parse.ha | 8+++-----
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 = { + };