Files
Interpreter/compiler/src/TypeInfo.cpp
T

58 lines
1.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file TypeInfo.cpp
* @brief 语言类型元数据(machine.toml 别名 + 内建基元解析)
* @author
* @date 2026-08-21
*
* @details type_meta 实现:先按名称(大小写不敏感)命中配置类型行,
* 再由 base 解析出内建基元,合成 TypeMeta。
*/
#include "compiler/TypeInfo.h"
#include <cctype>
namespace compiler {
namespace {
/**
* @brief 转小写。
* @param s 输入串
* @return 全小写副本(逐字符 tolower,逐字节安全)
*/
std::string lower(const std::string& s) {
std::string out = s;
for (char& ch : out) {
ch = static_cast<char>(std::tolower(static_cast<unsigned char>(ch)));
}
return out;
}
} // namespace
/**
* @brief 按语言类型名查元数据。
* @param cfg 机器配置(类型表来源)
* @param name 语言类型名
* @return 对应 TypeMeta;未找到返回空 TypeMetaoperator bool 为 false
* @details 比较前两侧都转小写(配置名大写 BOOL/INT/TIMELinker type_name 小写);
* 命中配置行后再用 base 解析内建基元,两者都命中才算有效。
*/
TypeMeta type_meta(const MachineConfig& cfg, const std::string& name) {
TypeMeta m;
const std::string key = lower(name);
for (const ConfigType& t : cfg.types()) {
if (lower(t.name) == key) {
m.config = &t;
break;
}
}
if (m.config != nullptr) {
m.prim = MachineConfig::find_prim(m.config->base);
}
return m;
}
} // namespace compiler