diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-16 01:20:33 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-16 01:20:33 +0330 |
commit | 42eb5e5d3f10c3a9187dcf8edd7c023a3ea10dcd (patch) | |
tree | 78862ab27c3b1faf2d9ed5722bceb0264602bd1a | |
parent | 0b8d272292ca3f7fdb44efac65f012b484d962a2 (diff) |
fix access operator and some stuff to make break work
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | code/file.felan | 134 | ||||
-rw-r--r-- | code/main.felan | 73 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 7 | ||||
-rw-r--r-- | src/compiler/lexer.c | 6 | ||||
-rw-r--r-- | src/compiler/lexer.h | 2 | ||||
-rw-r--r-- | src/compiler/parser.c | 2 | ||||
-rw-r--r-- | src/compiler/parser.h | 1 |
8 files changed, 31 insertions, 198 deletions
@@ -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, |