basic compiler integration (with errors, without check)

This commit is contained in:
ProgramSnail 2025-06-01 17:47:35 +03:00
parent 7c3ff04573
commit 26d2eaa8b3
5 changed files with 31 additions and 3 deletions

View file

@ -6,12 +6,14 @@
(:parser src/parser.cpp)
(:analyzer src/analyzer.cpp)
(:module_manager src/module_manager.cpp)
(:sm_parser src/sm_parser.cpp)
(:compiler src/compiler.cpp)
(:obj types.o interpreter.o)
(:runtime ../runtime/runtime.a))
(mode
(promote (until-clean)))
(action
(run g++ -Wall -Wextra -O3 -std=c++20 -DWITH_CHECK -Iinclude/ %{main} %{parser} %{analyzer} %{module_manager} %{runtime} %{obj} -o %{target})))
(run g++ -Wall -Wextra -O3 -std=c++20 -DWITH_CHECK -Iinclude/ %{main} %{parser} %{analyzer} %{module_manager} %{sm_parser} %{compiler} %{runtime} %{obj} -o %{target})))
(rule
(target types.o)

View file

@ -0,0 +1,6 @@
#pragma once
#include "sm_parser.hpp"
#include <vector>
std::vector<std::string> compile_to_code(const std::vector<SMInstr> &code);

View file

@ -2,6 +2,7 @@
#include <iostream>
#include "analyzer.hpp"
#include "compiler.hpp"
#include "parser.hpp"
#include "sm_parser.hpp"
@ -24,7 +25,7 @@ int main(int argc, char **argv) {
bool do_print = false;
if (strcmp(argv[1], "-i") == 0) {
do_interpretation = true;
} else if (strcmp(argv[1], "-sm") == 0) { // TODO: TMP, FOR CHECKS
} else if (strcmp(argv[1], "-ds") == 0) { // TODO: TMP, FOR CHECKS
std::ifstream file(argv[2]);
std::cout << "-- parse\n";
auto instrs = parse_sm(file);
@ -33,6 +34,13 @@ int main(int argc, char **argv) {
std::cout << print_sm(instr) << "\n";
}
return 0;
} else if (strcmp(argv[1], "-s") == 0) {
std::ifstream file(argv[2]);
auto instrs = compile_to_code(parse_sm(file));
for (auto &instr : instrs) {
std::cout << instr << "\n";
}
return 0;
}
#ifdef WITH_CHECK
else if (strcmp(argv[1], "-vi") == 0) {

View file

@ -2,6 +2,7 @@
#include "../../runtime/runtime.h"
#include "compiler.hpp"
#include "sm_parser.hpp"
#include <format>
@ -2115,3 +2116,15 @@ std::vector<Instr> compile(const Options &cmd, Env &env,
}
return result;
}
std::vector<std::string> compile_to_code(const std::vector<SMInstr> &code) {
Options cmd{.topname = "byterun", .filename = "byterun"}; // TODO TMP
Env env(Mode{.is_debug = true, .target_os = OS::LINUX});
auto asm_code = compile(cmd, env, {/*imports (TODO TMP)*/}, code);
std::vector<std::string> res;
std::transform(asm_code.begin(), asm_code.end(), std::back_inserter(res),
[&env](const auto &instr) { return to_code(env, instr); });
return res;
}

View file

@ -8,7 +8,6 @@ target("byterun")
add_includedirs("include")
add_files("../runtime/**.c", "../runtime/**.S")
add_files("src/**.cpp", "src/**.c")
remove_files("src/compiler.cpp")
set_warnings("allextra")
set_rundir("$(projectdir)")
add_defines("WITH_CHECK")