commit 2aa6b92667ea64a185d8db290ebc9470adb99374
parent b00e7b8c3656c23cc616f8c9c33fc2a11bb68f07
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Sun, 10 May 2026 12:10:46 +0100
crying at bug
Diffstat:
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};