Replace Targets.hpp with Target.hpp and add language-specific headers

This commit is contained in:
Username404 2021-07-03 11:06:01 +02:00
parent 5de2a28f93
commit 995684799d
Signed by: Username404-59
GPG Key ID: 7AB361FBB257A5D1
7 changed files with 74 additions and 42 deletions

View File

@ -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

View File

@ -0,0 +1,52 @@
#ifndef YERBACON_TARGET_HPP
#define YERBACON_TARGET_HPP
#include <vector>
#include <string_view>
#include <iostream>
#include <memory>
#include "../parsing/ParseComponents.hpp"
struct Target {
static shared_ptr<Target> 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> 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<LANGUAGE>(i + 1);
break;
}
}
shared_ptr<Target> target;
switch (selected) {
#ifdef LUA_HPP
case LUA: target = make_shared<LuaTarget>(LuaTarget()); break;
#endif
#ifdef JS_HPP
case JS: target = make_shared<JsTarget>(JsTarget()); break;
#endif
#ifdef PY_HPP
case PY: target = make_shared<PyTarget>(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

View File

@ -1,11 +0,0 @@
#ifndef YERBACON_TARGETS_HPP
#define YERBACON_TARGETS_HPP
#include <vector>
#include <string_view>
struct Target {
virtual vector<string_view> getExtensions() = 0;
};
#endif //YERBACON_TARGETS_HPP

View File

@ -0,0 +1,6 @@
#ifndef JS_HPP
#define JS_HPP
struct JsTarget: Target {};
#endif

View File

@ -0,0 +1,6 @@
#ifndef LUA_HPP
#define LUA_HPP
struct LuaTarget: Target {};
#endif

View File

@ -0,0 +1,6 @@
#ifndef PY_HPP
#define PY_HPP
struct PyTarget: Target {};
#endif

View File

@ -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<LANGUAGE>(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);
}