From 9abf06f1c3a2a2bb8003936bd239a5be0c630805 Mon Sep 17 00:00:00 2001 From: Andre Wagner Date: Fri, 1 May 2026 09:29:29 -0500 Subject: [PATCH] . --- src/assembler/assembler.cc | 31 ++++++++++++++++++++++++++----- src/assembler/assembler.hh | 1 + 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/assembler/assembler.cc b/src/assembler/assembler.cc index 06f611f..e5b0792 100644 --- a/src/assembler/assembler.cc +++ b/src/assembler/assembler.cc @@ -18,6 +18,8 @@ ByteArray Assembler::assemble() for (;;) { Token t = lexer_.ingest(); + if (t.type == TokenType::Enter) + continue; if (t.type == TokenType::Directive) { if (std::get(t.token) == ".const") { @@ -30,22 +32,36 @@ ByteArray Assembler::assemble() } else { throw AssemblyError("Invalid directive " + std::get(t.token), t.line, t.column); } + } else if (section == Section::Const && t.type == TokenType::Integer) { - int index = std::get(expect_token(TokenType::Integer)); + int index = std::get(t.token); if ((size_t) index >= bp.constants.size()) bp.constants.resize(index + 1); expect_token(TokenType::Colon); Token tt = lexer_.ingest(); - if (tt.type == TokenType::Float) { + if (tt.type == TokenType::Float) bp.constants[index] = std::get(tt.token); - } else if (tt.type == TokenType::String) { + else if (tt.type == TokenType::String) bp.constants[index] = std::get(tt.token); - } else { + else throw AssemblyError("Expected float or string as constant", tt.line, tt.column); - } + expect_token(TokenType::Enter); + } else if (section == Section::Function && t.type == TokenType::Instruction) { + std::string instruction = std::get(t.token); + int oper = 0; + Token tt = lexer_.ingest(); + if (tt.type == TokenType::Integer) { + oper = std::get(tt.token); + tt = lexer_.ingest(); + } + emit_instruction(function_id, instruction, oper); + if (tt.type != TokenType::Enter) + throw AssemblyError("Expected enter", tt.line, tt.column); + } else if (t.type == TokenType::EOF_) { break; + } else if (t.type != TokenType::Enter) { throw AssemblyError("Unexpected token of type " + token_type_name(t.type) + ")", t.line, t.column); } @@ -54,6 +70,11 @@ ByteArray Assembler::assemble() return bc::Bytecode::generate(bp); } +void Assembler::emit_instruction(uint32_t function_id, std::string const& inst, int oper) +{ + +} + TokenValue Assembler::expect_token(TokenType type) { Token t = lexer_.ingest(); diff --git a/src/assembler/assembler.hh b/src/assembler/assembler.hh index 55393b1..492c714 100644 --- a/src/assembler/assembler.hh +++ b/src/assembler/assembler.hh @@ -19,6 +19,7 @@ private: Lexer lexer_; TokenValue expect_token(TokenType type); + void emit_instruction(uint32_t function_id, std::string const& inst, int oper); }; } // tyche