diff --git a/CMakeLists.txt b/CMakeLists.txt index 210101f..533cb99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "Yerbacon ${CMAKE_PROJECT_VERSION_MAJOR}.${C set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${CMAKE_PROJECT_VERSION}-${TIME}") include_directories(${CMAKE_CURRENT_LIST_DIR}) -add_executable(${EXENAME} src/main.cpp ${CMAKE_CURRENT_BINARY_DIR}/processed/${PROJECT_NAME}.rc src/parser/MainParse.cpp src/transpiler/MainTranspile.cpp src/etc/filefuncs.cpp src/etc/lexer.cpp src/headers/lex.hpp src/headers/misc.hpp src/headers/parsing/ParseComponents.hpp src/headers/transpiler/Targets.hpp) +add_executable(${EXENAME} src/main.cpp ${CMAKE_CURRENT_BINARY_DIR}/processed/${PROJECT_NAME}.rc src/parser/MainParse.cpp src/transpiler/MainTranspile.cpp src/etc/filefuncs.cpp src/etc/lexer.cpp src/headers/lex.hpp src/headers/misc.hpp src/headers/parsing/ParseComponents.hpp src/headers/transpiler/Target.hpp src/headers/transpiler/implementations/Lua.hpp src/headers/transpiler/implementations/Js.hpp src/headers/transpiler/implementations/Py.hpp) target_compile_definitions(ybcon PRIVATE YBCON_VERSION="${CODENAME} ${PROJECT_VERSION}") # lpkg = linux package, wpkg = windows package diff --git a/src/headers/transpiler/Target.hpp b/src/headers/transpiler/Target.hpp new file mode 100644 index 0000000..9d4f32c --- /dev/null +++ b/src/headers/transpiler/Target.hpp @@ -0,0 +1,52 @@ +#ifndef YERBACON_TARGET_HPP +#define YERBACON_TARGET_HPP + +#include +#include +#include +#include + +#include "../parsing/ParseComponents.hpp" + +struct Target { + static shared_ptr forName(string_view name); + + string transpileWithTree(const ParseTree& tree) { + return ""; // TODO Call other methods + }; +}; + +#include "implementations/Lua.hpp" +#include "implementations/Js.hpp" +#include "implementations/Py.hpp" + +shared_ptr Target::forName(string_view name) { + LANGUAGE selected = NONE; + for (unsigned short i = 0; (i <= (languages->size() - 2)); ++i) { + if (name == languages[i]) { + selected = static_cast(i + 1); + break; + } + } + shared_ptr target; + switch (selected) { +#ifdef LUA_HPP + case LUA: target = make_shared(LuaTarget()); break; +#endif +#ifdef JS_HPP + case JS: target = make_shared(JsTarget()); break; +#endif +#ifdef PY_HPP + case PY: target = make_shared(PyTarget()); break; +#endif + case NONE: + default: { + cout << '"' << (char) toupper(name.at(1)); + name.remove_prefix(2); cout << name << "\" is not a valid target." << endl; + exit(0); + } + } + return target; +}; + +#endif //YERBACON_TARGET_HPP \ No newline at end of file diff --git a/src/headers/transpiler/Targets.hpp b/src/headers/transpiler/Targets.hpp deleted file mode 100644 index cbc2823..0000000 --- a/src/headers/transpiler/Targets.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef YERBACON_TARGETS_HPP -#define YERBACON_TARGETS_HPP - -#include -#include - -struct Target { - virtual vector getExtensions() = 0; -}; - -#endif //YERBACON_TARGETS_HPP \ No newline at end of file diff --git a/src/headers/transpiler/implementations/Js.hpp b/src/headers/transpiler/implementations/Js.hpp new file mode 100644 index 0000000..925b63b --- /dev/null +++ b/src/headers/transpiler/implementations/Js.hpp @@ -0,0 +1,6 @@ +#ifndef JS_HPP +#define JS_HPP + +struct JsTarget: Target {}; + +#endif \ No newline at end of file diff --git a/src/headers/transpiler/implementations/Lua.hpp b/src/headers/transpiler/implementations/Lua.hpp new file mode 100644 index 0000000..1cb00e7 --- /dev/null +++ b/src/headers/transpiler/implementations/Lua.hpp @@ -0,0 +1,6 @@ +#ifndef LUA_HPP +#define LUA_HPP + +struct LuaTarget: Target {}; + +#endif \ No newline at end of file diff --git a/src/headers/transpiler/implementations/Py.hpp b/src/headers/transpiler/implementations/Py.hpp new file mode 100644 index 0000000..e9c9fb9 --- /dev/null +++ b/src/headers/transpiler/implementations/Py.hpp @@ -0,0 +1,6 @@ +#ifndef PY_HPP +#define PY_HPP + +struct PyTarget: Target {}; + +#endif \ No newline at end of file diff --git a/src/transpiler/MainTranspile.cpp b/src/transpiler/MainTranspile.cpp index f9e3d93..c641d2c 100644 --- a/src/transpiler/MainTranspile.cpp +++ b/src/transpiler/MainTranspile.cpp @@ -5,35 +5,8 @@ using namespace std; enum LANGUAGE: unsigned short { NONE, LUA, JS, PY }; const string_view languages[3] = { ".lua", ".js", ".py"}; -LANGUAGE validLanguage(const string_view& it) { - LANGUAGE selected = NONE; - for (unsigned short i = 0; (i <= (languages->size() - 2)); ++i) { - if (it == languages[i]) { - selected = static_cast(i + 1); - break; - } - } - return selected; -} +#include "../headers/transpiler/Target.hpp" -#include "../headers/parsing/ParseComponents.hpp" -#include "../headers/transpiler/Targets.hpp" - -string transpile(const ParseTree tree, string language) -{ - string transpiled; - auto valided = validLanguage(language); - switch (valided) { - case LUA: - break; - case JS: - break; - case PY: - break; - default: { - cout << '"' << (char) toupper(language.at(1)) << language.erase(0, 2) << "\" is not a valid target." << endl; - exit(0); - } - } - return transpiled; +string transpile(const ParseTree tree, string language) { + return Target::forName(language)->transpileWithTree(tree); } \ No newline at end of file