mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-06 06:58:46 +00:00
209 lines
4.7 KiB
C++
209 lines
4.7 KiB
C++
#pragma once
|
|
|
|
#include <map>
|
|
#include <string>
|
|
|
|
#include "basic_nodes.hpp"
|
|
|
|
namespace builtin {
|
|
|
|
enum class Type {
|
|
// -- containers
|
|
TUPLE,
|
|
VARIANT,
|
|
FUNCTION,
|
|
ARRAY,
|
|
OPTIONAL,
|
|
RESULT,
|
|
ERROR,
|
|
// -- basic types
|
|
FLOAT,
|
|
DOUBLE,
|
|
INT,
|
|
LONG,
|
|
INDEX,
|
|
CHAR,
|
|
UNICODE,
|
|
BOOL,
|
|
UNIT,
|
|
NULL_OPTION,
|
|
// -- none
|
|
NONE,
|
|
};
|
|
|
|
namespace types {
|
|
|
|
// -- containers
|
|
|
|
const static std::string TUPLE_IDENTIFIER = "Tuple";
|
|
|
|
const static std::string VARIANT_IDENTIFIER = "Variant";
|
|
|
|
const static std::string FUNCTION_IDENTIFIER = "Function";
|
|
|
|
const static std::string ARRAY_IDENTIFIER = "Array";
|
|
|
|
const static std::string OPTIONAL_IDENTIFIER = "Optional";
|
|
|
|
const static std::string RESULT_IDENTIFIER = "Result";
|
|
|
|
const static std::string ERROR_IDENTIFIER = "Error";
|
|
|
|
// -- basic types
|
|
|
|
const static std::string FLOAT_IDENTIFIER = "Float";
|
|
|
|
const static std::string DOUBLE_IDENTIFIER = "Double";
|
|
|
|
const static std::string INT_IDENTIFIER = "Int";
|
|
|
|
const static std::string LONG_IDENTIFIER = "Long";
|
|
|
|
const static std::string INDEX_IDENTIFIER = "Index";
|
|
|
|
const static std::string CHAR_IDENTIFIER = "Char";
|
|
|
|
const static std::string UNICODE_IDENTIFIER = "Unicode";
|
|
|
|
const static std::string BOOL_IDENTIFIER = "Bool";
|
|
|
|
const static std::string UNIT_IDENTIFIER = "Unit";
|
|
|
|
const static std::string NULL_OPTION_IDENTIFIER = "Null";
|
|
|
|
// const static std::string STRING_IDENTIFIER = "String"; // String is
|
|
// Array[Char]
|
|
|
|
//
|
|
|
|
inline std::string to_string(Type type) {
|
|
switch (type) {
|
|
// -- containers
|
|
case Type::TUPLE:
|
|
return TUPLE_IDENTIFIER;
|
|
case Type::VARIANT:
|
|
return VARIANT_IDENTIFIER;
|
|
case Type::FUNCTION:
|
|
return FUNCTION_IDENTIFIER;
|
|
case Type::ARRAY:
|
|
return ARRAY_IDENTIFIER;
|
|
case Type::OPTIONAL:
|
|
return OPTIONAL_IDENTIFIER;
|
|
case Type::RESULT:
|
|
return RESULT_IDENTIFIER;
|
|
case Type::ERROR:
|
|
return ERROR_IDENTIFIER;
|
|
// -- basic types
|
|
case Type::FLOAT:
|
|
return FLOAT_IDENTIFIER;
|
|
case Type::DOUBLE:
|
|
return DOUBLE_IDENTIFIER;
|
|
case Type::INT:
|
|
return INT_IDENTIFIER;
|
|
case Type::LONG:
|
|
return LONG_IDENTIFIER;
|
|
case Type::INDEX:
|
|
return INDEX_IDENTIFIER;
|
|
case Type::CHAR:
|
|
return CHAR_IDENTIFIER;
|
|
case Type::UNICODE:
|
|
return UNICODE_IDENTIFIER;
|
|
case Type::BOOL:
|
|
return BOOL_IDENTIFIER;
|
|
case Type::UNIT:
|
|
return UNIT_IDENTIFIER;
|
|
case Type::NULL_OPTION:
|
|
return NULL_OPTION_IDENTIFIER;
|
|
// -- none
|
|
case Type::NONE:
|
|
return TUPLE_IDENTIFIER;
|
|
}
|
|
|
|
error_handling::handle_general_error("Unreachable");
|
|
exit(1); // unreachable
|
|
}
|
|
|
|
inline Type to_type(const std::string &str) {
|
|
static std::map<std::string, Type> builtin_types;
|
|
if (!builtin_types.empty()) { // if not initialized, initialize
|
|
|
|
// -- containers
|
|
builtin_types[TUPLE_IDENTIFIER] = Type::TUPLE;
|
|
builtin_types[VARIANT_IDENTIFIER] = Type::VARIANT;
|
|
builtin_types[FUNCTION_IDENTIFIER] = Type::FUNCTION;
|
|
builtin_types[ARRAY_IDENTIFIER] = Type::ARRAY;
|
|
builtin_types[OPTIONAL_IDENTIFIER] = Type::OPTIONAL;
|
|
builtin_types[RESULT_IDENTIFIER] = Type::RESULT;
|
|
builtin_types[ERROR_IDENTIFIER] = Type::ERROR;
|
|
|
|
// -- basic types
|
|
builtin_types[FLOAT_IDENTIFIER] = Type::FLOAT;
|
|
builtin_types[DOUBLE_IDENTIFIER] = Type::DOUBLE;
|
|
builtin_types[INT_IDENTIFIER] = Type::INT;
|
|
builtin_types[LONG_IDENTIFIER] = Type::LONG;
|
|
builtin_types[INDEX_IDENTIFIER] = Type::INDEX;
|
|
builtin_types[CHAR_IDENTIFIER] = Type::CHAR;
|
|
builtin_types[UNICODE_IDENTIFIER] = Type::UNICODE;
|
|
builtin_types[BOOL_IDENTIFIER] = Type::BOOL;
|
|
builtin_types[UNIT_IDENTIFIER] = Type::UNIT;
|
|
builtin_types[NULL_OPTION_IDENTIFIER] = Type::NULL_OPTION;
|
|
}
|
|
|
|
auto iter = builtin_types.find(str);
|
|
|
|
if (iter == builtin_types.end()) {
|
|
return Type::NONE;
|
|
}
|
|
|
|
return iter->second;
|
|
}
|
|
|
|
inline nodes::Modifier get_modifier(Type type) {
|
|
switch (type) {
|
|
case Type::OPTIONAL:
|
|
return nodes::Modifier::OPTIONAL;
|
|
case Type::RESULT:
|
|
return nodes::Modifier::RESULT;
|
|
default:
|
|
return nodes::Modifier::NONE;
|
|
}
|
|
}
|
|
|
|
// std::nullopt for any parameters count
|
|
inline std::optional<size_t> get_parameters_count(Type type) {
|
|
switch (type) {
|
|
// -- containers
|
|
case Type::TUPLE:
|
|
case Type::VARIANT:
|
|
case Type::FUNCTION:
|
|
return std::nullopt;
|
|
case Type::ARRAY:
|
|
case Type::OPTIONAL:
|
|
case Type::ERROR:
|
|
return 1;
|
|
case Type::RESULT: // RESULT[T E] = T | Error[E]
|
|
return 2;
|
|
// -- basic types
|
|
case Type::FLOAT:
|
|
case Type::DOUBLE:
|
|
case Type::INT:
|
|
case Type::LONG:
|
|
case Type::INDEX:
|
|
case Type::CHAR:
|
|
case Type::UNICODE:
|
|
case Type::BOOL:
|
|
case Type::UNIT:
|
|
case Type::NULL_OPTION:
|
|
return 0;
|
|
// -- none
|
|
case Type::NONE:
|
|
return std::nullopt;
|
|
}
|
|
|
|
error_handling::handle_general_error("Unreachable");
|
|
exit(1); // unreachable
|
|
}
|
|
|
|
} // namespace types
|
|
|
|
} // namespace builtin
|