From 79babd7e6c97ead76c7cd6295f01e049d1b28524 Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Thu, 24 Apr 2025 15:19:06 +0330
Subject: add code type

---
 src/compiler/ast-tree.c | 26 ++++++++++++++++++++++++--
 src/compiler/ast-tree.h |  2 ++
 src/compiler/lexer.c    |  6 ++++--
 src/compiler/lexer.h    |  1 +
 src/compiler/parser.c   |  9 +++++++++
 src/compiler/parser.h   |  1 +
 6 files changed, 41 insertions(+), 4 deletions(-)

(limited to 'src/compiler')

diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index ac046f0..b770098 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -104,6 +104,12 @@ AstTree AST_TREE_F128_TYPE = {
     .type = &AST_TREE_TYPE_TYPE,
 };
 
+AstTree AST_TREE_CODE_TYPE = {
+    .token = AST_TREE_TOKEN_TYPE_CODE,
+    .metadata = NULL,
+    .type = &AST_TREE_TYPE_TYPE,
+};
+
 AstTree AST_TREE_VOID_VALUE = {
     .token = AST_TREE_TOKEN_VALUE_VOID,
     .metadata = NULL,
@@ -139,6 +145,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = {
     "AST_TREE_TOKEN_TYPE_F32",
     "AST_TREE_TOKEN_TYPE_F64",
     "AST_TREE_TOKEN_TYPE_F128",
+    "AST_TREE_TOKEN_TYPE_CODE",
     "AST_TREE_TOKEN_TYPE_BOOL",
     "AST_TREE_TOKEN_VALUE_VOID",
 
@@ -251,6 +258,7 @@ void astTreePrint(const AstTree *tree, int indent) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_VOID:
   case AST_TREE_TOKEN_VALUE_NULL:
@@ -637,6 +645,7 @@ void astTreeDestroy(AstTree tree) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_NULL:
   case AST_TREE_TOKEN_VALUE_UNDEFINED:
@@ -881,6 +890,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[],
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_VALUE_VOID:
     return tree;
   case AST_TREE_TOKEN_VALUE_NULL:
@@ -1564,6 +1574,7 @@ AstTreeRoot *makeAstRoot(ParserNode *parsedRoot, char *filePath) {
       case PARSER_TOKEN_TYPE_F32:
       case PARSER_TOKEN_TYPE_F64:
       case PARSER_TOKEN_TYPE_F128:
+      case PARSER_TOKEN_TYPE_CODE:
       case PARSER_TOKEN_TYPE_BOOL:
       case PARSER_TOKEN_OPERATOR_POINTER:
       case PARSER_TOKEN_OPERATOR_ADDRESS:
@@ -1701,6 +1712,8 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) {
     return &AST_TREE_F64_TYPE;
   case PARSER_TOKEN_TYPE_F128:
     return &AST_TREE_F128_TYPE;
+  case PARSER_TOKEN_TYPE_CODE:
+    return &AST_TREE_CODE_TYPE;
   case PARSER_TOKEN_TYPE_BOOL:
     return &AST_TREE_BOOL_TYPE;
   case PARSER_TOKEN_FUNCTION_CALL:
@@ -1941,6 +1954,7 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) {
     case PARSER_TOKEN_TYPE_F32:
     case PARSER_TOKEN_TYPE_F64:
     case PARSER_TOKEN_TYPE_F128:
+    case PARSER_TOKEN_TYPE_CODE:
     case PARSER_TOKEN_TYPE_BOOL:
     case PARSER_TOKEN_KEYWORD_PUTC:
     case PARSER_TOKEN_KEYWORD_RETURN:
@@ -2523,6 +2537,7 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode,
     case PARSER_TOKEN_TYPE_F32:
     case PARSER_TOKEN_TYPE_F64:
     case PARSER_TOKEN_TYPE_F128:
+    case PARSER_TOKEN_TYPE_CODE:
     case PARSER_TOKEN_TYPE_BOOL:
     case PARSER_TOKEN_KEYWORD_PUTC:
     case PARSER_TOKEN_KEYWORD_RETURN:
@@ -2786,6 +2801,7 @@ bool isConst(AstTree *tree) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_NULL:
   case AST_TREE_TOKEN_VALUE_UNDEFINED:
@@ -2900,6 +2916,7 @@ bool isConstByValue(AstTree *tree) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_NULL:
   case AST_TREE_TOKEN_VALUE_UNDEFINED:
@@ -3010,6 +3027,7 @@ AstTree *makeTypeOf(AstTree *value) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_OPERATOR_POINTER:
   case AST_TREE_TOKEN_KEYWORD_STRUCT:
@@ -3208,6 +3226,7 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
     return type1->token == type0->token;
   case AST_TREE_TOKEN_OPERATOR_POINTER: {
     if (type1->token != type0->token) {
@@ -3312,6 +3331,7 @@ AstTree *getValue(AstTree *tree) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_NULL:
   case AST_TREE_TOKEN_VALUE_UNDEFINED:
@@ -3412,6 +3432,7 @@ bool isIntType(AstTree *type) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_VOID:
   case AST_TREE_TOKEN_FUNCTION_CALL:
@@ -3471,6 +3492,7 @@ bool isEqual(AstTree *left, AstTree *right) {
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_VALUE_VOID:
   case AST_TREE_TOKEN_VALUE_NULL:
@@ -3648,6 +3670,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
   case AST_TREE_TOKEN_TYPE_F32:
   case AST_TREE_TOKEN_TYPE_F64:
   case AST_TREE_TOKEN_TYPE_F128:
+  case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_VALUE_VOID:
     return true;
   case AST_TREE_TOKEN_VALUE_BOOL:
@@ -4867,8 +4890,7 @@ bool setTypesBuiltin(AstTree *tree, AstTreeSetTypesHelper helper,
       type_metadata->arguments = a404m_malloc(
           type_metadata->arguments_size * sizeof(*type_metadata->arguments));
 
-      // TODO: change
-      type_metadata->returnType = copyAstTree(&AST_TREE_TYPE_TYPE);
+      type_metadata->returnType = copyAstTree(&AST_TREE_CODE_TYPE);
 
       type_metadata->arguments[0] = (AstTreeTypeFunctionArgument){
           .type = copyAstTree(file->type),
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index b1cd722..d60088d 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -35,6 +35,7 @@ typedef enum AstTreeToken {
   AST_TREE_TOKEN_TYPE_F32,
   AST_TREE_TOKEN_TYPE_F64,
   AST_TREE_TOKEN_TYPE_F128,
+  AST_TREE_TOKEN_TYPE_CODE,
   AST_TREE_TOKEN_TYPE_BOOL,
   AST_TREE_TOKEN_VALUE_VOID,
   AST_TREE_TOKEN_STATIC_VARS_END = AST_TREE_TOKEN_VALUE_VOID,
@@ -104,6 +105,7 @@ extern AstTree AST_TREE_F16_TYPE;
 extern AstTree AST_TREE_F32_TYPE;
 extern AstTree AST_TREE_F64_TYPE;
 extern AstTree AST_TREE_F128_TYPE;
+extern AstTree AST_TREE_CODE_TYPE;
 extern AstTree AST_TREE_VOID_VALUE;
 
 typedef struct AstTreeVariable {
diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c
index 754593a..273f40a 100644
--- a/src/compiler/lexer.c
+++ b/src/compiler/lexer.c
@@ -34,6 +34,7 @@ const char *LEXER_TOKEN_STRINGS[] = {
     "LEXER_TOKEN_KEYWORD_TRUE",
     "LEXER_TOKEN_KEYWORD_FALSE",
     "LEXER_TOKEN_KEYWORD_NULL",
+    "LEXER_TOKEN_KEYWORD_CODE",
     "LEXER_TOKEN_NUMBER",
     "LEXER_TOKEN_CHAR",
     "LEXER_TOKEN_STRING",
@@ -148,7 +149,7 @@ const char *LEXER_KEYWORD_STRINGS[] = {
     "f16",
 #endif
     "f32",  "f64",  "f128",  "bool",     "putc", "return", "true",      "false",
-    "if",   "else", "while", "comptime", "null", "struct", "undefined",
+    "if",   "else", "while", "comptime", "null", "struct", "undefined", "code",
 };
 const LexerToken LEXER_KEYWORD_TOKENS[] = {
     LEXER_TOKEN_KEYWORD_TYPE,      LEXER_TOKEN_KEYWORD_VOID,
@@ -166,7 +167,7 @@ const LexerToken LEXER_KEYWORD_TOKENS[] = {
     LEXER_TOKEN_KEYWORD_IF,        LEXER_TOKEN_KEYWORD_ELSE,
     LEXER_TOKEN_KEYWORD_WHILE,     LEXER_TOKEN_KEYWORD_COMPTIME,
     LEXER_TOKEN_KEYWORD_NULL,      LEXER_TOKEN_KEYWORD_STRUCT,
-    LEXER_TOKEN_KEYWORD_UNDEFINED,
+    LEXER_TOKEN_KEYWORD_UNDEFINED, LEXER_TOKEN_KEYWORD_CODE,
 };
 const size_t LEXER_KEYWORD_SIZE =
     sizeof(LEXER_KEYWORD_TOKENS) / sizeof(*LEXER_KEYWORD_TOKENS);
@@ -357,6 +358,7 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter,
   case LEXER_TOKEN_KEYWORD_NULL:
   case LEXER_TOKEN_KEYWORD_STRUCT:
   case LEXER_TOKEN_KEYWORD_UNDEFINED:
+  case LEXER_TOKEN_KEYWORD_CODE:
   case LEXER_TOKEN_NUMBER:
   case LEXER_TOKEN_CHAR:
   case LEXER_TOKEN_STRING:
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
index a9b6dcd..71d9640 100644
--- a/src/compiler/lexer.h
+++ b/src/compiler/lexer.h
@@ -33,6 +33,7 @@ typedef enum LexerToken {
   LEXER_TOKEN_KEYWORD_TRUE,
   LEXER_TOKEN_KEYWORD_FALSE,
   LEXER_TOKEN_KEYWORD_NULL,
+  LEXER_TOKEN_KEYWORD_CODE,
   LEXER_TOKEN_NUMBER,
   LEXER_TOKEN_CHAR,
   LEXER_TOKEN_STRING,
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index f0d3e9b..956b834 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -40,6 +40,7 @@ const char *PARSER_TOKEN_STRINGS[] = {
     "PARSER_TOKEN_TYPE_F32",
     "PARSER_TOKEN_TYPE_F64",
     "PARSER_TOKEN_TYPE_F128",
+    "PARSER_TOKEN_TYPE_CODE",
 
     "PARSER_TOKEN_KEYWORD_PUTC",
     "PARSER_TOKEN_KEYWORD_RETURN",
@@ -239,6 +240,7 @@ void parserNodePrint(const ParserNode *node, int indent) {
   case PARSER_TOKEN_TYPE_F32:
   case PARSER_TOKEN_TYPE_F64:
   case PARSER_TOKEN_TYPE_F128:
+  case PARSER_TOKEN_TYPE_CODE:
   case PARSER_TOKEN_KEYWORD_NULL:
   case PARSER_TOKEN_KEYWORD_UNDEFINED:
     goto RETURN_SUCCESS;
@@ -521,6 +523,7 @@ void parserNodeDelete(ParserNode *node) {
   case PARSER_TOKEN_TYPE_F32:
   case PARSER_TOKEN_TYPE_F64:
   case PARSER_TOKEN_TYPE_F128:
+  case PARSER_TOKEN_TYPE_CODE:
   case PARSER_TOKEN_KEYWORD_NULL:
   case PARSER_TOKEN_KEYWORD_UNDEFINED:
     goto RETURN_SUCCESS;
@@ -799,6 +802,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
     return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F64);
   case LEXER_TOKEN_KEYWORD_F128:
     return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F128);
+  case LEXER_TOKEN_KEYWORD_CODE:
+    return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_CODE);
   case LEXER_TOKEN_KEYWORD_NULL:
     return parserNoMetadata(node, parent, PARSER_TOKEN_KEYWORD_NULL);
   case LEXER_TOKEN_KEYWORD_UNDEFINED:
@@ -1520,6 +1525,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
       case PARSER_TOKEN_TYPE_F32:
       case PARSER_TOKEN_TYPE_F64:
       case PARSER_TOKEN_TYPE_F128:
+      case PARSER_TOKEN_TYPE_CODE:
       case PARSER_TOKEN_KEYWORD_NULL:
       case PARSER_TOKEN_KEYWORD_UNDEFINED:
       case PARSER_TOKEN_KEYWORD_PUTC:
@@ -2018,6 +2024,7 @@ bool isExpression(ParserNode *node) {
   case PARSER_TOKEN_TYPE_F32:
   case PARSER_TOKEN_TYPE_F64:
   case PARSER_TOKEN_TYPE_F128:
+  case PARSER_TOKEN_TYPE_CODE:
   case PARSER_TOKEN_KEYWORD_NULL:
   case PARSER_TOKEN_KEYWORD_UNDEFINED:
   case PARSER_TOKEN_KEYWORD_STRUCT:
@@ -2051,6 +2058,7 @@ bool isType(ParserNode *node) {
   case PARSER_TOKEN_TYPE_F32:
   case PARSER_TOKEN_TYPE_F64:
   case PARSER_TOKEN_TYPE_F128:
+  case PARSER_TOKEN_TYPE_CODE:
   case PARSER_TOKEN_TYPE_BOOL:
   case PARSER_TOKEN_IDENTIFIER:
   case PARSER_TOKEN_BUILTIN:
@@ -2166,6 +2174,7 @@ bool isValue(ParserNode *node) {
   case PARSER_TOKEN_TYPE_F32:
   case PARSER_TOKEN_TYPE_F64:
   case PARSER_TOKEN_TYPE_F128:
+  case PARSER_TOKEN_TYPE_CODE:
   case PARSER_TOKEN_KEYWORD_NULL:
   case PARSER_TOKEN_KEYWORD_UNDEFINED:
   case PARSER_TOKEN_KEYWORD_IF:
diff --git a/src/compiler/parser.h b/src/compiler/parser.h
index ecc6159..25e9a21 100644
--- a/src/compiler/parser.h
+++ b/src/compiler/parser.h
@@ -35,6 +35,7 @@ typedef enum ParserToken {
   PARSER_TOKEN_TYPE_F32,
   PARSER_TOKEN_TYPE_F64,
   PARSER_TOKEN_TYPE_F128,
+  PARSER_TOKEN_TYPE_CODE,
 
   PARSER_TOKEN_KEYWORD_PUTC,
   PARSER_TOKEN_KEYWORD_RETURN,
-- 
cgit v1.2.3