diff --git a/src/assembler.cpp b/src/assembler.cpp index c768811..5256ad2 100644 --- a/src/assembler.cpp +++ b/src/assembler.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include using namespace vc5::tools; @@ -22,6 +23,9 @@ namespace fs = std::filesystem; using TT = Tok::Ty; +using EO = EvaledOperand; +using EOT = EO::Ty; + auto vc5::tools::assemble_file(fs::path input_path, fs::path output_path) -> std::expected { @@ -49,6 +53,8 @@ auto vc5::tools::assemble_file(fs::path input_path, fs::path output_path) auto assembler = Assembler(text, builder); + auto lines = std::vector(); + while (true) { auto ins = parser.parse_ins(); if (not ins) { @@ -75,24 +81,49 @@ auto vc5::tools::assemble_file(fs::path input_path, fs::path output_path) return {}; } -void Assembler::assemble_ins(Ins& ins) +auto Assembler::assemble_file(std::string_view text) + -> std::expected, std::string> { - if (ins.labels) { - for (const auto& label : *ins.labels) { - if (label.is_local) { - m_local_labels[label.ident] = m_builder->ip(); - } else { - m_local_labels.clear(); - m_global_labels[label.ident] = m_builder->ip(); - } + auto parser = Parser(text); + + auto program = std::vector(65536); + auto builder = Builder(program.data()); + + auto assembler = Assembler(text, builder); + + auto lines = std::vector(); + + while (true) { + auto ins = parser.parse_ins(); + if (not ins) { + break; } } - assemble_line(ins); + if (not parser.ok()) { + return std::unexpected("parsing failed"); + } + + return { std::move(program) }; } -void Assembler::assemble_line(Ins& ins) +void Assembler::assemble_define_labels(const std::vector