aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--code/file.felan134
-rw-r--r--code/main.felan73
-rw-r--r--src/compiler/ast-tree.c7
-rw-r--r--src/compiler/lexer.c6
-rw-r--r--src/compiler/lexer.h2
-rw-r--r--src/compiler/parser.c2
-rw-r--r--src/compiler/parser.h1
8 files changed, 31 insertions, 198 deletions
diff --git a/Makefile b/Makefile
index d9f18bf..62214dc 100644
--- a/Makefile
+++ b/Makefile
@@ -20,9 +20,9 @@ INC_DIRS := $(SRC_DIR)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
# OP_FLAG := -Ofast
-OP_FLAG := -O3
+# OP_FLAG := -O3
# OP_FLAG := -Oz
-# OP_FLAG := -g
+OP_FLAG := -g
# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -DPRINT_STATISTICS -DPRINT_COMPILE_TREE $(OP_FLAG)
CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -DPRINT_STATISTICS $(OP_FLAG)
diff --git a/code/file.felan b/code/file.felan
index 715c8db..64661b5 100644
--- a/code/file.felan
+++ b/code/file.felan
@@ -1,133 +1,3 @@
-/*
-@import("basic.felan");
-
-print :: (value:[]u8)->void{
- i :u64 = 0;
- while i < value.length {
- putc value[i];
- i += @cast(1,u64);
- }
+foo :: () -> void {
+ putc 'a';
};
-
-print :: (value:i64)->void{
- value := value;
- str : [20]u8 = undefined;
- i :u64= 19;
- while {
- str[i] = @cast(value % 10,u8) + '0';
- i -= @cast(1,u64);
- value /= 10;
- value != 0;
- } {}
-
- j :u64= i+@cast(1,u64);
- while j < @cast(20,u64) {
- putc str[j];
- j += @cast(1,u64);
- }
-};
-
-println :: (value:i64)->void{
- print(value);
- putc '\n';
-};
-
-println :: ()->void{
- putc '\n';
-};
-
-main :: () -> void {
- stones := 6;
- player := 1;
- while stones != 0 {
- c := choose_ai(stones);
- print("player: ");
- print(player);
- print(" ---------\n");
- println(stones);
- println(c);
-
- if (stones == 2 || stones == 1) && stones == c {
- print("player: ");
- print(player);
- print(" won\n");
- }
-
- stones -= c;
-
- player = (if (player == 1) 2 else 1);
- }
-};
-
-choose_ai :: (stones_left:i64) -> i64 {
- return (if (stones_left % 3 == 0) 1 else stones_left % 3);
-};
-*/
-@import("basic.felan");
-
-main :: () -> void {
- stones := 6;
- player := 1;
- while stones > 0 {
- r :res =minimax(stones,true);
- stones -= r.move;
- putc @cast(stones,u8) + '0';
- putc '\n';
- putc 'p';
- putc @cast(player,u8) + '0';
- putc '\n';
- player = (if player == 2 1 else 2);
- }
-};
-
-res :: struct {
- move : i64;
- score : i64;
-};
-
-minimax :: (currentStones:i64, isMaximizing:bool) -> res {
- if currentStones <= 0 {
- r : res = undefined;
- r.move = 0;
- r.score = (if isMaximizing {-1;} else {1;});
- return r;
- }
-
- found := false;
- bestMove : res = undefined;
- score := (if isMaximizing {-1000000;} else {1000000;});
- move := 1;
-
- while move <= 2 {
- if currentStones - move >= 0 {
- found = true;
- result := minimax(currentStones - move, !isMaximizing);
- if isMaximizing {
- if result.score > score {
- bestMove.move = move;
- bestMove.score = result.score;
- score = result.score;
- }
- }else{
- if result.score < score {
- bestMove.move = move;
- bestMove.score = result.score;
- score = result.score;
- }
- }
- }
- move += 1;
- }
-
- if !found {
- r : res = undefined;
- r.move = 0;
- r.score = (if isMaximizing {-1;} else {1;});
- return r;
- }
-
- return bestMove;
-};
-
-
-
diff --git a/code/main.felan b/code/main.felan
index e2c056b..7f9b130 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,68 +1,25 @@
@import("basic.felan");
+file :: @import("file.felan");
-main :: () -> void {
- stones := 6;
- player := 1;
- while stones > 0 {
- r :res =minimax(stones,true);
- stones -= r.move;
- putc @cast(stones,u8) + '0';
- putc '\n';
- putc 'p';
- putc @cast(player,u8) + '0';
- putc '\n';
- player = (if player == 2 1 else 2);
- }
+foo :: () -> void {
+ putc 'b';
};
-res :: struct {
- move : i64;
- score : i64;
+main :: () -> void {
+ file.foo();
+// foo();
};
-minimax :: (currentStones:i64, isMaximizing:bool) -> res {
- if currentStones <= 0 {
- r : res = undefined;
- r.move = 0;
- r.score = (if isMaximizing {-1;} else {1;});
- return r;
- }
-
- found := false;
- bestMove : res = undefined;
- score := (if isMaximizing {-1000000;} else {1000000;});
- move := 1;
- while move <= 2 {
- if currentStones - move >= 0 {
- found = true;
- result : res = minimax(currentStones - move, !isMaximizing);
- if isMaximizing {
- if result.score > score {
- bestMove.move = move;
- bestMove.score = result.score;
- score = result.score;
- }
- }else{
- if result.score < score {
- bestMove.move = move;
- bestMove.score = result.score;
- score = result.score;
- }
- }
- }
- move += 1;
- }
+/*
+@import("basic.felan");
- if !found {
- r : res = undefined;
- r.move = 0;
- r.score = (if isMaximizing {-1;} else {1;});
- return r;
+main :: () -> void {
+ i := 0;
+ while i < 10 {
+ putc @cast(i,u8)+'0';
+ i += 1;
+// break;
}
-
- return bestMove;
};
-
-
-
+*/
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 57f0568..1d0613b 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -4765,9 +4765,7 @@ bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper _helper,
astTreeDelete(helper.lookingType);
return false;
}
- if (helper.lookingType != function->returnType) {
- astTreeDelete(helper.lookingType);
- }
+ astTreeDelete(helper.lookingType);
if (!typeIsEqual(metadata->value->type, function->returnType)) {
printError(tree->str_begin, tree->str_end, "Type mismatch");
return false;
@@ -5530,7 +5528,7 @@ bool setTypesOperatorAccess(AstTree *tree, AstTreeSetTypesHelper helper) {
"Member not found");
return false;
} else if (typeIsEqual(metadata->object->type, &AST_TREE_NAMESPACE_TYPE)) {
- AstTree *value = getValue(metadata->object, false);
+ AstTree *value = getValue(metadata->object, true);
AstTreeNamespace *namespace = value->metadata;
AstTreeSetTypesHelper newHelper = {
.root = helper.root->imports[namespace->importedIndex].root,
@@ -5539,6 +5537,7 @@ bool setTypesOperatorAccess(AstTree *tree, AstTreeSetTypesHelper helper) {
.dependencies = helper.dependencies,
.lookingType = helper.lookingType,
};
+ astTreeDelete(value);
AstTreeVariable *var =
setTypesFindVariable(metadata->member.name.begin,
diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c
index c540395..517e650 100644
--- a/src/compiler/lexer.c
+++ b/src/compiler/lexer.c
@@ -99,6 +99,7 @@ const char *LEXER_TOKEN_STRINGS[] = {
"LEXER_TOKEN_KEYWORD_RETURN",
"LEXER_TOKEN_KEYWORD_PUTC",
+ "LEXER_TOKEN_KEYWORD_BREAK",
"LEXER_TOKEN_KEYWORD_COMPTIME",
"LEXER_TOKEN_SYMBOL_EOL",
@@ -170,7 +171,7 @@ static const char *LEXER_KEYWORD_STRINGS[] = {
"f32", "f64", "f128", "bool", "putc", "return",
"true", "false", "if", "else", "while", "comptime",
"null", "struct", "undefined", "code", "lazy", "namespace",
- "shape_shifter",
+ "shape_shifter", "break",
};
static const LexerToken LEXER_KEYWORD_TOKENS[] = {
LEXER_TOKEN_KEYWORD_TYPE,
@@ -205,6 +206,7 @@ static const LexerToken LEXER_KEYWORD_TOKENS[] = {
LEXER_TOKEN_KEYWORD_LAZY,
LEXER_TOKEN_KEYWORD_NAMESPACE,
LEXER_TOKEN_KEYWORD_SHAPE_SHIFTER,
+ LEXER_TOKEN_KEYWORD_BREAK,
};
static const size_t LEXER_KEYWORD_SIZE =
sizeof(LEXER_KEYWORD_TOKENS) / sizeof(*LEXER_KEYWORD_TOKENS);
@@ -518,6 +520,8 @@ lexerPushClear(LexerNodeArray *array, size_t *array_size, char const *iter,
case LEXER_TOKEN_BUILTIN_SMALLER_OR_EQUAL:
case LEXER_TOKEN_SYMBOL_CLOSE_BRACKET:
case LEXER_TOKEN_SYMBOL_OPEN_BRACKET:
+ case LEXER_TOKEN_KEYWORD_SHAPE_SHIFTER:
+ case LEXER_TOKEN_KEYWORD_BREAK:
if (*array_size == array->size) {
*array_size += 1 + *array_size / 2;
array->data =
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
index 4286f20..641e7c8 100644
--- a/src/compiler/lexer.h
+++ b/src/compiler/lexer.h
@@ -6,7 +6,6 @@
typedef enum LexerToken {
LEXER_TOKEN_SYMBOL_CLOSE_CURLY_BRACKET,
-
LEXER_TOKEN_ORDER0 = LEXER_TOKEN_SYMBOL_CLOSE_CURLY_BRACKET,
LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS,
@@ -112,6 +111,7 @@ typedef enum LexerToken {
LEXER_TOKEN_KEYWORD_RETURN,
LEXER_TOKEN_ORDER11 = LEXER_TOKEN_KEYWORD_RETURN,
LEXER_TOKEN_KEYWORD_PUTC,
+ LEXER_TOKEN_KEYWORD_BREAK,
LEXER_TOKEN_KEYWORD_COMPTIME,
LEXER_TOKEN_SYMBOL_EOL,
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 1fd2e06..ebfd66f 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -60,6 +60,7 @@ const char *PARSER_TOKEN_STRINGS[] = {
"PARSER_TOKEN_TYPE_SHAPE_SHIFTER",
"PARSER_TOKEN_KEYWORD_PUTC",
+ "PARSER_TOKEN_KEYWORD_BREAK",
"PARSER_TOKEN_KEYWORD_RETURN",
"PARSER_TOKEN_KEYWORD_IF",
"PARSER_TOKEN_KEYWORD_WHILE",
@@ -1443,6 +1444,7 @@ ParserNode *parserFunctionCall(LexerNode *closing, LexerNode *begin,
if (beforeNode < begin || beforeNode->parserNode == NULL ||
(before = getUntilCommonParent(beforeNode->parserNode, parent)) == NULL ||
!isExpression(before)) {
+ printError(closing->str_begin, closing->str_end, "Bad function call");
UNREACHABLE;
}
diff --git a/src/compiler/parser.h b/src/compiler/parser.h
index a6af8bb..4a1b5ac 100644
--- a/src/compiler/parser.h
+++ b/src/compiler/parser.h
@@ -57,6 +57,7 @@ typedef enum ParserToken {
PARSER_TOKEN_TYPE_SHAPE_SHIFTER,
PARSER_TOKEN_KEYWORD_PUTC,
+ PARSER_TOKEN_KEYWORD_BREAK,
PARSER_TOKEN_KEYWORD_RETURN,
PARSER_TOKEN_KEYWORD_IF,
PARSER_TOKEN_KEYWORD_WHILE,