summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/main.felan2
-rw-r--r--src/compiler/ast-tree.c26
-rw-r--r--src/compiler/ast-tree.h2
-rw-r--r--src/compiler/lexer.c6
-rw-r--r--src/compiler/lexer.h1
-rw-r--r--src/compiler/parser.c9
-rw-r--r--src/compiler/parser.h1
-rw-r--r--src/runner/runner.c2
8 files changed, 43 insertions, 6 deletions
diff --git a/code/main.felan b/code/main.felan
index 6c9ee46..daad667 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -4,5 +4,3 @@ main :: () -> void {
str := "123\n";
print(str);
};
-
-putchar :: (c:i32)->i32;
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,
diff --git a/src/runner/runner.c b/src/runner/runner.c
index b96f1a8..2e8c347 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -372,6 +372,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
ret = copyAstTree(variable->type);
}
goto RETURN;
+ case AST_TREE_BUILTIN_TOKEN_IMPORT:
case AST_TREE_BUILTIN_TOKEN__SIZE__:
}
UNREACHABLE;
@@ -1140,6 +1141,7 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
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_NULL:
case AST_TREE_TOKEN_VALUE_UNDEFINED:
case AST_TREE_TOKEN_VALUE_VOID: