From 820d26491a6d8b85e9a4bc762ff2f37fda376a10 Mon Sep 17 00:00:00 2001 From: bog Date: Tue, 19 Sep 2023 11:29:23 +0200 Subject: [PATCH] ADD: now expose module to macros. --- examples/vardecl.zn | 1 + libstd/common.hpp | 2 ++ libstd/macro.cpp | 27 +++++++++++---------------- libstd/macro.hpp | 10 ++-------- src/Compiler.cpp | 11 +++++++---- src/Compiler.hpp | 4 +++- src/Module.cpp | 5 ++--- src/Module.hpp | 11 ++++++++++- src/NativeMacro.cpp | 6 ++---- src/NativeMacro.hpp | 10 ++++------ src/StaticPass.cpp | 12 ++++++++++-- src/Zarn.hpp | 2 +- 12 files changed, 55 insertions(+), 46 deletions(-) diff --git a/examples/vardecl.zn b/examples/vardecl.zn index e160255..efc0dd0 100644 --- a/examples/vardecl.zn +++ b/examples/vardecl.zn @@ -1,5 +1,6 @@ (assert-fail a) ($ a 34) +(assert-fail (a)) (assert= 34 a) ($ b ($ c 9)) diff --git a/libstd/common.hpp b/libstd/common.hpp index 396b0a9..070fe7f 100644 --- a/libstd/common.hpp +++ b/libstd/common.hpp @@ -2,6 +2,8 @@ #define COMMON_HPP #include "../src/Zarn.hpp" +#include "../src/Module.hpp" + using namespace zn; #define STDARGS std::vector> diff --git a/libstd/macro.cpp b/libstd/macro.cpp index 234cd7f..c7c30ac 100644 --- a/libstd/macro.cpp +++ b/libstd/macro.cpp @@ -1,13 +1,11 @@ #include "macro.hpp" -void assert_fail(Node const& node, - Compiler& compiler, - Program& program, - SymTable&) +void assert_fail(Node const& node, Module& mod) { try { - compiler.compile(*node.child_at(1), program); + mod.static_pass().execute(*node.child_at(1)); + mod.compiler().compile(*node.child_at(1), mod.program()); Loc loc = node.loc(); std::cerr << loc.file_path().string() << ":" << loc.line(); @@ -18,22 +16,19 @@ void assert_fail(Node const& node, { } - size_t addr = program.add_constant(std::make_shared + size_t addr = mod.program().add_constant(std::make_shared (TYPE_NIL, node.loc(), 0)); - program.append(OPCODE_LOAD_CONST, addr); + mod.program().append(OPCODE_LOAD_CONST, addr); } -void declare(Node const& node, - Compiler& compiler, - Program& program, - SymTable& sym) +void declare(Node const& node, Module &mod) { std::string ident = node.child_at(1)->repr(); - compiler.compile(*node.child_at(2), program); - auto entry = sym.find_any(ident); + mod.compiler().compile(*node.child_at(2), mod.program()); + auto entry = mod.sym().find_any(ident); assert(entry); - size_t addr = sym.gen_addr(); + size_t addr = mod.sym().gen_addr(); - sym.declare(ident, addr); - program.append(OPCODE_STORE_LOCAL, addr); + mod.sym().declare(ident, addr); + mod.program().append(OPCODE_STORE_LOCAL, addr); } diff --git a/libstd/macro.hpp b/libstd/macro.hpp index 1ba097e..37a3a11 100644 --- a/libstd/macro.hpp +++ b/libstd/macro.hpp @@ -3,14 +3,8 @@ #include "common.hpp" -void assert_fail(Node const& node, - Compiler& compiler, - Program& program, - SymTable& sym); +void assert_fail(Node const& node, Module& mod); -void declare(Node const& node, - Compiler& compiler, - Program& program, - SymTable& sym); +void declare(Node const& node, Module& mod); #endif diff --git a/src/Compiler.cpp b/src/Compiler.cpp index 64f66ed..5a82bed 100644 --- a/src/Compiler.cpp +++ b/src/Compiler.cpp @@ -1,12 +1,16 @@ #include "Compiler.hpp" +#include "Module.hpp" #include "Node.hpp" #include "Program.hpp" #include "NativeMacro.hpp" namespace zn { - /*explicit*/ Compiler::Compiler(Logger& logger, SymTable& sym) - : m_logger { logger } + /*explicit*/ Compiler::Compiler(Module& mod, + Logger& logger, + SymTable& sym) + : m_mod { mod } + , m_logger { logger } , m_sym { sym } { } @@ -57,8 +61,7 @@ namespace zn { if (macro->name() == ident) { - macro->execute(node, *this, - program, m_sym); + macro->execute(node, m_mod); found_macro = true; break; } diff --git a/src/Compiler.hpp b/src/Compiler.hpp index ec91e85..1f5d456 100644 --- a/src/Compiler.hpp +++ b/src/Compiler.hpp @@ -12,17 +12,19 @@ namespace zn ZN_ERROR(compile_error); class NativeMacro; + class Module; class Compiler { public: - explicit Compiler(Logger& logger, SymTable& sym); + explicit Compiler(Module& mod, Logger& logger, SymTable& sym); virtual ~Compiler(); void add_macro(std::shared_ptr macro); void compile(Node const& node, Program& program); private: + Module& m_mod; Logger& m_logger; SymTable& m_sym; std::vector> m_macros; diff --git a/src/Module.cpp b/src/Module.cpp index f722ae0..6476984 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -1,4 +1,5 @@ #include "Module.hpp" +#include "Zarn.hpp" #include "Lexer.hpp" #include "Parser.hpp" #include "Program.hpp" @@ -48,9 +49,7 @@ namespace zn m_zarn.load_std_library(); - StaticPass static_pass { m_logger, m_sym }; - static_pass.execute(*ast); - + m_static_pass.execute(*ast); m_compiler.compile(*ast, m_program); m_vm.execute(m_program); diff --git a/src/Module.hpp b/src/Module.hpp index 8a51b08..bcd4241 100644 --- a/src/Module.hpp +++ b/src/Module.hpp @@ -6,6 +6,8 @@ #include "VM.hpp" #include "Program.hpp" #include "SymTable.hpp" +#include "StaticPass.hpp" +#include "Compiler.hpp" #include "Zarn.hpp" namespace zn @@ -18,6 +20,12 @@ namespace zn explicit Module(Logger& logger); virtual ~Module(); + Compiler& compiler() { return m_compiler; } + StaticPass& static_pass() { return m_static_pass; } + + Program& program() { return m_program; } + SymTable& sym() { return m_sym; } + void load_from_file(std::filesystem::path file_path); std::string string() const; @@ -27,7 +35,8 @@ namespace zn Program m_program; VM m_vm { m_program }; SymTable m_sym; - Compiler m_compiler {m_logger, m_sym}; + StaticPass m_static_pass {m_logger, m_sym}; + Compiler m_compiler {*this, m_logger, m_sym}; Zarn m_zarn {m_compiler, m_sym, m_vm}; }; } diff --git a/src/NativeMacro.cpp b/src/NativeMacro.cpp index 6b68eee..af2381c 100644 --- a/src/NativeMacro.cpp +++ b/src/NativeMacro.cpp @@ -14,10 +14,8 @@ namespace zn } void NativeMacro::execute(Node const& node, - Compiler& compiler, - Program& program, - SymTable& sym) + Module& mod) { - m_macro(node, compiler, program, sym); + m_macro(node, mod); } } diff --git a/src/NativeMacro.hpp b/src/NativeMacro.hpp index 1f721ce..712df8c 100644 --- a/src/NativeMacro.hpp +++ b/src/NativeMacro.hpp @@ -9,11 +9,11 @@ namespace zn { + class Module; + using native_macro_t = std::function; + Module&)>; class NativeMacro { @@ -25,9 +25,7 @@ namespace zn void execute(Node const& node, - Compiler& compiler, - Program& program, - SymTable& sym); + Module&); private: std::string m_name; diff --git a/src/StaticPass.cpp b/src/StaticPass.cpp index 50a04c1..3eb9b97 100644 --- a/src/StaticPass.cpp +++ b/src/StaticPass.cpp @@ -33,7 +33,6 @@ namespace zn { std::string varname = node.child_at(1)->repr(); auto vartype = execute(*node.child_at(2)); - //int index = m_sym.gen_addr(); m_sym.prepare(varname, *vartype.type); return vartype; @@ -45,7 +44,16 @@ namespace zn } auto proto = sym->prototype; - assert(proto); + + if (!proto) + { + std::stringstream ss; + ss << "cannot call a none function variable '" + << ident + << "'"; + + m_logger.log(LOG_ERROR, node.loc(), ss.str()); + } if (proto->get_param_count() != node.size() - 1 && proto->get_param(proto->get_param_count() - 1).tag diff --git a/src/Zarn.hpp b/src/Zarn.hpp index 51465fb..57dd51b 100644 --- a/src/Zarn.hpp +++ b/src/Zarn.hpp @@ -4,7 +4,7 @@ #include "common.hpp" #include "SymTable.hpp" #include "VM.hpp" -#include "src/NativeMacro.hpp" +#include "NativeMacro.hpp" namespace zn {