From fdf38c71bf209317d3cd41952bb4afe77e146ad4 Mon Sep 17 00:00:00 2001 From: Konstantin Nazarov Date: Sun, 18 Aug 2024 22:08:47 +0100 Subject: [PATCH] Read and compile full toplevel multiline program --- src/compiler.cpp | 8 +++++++- src/reader.cpp | 5 +++++ src/reader.hpp | 2 ++ src/vli.cpp | 4 ++-- src/writer.cpp | 30 ++++++++++++++++++++++++++++++ src/writer.hpp | 11 +++++++++++ 6 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/compiler.cpp b/src/compiler.cpp index e61ef55..5ba4cf8 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -95,7 +95,13 @@ Result is_primitive_op(Symbol& sym) { Result Compiler::compile(Value& expr) { auto context = TRY(Context::create()); - auto ex = TRY(compile_expr(context, expr)); + if (!expr.is()) { + return ERROR(CompilationError); + } + + Pair& expr_pair = *expr.to(); + + auto ex = TRY(compile_body(context, expr_pair)); TRY(ex.add_opcode(Oc::Ret, {0, (int64_t)ex.reg})); Value name = TRY(Nil::create()); diff --git a/src/reader.cpp b/src/reader.cpp index 92dcb9c..492d0f9 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -423,3 +423,8 @@ Result read_one(const char* value) { auto r = Reader(s); return r.read_one(); } + +Result read_multiple(String& value) { + auto r = Reader(value); + return r.read_multiple(); +} diff --git a/src/reader.hpp b/src/reader.hpp index e3b2871..eeba149 100644 --- a/src/reader.hpp +++ b/src/reader.hpp @@ -45,3 +45,5 @@ class Reader { Result read_one(Value& value); Result read_one(String& value); Result read_one(const char* value); + +Result read_multiple(String& value); diff --git a/src/vli.cpp b/src/vli.cpp index e77b41a..db0cd91 100644 --- a/src/vli.cpp +++ b/src/vli.cpp @@ -26,8 +26,8 @@ Result run(int argc, const char* argv[]) { // auto code_str = // TRY(String::create("((lambda (f y) (f y)) (lambda (x) (* x x)) 2)")); - auto parsed = TRY(read_one(src)); - auto code_str_written = TRY(write_one(parsed)); + auto parsed = TRY(read_multiple(src)); + auto code_str_written = TRY(write_multiple(parsed)); TRY(arena_gc()); diff --git a/src/writer.cpp b/src/writer.cpp index e0deb41..2cbc0b7 100644 --- a/src/writer.cpp +++ b/src/writer.cpp @@ -37,6 +37,31 @@ Result Writer::write_one(const Value& obj) { return String(); } +Result Writer::write_multiple(const Value& val) { + String res = TRY(String::create("")); + + Value cur = TRY(val.copy()); + + bool is_first = true; + while (!cur.is()) { + if (!cur.is()) return ERROR(MalformedList); + + Pair& pair = *cur.to(); + + Value first = TRY(pair.first()); + if (!is_first) res = TRY(res.concat("\n")); + + String first_str = TRY(write_one(first)); + res = TRY(res.concat(first_str)); + + cur = TRY(pair.rest()); + is_first = false; + } + + res = TRY(res.concat("")); + return res; +} + Result Writer::write_int64(const Int64& val) { char tmp[32]; sprintf(tmp, "%lu", val.value()); @@ -301,3 +326,8 @@ Result write_one(const Value& value) { auto w = Writer(); return w.write_one(value); } + +Result write_multiple(const Value& value) { + auto w = Writer(); + return w.write_multiple(value); +} diff --git a/src/writer.hpp b/src/writer.hpp index 33ab5e2..4ba941d 100644 --- a/src/writer.hpp +++ b/src/writer.hpp @@ -37,3 +37,14 @@ Result write_one(const T& value) auto v = DIEX(value.copy_value()); return w.write_one(v); } + +Result write_multiple(const Value& value); + +template +Result write_multiple(const T& value) + requires std::derived_from +{ + auto w = Writer(); + auto v = DIEX(value.copy_value()); + return w.write_multiple(v); +}