aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/Builtins.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/Builtins.h')
-rw-r--r--lib/CodeGen/Builtins.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/CodeGen/Builtins.h b/lib/CodeGen/Builtins.h
new file mode 100644
index 0000000..34e36a9
--- /dev/null
+++ b/lib/CodeGen/Builtins.h
@@ -0,0 +1,37 @@
+#pragma once
+#include <string>
+
+namespace cps::detail {
+
+// Single source of truth for the built-in functions: name, arity and return
+// type. emitExpr checks arity against this table before dispatching, and
+// getExprTypeInfo reads the return type from it.
+struct BuiltinInfo {
+ const char *Name;
+ unsigned Arity;
+ const char *ReturnTypeName;
+};
+
+inline constexpr BuiltinInfo Builtins[] = {
+ {"LENGTH", 1, "INTEGER"},
+ {"MID", 3, "STRING"},
+ {"RIGHT", 2, "STRING"},
+ {"LEFT", 2, "STRING"},
+ {"LCASE", 1, "STRING"},
+ {"UCASE", 1, "STRING"},
+ {"ASC", 1, "INTEGER"},
+ {"CHR", 1, "STRING"},
+ {"IS_NUM", 1, "BOOLEAN"},
+ {"NUM_TO_STR", 1, "STRING"},
+ {"STR_TO_NUM", 1, "REAL"},
+ {"EOF", 1, "BOOLEAN"},
+};
+
+inline const BuiltinInfo *findBuiltin(const std::string &Name) {
+ for (const auto &B : Builtins) {
+ if (Name == B.Name) return &B;
+ }
+ return nullptr;
+}
+
+} // namespace cps::detail