diff --git a/include/code_writer.hpp b/include/code_writer.hpp new file mode 100644 index 0000000..dd28c4d --- /dev/null +++ b/include/code_writer.hpp @@ -0,0 +1,64 @@ + +#include "parser.hpp" +#include +#include + +typedef std::vector lots_of_files; + +const std::unordered_map operation_map({{"add", "M+D"}, + {"sub", "M-D"}, + {"neg", "-M"}, + {"and", "D&M"}, + {"or", "D|M"}, + {"not", "!M"}, + {"eq", "JEQ"}, + {"lt", "JLT"}, + {"gt", "LGT"}}); + +class code_writer +{ +private: + lots_of_files files; + std::vector commands; + std::ofstream outfile; + std::string current_file = ""; + std::string current_function = ""; + int ins_no = -1; + bool dbg = true; + bool is_dir = false; + +public: + code_writer(lots_of_files name); + void write_assembly(); + void write_push(std::string segment, int index, bool debug); + void write_push(std::string segment, bool debug); + void write_pop(std::string segment, int index, bool debug); + void write_pop(std::string segment, bool debug); + + void write_arithmetic(std::string comm, int index, bool debug); + void write_add_sub_and_or(std::string op, bool debug); + void write_neg_not(std::string op, bool debug); + void write_eq_lt_gt(std::string op, bool debug); + + /* + void write_add(bool debug); + void write_sub(bool debug); + void write_neg(bool debug); + void write_and(bool debug); + void write_or(bool debug); + void write_not(bool debug); + void write_eq(bool debug); + void write_lt(bool debug); + void write_gt(bool debug); +*/ + void write_init(bool debug); + + void write_label(std::string label, int index, bool debug); + void write_goto(std::string label, int index, bool debug); + void write_if(std::string label, int index, bool debug); + + void write_call(std::string fun_name, int args, bool debug); + void write_return(bool debug); + void write_function(std::string fun_name, int locals, bool debug); + void write_frame_restore(std::string segment, int minus, bool debug); +}; diff --git a/include/parser.hpp b/include/parser.hpp new file mode 100644 index 0000000..259342f --- /dev/null +++ b/include/parser.hpp @@ -0,0 +1,34 @@ +#pragma once +#include +#include +#include +#include +#include "vutility.hpp" + +enum c_type +{ + C_ARITHMETIC, + C_PUSH, + C_POP, + C_LABEL, + C_GOTO, + C_IF, + C_FUNCTION, + C_RETURN, + C_CALL +}; + +typedef std::tuple vmcommand; + +class parser +{ +private: + std::string input_file; + std::vector parsed; + +public: + bool change_file(std::string name); + std::vector get_commands(); + c_type command_type(std::string com); + void parse(); +}; diff --git a/include/vutility.hpp b/include/vutility.hpp new file mode 100644 index 0000000..9beb3f5 --- /dev/null +++ b/include/vutility.hpp @@ -0,0 +1,13 @@ + +#include +#include +#include +class vutility +{ +private: + vutility() {} + +public: + static std::vector split(std::string str, char delimit); + static std::string trim(std::string str); +};