zpy

A lisp like language written in hare
Log | Files | Refs

commit 2aa6b92667ea64a185d8db290ebc9470adb99374
parent b00e7b8c3656c23cc616f8c9c33fc2a11bb68f07
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Sun, 10 May 2026 12:10:46 +0100

crying at bug

Diffstat:
Mzpy/parse/help.ha | 8+++++---
Mzpy/parse/parse.ha | 31+++++++++++++++++++++++--------
2 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/zpy/parse/help.ha b/zpy/parse/help.ha @@ -3,12 +3,14 @@ use fmt; fn want(l: *lex::lexer, want: []lex::types) (lex::token | lex::error | error) = { let n = lex::next(l)?; - fmt::print("\n", lex::strtypes(n.ty))!; + + //fmt::println(lex::strtypes(n.ty))!; + //printrest(l); for (let ty .. want) { - fmt::print(lex::strtypes(ty))!; - if (n.ty == ty) + if (n.ty == ty) { return n; + }; }; return ("Want failed", 0): error; }; diff --git a/zpy/parse/parse.ha b/zpy/parse/parse.ha @@ -2,24 +2,38 @@ use zpy::lex; use io; use strconv; use fmt; +use bufio; export type parserfn = fn(_: *lex::lexer) (node | error); export fn try(l: *lex::lexer, fs: []*parserfn) (node | error) = { - let errors: []error = []; let save = io::tell(l.in)!; - for (let f .. fs) { - return match (f(l)) { + + for (let i = 0z; i < len(fs); i+=1) { + let f = fs[i]; + + match (f(l)) { case let n: node => return n; case let e: error => - append(errors, e)!; io::seek(l.in, save, io::whence::SET)!; - continue; + printrest(l); }; }; - return errors[0]; //("reached end of try block", 0); + return ("reached end of try block", 0); +}; + +fn printrest(l: *lex::lexer) void = { + let save = io::tell(l.in)!; + for (true) { + match (bufio::read_rune(l.in)!) { + case let r: rune => fmt::print(r)!; + case => break; + }; + }; + fmt::println()!; + io::seek(l.in, save, io::whence::SET)!; }; export fn parseSexpr(l: *lex::lexer) (node | error) = { @@ -33,8 +47,9 @@ export fn parseSexpr(l: *lex::lexer) (node | error) = { let args: []*node = []; for (true) { - match (try(l, [&parseName, &parseLit, &parseSexpr])) { - case let n: node => append(args, &n)!; + match (try(l, [ &parseName, &parseSexpr, &parseLit])) { + case let n: node => + append(args, &n)!; case let e: error => match (want(l, [lex::types::CBRACE])) { case lex::token => return sexpr{func = name: str, args = args};