summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/main.felan15
-rw-r--r--src/compiler/ast-tree.c21
-rw-r--r--src/compiler/ast-tree.h2
-rw-r--r--src/compiler/parser.c2
-rw-r--r--src/runner/runner.c3
5 files changed, 18 insertions, 25 deletions
diff --git a/code/main.felan b/code/main.felan
index f1db641..26a330c 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,16 +1,3 @@
main :: () -> void {
- print_u64 fibo(10);
-};
-
-f :: (a:u64,b:u64)->u64{
- return b-a;
-};
-
-fibo :: (a:u64)->u64{
- if a == 0
- return 1;
- else if a == 1
- return 1;
- else
- return fibo(a-1)+fibo(a-2);
+ b : *u64 = null;
};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 1bfda8c..5a6961a 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -579,9 +579,8 @@ void astTreeDelete(AstTree *tree) {
}
bool astTreeShouldDelete(AstTree *tree) {
- return (AST_TREE_TOKEN_STATIC_VARS_BEGIN > tree->token ||
- tree->token > AST_TREE_TOKEN_STATIC_VARS_END) &&
- tree != &AST_TREE_VOID_VALUE;
+ return AST_TREE_TOKEN_STATIC_VARS_BEGIN > tree->token ||
+ tree->token > AST_TREE_TOKEN_STATIC_VARS_END;
}
void astTreeRootDelete(AstTreeRoot *root) {
@@ -620,9 +619,11 @@ AstTree *copyAstTree(AstTree *tree) {
case AST_TREE_TOKEN_TYPE_F32:
case AST_TREE_TOKEN_TYPE_F64:
case AST_TREE_TOKEN_TYPE_F128:
- case AST_TREE_TOKEN_VALUE_NULL:
case AST_TREE_TOKEN_VALUE_VOID:
return tree;
+ case AST_TREE_TOKEN_VALUE_NULL:
+ return newAstTree(tree->token, NULL, copyAstTree(tree->type), tree->str_begin,
+ tree->str_end);
case AST_TREE_TOKEN_VALUE_INT:
case AST_TREE_TOKEN_VALUE_BOOL:
return newAstTree(tree->token, tree->metadata, tree->type, tree->str_begin,
@@ -2089,6 +2090,7 @@ AstTree *makeTypeOf(AstTree *value) {
case AST_TREE_TOKEN_KEYWORD_IF:
case AST_TREE_TOKEN_KEYWORD_WHILE:
case AST_TREE_TOKEN_SCOPE:
+ case AST_TREE_TOKEN_VALUE_NULL:
case AST_TREE_TOKEN_NONE:
}
UNREACHABLE;
@@ -2478,7 +2480,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
return setTypesOperatorInfixWithRet(tree, &AST_TREE_BOOL_TYPE, helper);
case AST_TREE_TOKEN_OPERATOR_POINTER:
- return setTypesOperatorIndirection(tree, helper);
+ return setTypesOperatorPointer(tree, helper);
case AST_TREE_TOKEN_VARIABLE_DEFINE:
return setTypesVariableDefine(tree, helper);
case AST_TREE_TOKEN_KEYWORD_IF:
@@ -2643,10 +2645,11 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
bool setTypesValueNull(AstTree *tree, AstTreeSetTypesHelper helper) {
if (helper.lookingType == NULL) {
+ printError(tree->str_begin, tree->str_end, "Can't find type of null");
return false;
}
- tree->type = getValue(helper.lookingType, helper);
- return tree->type != NULL;
+ tree->type = copyAstTree(helper.lookingType);
+ return true;
}
bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) {
@@ -2898,11 +2901,13 @@ bool setTypesOperatorUnary(AstTree *tree, AstTreeSetTypesHelper helper) {
}
}
-bool setTypesOperatorIndirection(AstTree *tree, AstTreeSetTypesHelper helper) {
+bool setTypesOperatorPointer(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTreeSingleChild *metadata = tree->metadata;
if (!setAllTypes(metadata, helper, NULL)) {
return false;
} else if (!typeIsEqual(metadata->type, &AST_TREE_TYPE_TYPE)) {
+ printError(tree->str_begin, tree->str_end, "Pointer type needs a type");
+ return false;
UNREACHABLE;
}
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index dd845a2..33cf9da 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -257,7 +257,7 @@ bool setTypesOperatorInfix(AstTree *tree, AstTreeSetTypesHelper helper);
bool setTypesOperatorInfixWithRet(AstTree *tree, AstTree *retType,
AstTreeSetTypesHelper helper);
bool setTypesOperatorUnary(AstTree *tree, AstTreeSetTypesHelper helper);
-bool setTypesOperatorIndirection(AstTree *tree, AstTreeSetTypesHelper helper);
+bool setTypesOperatorPointer(AstTree *tree, AstTreeSetTypesHelper helper);
bool setTypesVariableDefine(AstTree *tree, AstTreeSetTypesHelper helper);
bool setTypesIf(AstTree *tree, AstTreeSetTypesHelper helper,
AstTreeFunction *function);
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 327fab2..3c40af1 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -1617,6 +1617,7 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_KEYWORD_IF:
case PARSER_TOKEN_KEYWORD_COMPTIME:
case PARSER_TOKEN_OPERATOR_POINTER:
+ case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
return true;
case PARSER_TOKEN_KEYWORD_NULL:
case PARSER_TOKEN_CONSTANT:
@@ -1624,7 +1625,6 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_SYMBOL_EOL:
- case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
case PARSER_TOKEN_SYMBOL_COMMA:
case PARSER_TOKEN_VALUE_INT:
case PARSER_TOKEN_VALUE_FLOAT:
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 28270ea..f120816 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -328,7 +328,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages,
}
case AST_TREE_TOKEN_VARIABLE_DEFINE: {
AstTreeVariable *variable = expr->metadata;
- runnerVariableSetValue(pages, variable, copyAstTree(variable->value));
+ runnerVariableSetValue(pages, variable,
+ runExpression(variable->value, pages, shouldRet));
return &AST_TREE_VOID_VALUE;
}
case AST_TREE_TOKEN_KEYWORD_IF: {