aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-08-09 06:11:47 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-08-09 06:11:47 +0330
commit12b45f728905863adb2e727d6c9c406374675bea (patch)
treef05a3a9ec2d846e4c94de334e2d42b80c4daae5c
parent40881a903e00939b647cd85beeacfb8a68b31e6a (diff)
some clean up and attempts to add bbaHEADmaster
-rw-r--r--README.md1
-rw-r--r--code/lib/io.felan8
-rw-r--r--code/main.felan168
-rw-r--r--code/main2.felan210
-rw-r--r--src/backend/bba.c17
-rw-r--r--src/backend/bba.h8
-rw-r--r--src/compiler/ast-tree.c4
7 files changed, 189 insertions, 227 deletions
diff --git a/README.md b/README.md
index f1f4dbb..3c53931 100644
--- a/README.md
+++ b/README.md
@@ -68,6 +68,7 @@ main :: () -> void {
* ~Add code injection~
* ~Add macro~
* ~Fix scope bug in shape shifters~
+* Fix negative literals (convert from operator to pure literal)
* Add \u and \x to char
* Add vararg
* Add enum
diff --git a/code/lib/io.felan b/code/lib/io.felan
index d470331..daca38e 100644
--- a/code/lib/io.felan
+++ b/code/lib/io.felan
@@ -18,6 +18,14 @@ print_char :: (value:u8) -> void {
putchar(@cast(value,i32));
};
+print :: (value:[]u8) -> void {
+ i := 0u64;
+ while i < value.length {
+ print_char(value[i]);
+ i += 1u64;
+ }
+};
+
print :: (value:i8) -> void {
_print_signed(@type_of(value),value);
};
diff --git a/code/main.felan b/code/main.felan
index b8b41ec..1cb89ca 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,169 +1,19 @@
@import("basic.felan");
-raylib :: @c_library("/usr/lib/libraylib.so.5.5.0");
-InitWindow :: @c_function(raylib,"InitWindow",(i32,i32,*u8)->void);
-SetTargetFPS :: @c_function(raylib,"SetTargetFPS",(i32)->void);
-WindowShouldClose :: @c_function(raylib,"WindowShouldClose",()->bool);
-CloseWindow :: @c_function(raylib,"CloseWindow",()->void);
-BeginDrawing :: @c_function(raylib,"BeginDrawing",()->void);
-ClearBackground :: @c_function(raylib,"ClearBackground",(Color)->void);
-EndDrawing :: @c_function(raylib,"EndDrawing",()->void);
-IsKeyPressed :: @c_function(raylib,"IsKeyPressed",(i32)->bool);
-IsGestureDetected :: @c_function(raylib,"IsGestureDetected",(u32)->bool);
-DrawText :: @c_function(raylib,"DrawText",(*u8,i32,i32,i32,Color)->void);
-DrawRectangle :: @c_function(raylib,"DrawRectangle",(i32,i32,i32,i32,Color)->void);
-GetFPS :: @c_function(raylib,"GetFPS",()->i32);
-DrawLine :: @c_function(raylib,"DrawLine",(startPosX:i32,startPosY:i32,endPosX:i32,endPosY:i32,color:Color)->void);
+f :: (a:[]u8)->void{
+ i := 0u64;
-Color :: struct {
- r:u8;
- g:u8;
- b:u8;
- a:u8;
-};
-
-KEY_ENTER :: 257i32;
-
-GESTURE_TAP :: 1u32;
-
-LOGO :: 0;
-TITLE :: 1;
-GAMEPLAY :: 2;
-ENDING :: 3;
-
-SCREEN_WIDTH :: 800i32;
-SCREEN_HEIGHT :: 450i32;
-
-RAYWHITE :: color(245u8,245u8,245u8,255u8);
-LIGHTGRAY :: color(200u8,200u8,200u8,255u8);
-GRAY :: color(130u8,130u8,130u8,255u8);
-GREEN :: color(0u8,228u8,48u8,255u8);
-DARKGREEN :: color(0u8,117u8,44u8,255u8);
-BLUE :: color(0u8,121u8,241u8,255u8);
-DARKBLUE :: color(0u8,82u8,172u8,255u8);
-PURPLE :: color(200u8,122u8,255u8,255u8);
-MAROON :: color(100u8,33u8,55u8,255u8);
-
-main :: () -> void {
- title := "Hello\0";
-
- InitWindow(SCREEN_WIDTH,SCREEN_HEIGHT,title.ptr);
+ while i < a.length {
+ c := a[i];
+ if c == '{' {
- currentScreen := LOGO;
-
- framesCounter := 0i32;
-
- TARGET_FPS :: 144i32;
- SetTargetFPS(TARGET_FPS);
-
- while(!WindowShouldClose()){
- if currentScreen == LOGO {
- framesCounter += 1i32;
- if framesCounter > TARGET_FPS * 2i32 {
- currentScreen = TITLE;
- }
- } else if currentScreen == TITLE {
- if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
- currentScreen = GAMEPLAY;
- }
- } else if currentScreen == GAMEPLAY {
- if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
- currentScreen = ENDING;
- }
- } else if currentScreen == ENDING {
- if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
- currentScreen = TITLE;
- }
}
-
- BeginDrawing();
-
- if currentScreen == LOGO {
- drawLogo();
- } else if currentScreen == TITLE {
- ClearBackground(GREEN);
- title := "TITLE SCREEN\0";
- DrawText(title.ptr,20i32,20i32,40i32,DARKGREEN);
- text := "PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN\0";
- DrawText(text.ptr,120i32,220i32,20i32,DARKGREEN);
- } else if currentScreen == GAMEPLAY {
- drawGamePlay();
- } else if currentScreen == ENDING {
- ClearBackground(BLUE);
- title := "ENDING SCREEN\0";
- DrawText(title.ptr,20i32,20i32,40i32,DARKBLUE);
- text := "PRESS ENTER or TAP to RETURN to TITLE SCREEN\0";
- DrawText(text.ptr,120i32,220i32,20i32,DARKBLUE);
- } else {
- println(-1);
- return;
- }
-
- EndDrawing();
+ print_char(a[i]);
+ i += 1u64;
}
-
- CloseWindow();
};
-drawLogo :: () -> void {
- ClearBackground(RAYWHITE);
- title := "LOGO SCREEN\0";
- DrawText(title.ptr,20i32,20i32,40i32,LIGHTGRAY);
- text := "WAIT for 2 SECONDS...\0";
- DrawText(text.ptr,290i32,220i32,20i32,LIGHTGRAY);
-};
-
-x := 0i32;
-y := 0i32;
-
-dx := 1i32;
-dy := 1i32;
-
-RECT_SIZE :: 40i32;
-
-drawGamePlay :: () -> void {
- ClearBackground(PURPLE);
- title := "GAMEPLAY SCREEN\0";
- DrawText(title.ptr,20i32,20i32,40i32,MAROON);
- text := "PRESS ENTER or TAP to JUMP to ENDING SCREEN\0";
- DrawText(text.ptr,130i32,220i32,20i32,MAROON);
- DrawRectangle(x,y,RECT_SIZE,RECT_SIZE,MAROON);
- DrawLine(SCREEN_WIDTH/2i32,0i32,SCREEN_WIDTH/2i32,SCREEN_HEIGHT,MAROON);
-
- x += dx;
- y += dy;
- if x <= 0i32 {
- dx = 1i32;
- } else if x+RECT_SIZE >= SCREEN_WIDTH {
- dx = -1i32;
- }
-
- if y <= 0i32 {
- dy = 1i32;
- } else if y+RECT_SIZE >= SCREEN_HEIGHT {
- dy = -1i32;
- }
-};
-
-color :: (r:u8,g:u8,b:u8,a:u8)->Color {
- result:Color = undefined;
-
- result.r = r;
- result.g = g;
- result.b = b;
- result.a = a;
-
- return result;
+main :: () -> void {
+ f("Hello {a} How {b}");
};
-
-color :: (value : u32) -> Color {
- result:Color = undefined;
-
- result.r = @cast(value >> @cast(3*8,u32),u8);
- result.g = @cast(value >> @cast(2*8,u32),u8);
- result.b = @cast(value >> @cast(1*8,u32),u8);
- result.a = @cast(value >> @cast(0*8,u32),u8);
-
- return result;
-};
diff --git a/code/main2.felan b/code/main2.felan
index ffa3a5b..b8b41ec 100644
--- a/code/main2.felan
+++ b/code/main2.felan
@@ -1,15 +1,19 @@
@import("basic.felan");
-raylib :: @c_library("/lib/libraylib.so.5.5.0");
+raylib :: @c_library("/usr/lib/libraylib.so.5.5.0");
InitWindow :: @c_function(raylib,"InitWindow",(i32,i32,*u8)->void);
+SetTargetFPS :: @c_function(raylib,"SetTargetFPS",(i32)->void);
WindowShouldClose :: @c_function(raylib,"WindowShouldClose",()->bool);
-BeginDrawing :: @c_function(raylib,"BeginDrawing",()->void);
-EndDrawing :: @c_function(raylib,"EndDrawing",()->void);
CloseWindow :: @c_function(raylib,"CloseWindow",()->void);
+BeginDrawing :: @c_function(raylib,"BeginDrawing",()->void);
ClearBackground :: @c_function(raylib,"ClearBackground",(Color)->void);
+EndDrawing :: @c_function(raylib,"EndDrawing",()->void);
+IsKeyPressed :: @c_function(raylib,"IsKeyPressed",(i32)->bool);
+IsGestureDetected :: @c_function(raylib,"IsGestureDetected",(u32)->bool);
DrawText :: @c_function(raylib,"DrawText",(*u8,i32,i32,i32,Color)->void);
-// void DrawRectangle(int posX, int posY, int width, int height, Color color);
-DrawRectangle :: @c_function(raylib,"DrawRectangle",(posX:i32,posY:i32,width:i32,height:i32,color:Color)->void);
+DrawRectangle :: @c_function(raylib,"DrawRectangle",(i32,i32,i32,i32,Color)->void);
+GetFPS :: @c_function(raylib,"GetFPS",()->i32);
+DrawLine :: @c_function(raylib,"DrawLine",(startPosX:i32,startPosY:i32,endPosX:i32,endPosY:i32,color:Color)->void);
Color :: struct {
r:u8;
@@ -18,70 +22,148 @@ Color :: struct {
a:u8;
};
-main :: ()->void{
- b := "raylib [core] example - basic window\0";
- c := "Congrats! You created your first window!\0";
- str := &b[0];
- str2 := &c[0];
- screenWidth :i32: 800;
- screenHeight :i32: 450;
- a : u8 : 255;
- b : u8 : 0;
- WHITE :: color(a,a,a,a);
- BLACK :: color(@cast(0xff0000ff,u32));
- InitWindow(screenWidth,screenHeight,str);
- rect_posx :i32= 0;
- rect_posy :i32= 0;
- dx : i32 = 1;
- dy : i32 = 1;
- while !WindowShouldClose() {
- BeginDrawing();
- ClearBackground(WHITE);
- DrawRectangle(rect_posx,rect_posy,@cast(200,i32),@cast(40,i32),color(@cast(0x00ffff,u32)));
- DrawText(str2,@cast(190,i32),@cast(200,i32),@cast(20,i32),BLACK);
- EndDrawing();
- rect_posx += dx;
- rect_posy += dy;
- /*
- print(rect_posx);
- print_char(' ');
- print(rect_posy);
- print_char('\n');
- */
- if rect_posx >= screenWidth {
- print("hello");
- print(dx);
- print("\n");
- dx = @cast(-1,i32);
- }else if rect_posx < @cast(0,i32) {
- dx = @cast(1,i32);
+KEY_ENTER :: 257i32;
+
+GESTURE_TAP :: 1u32;
+
+LOGO :: 0;
+TITLE :: 1;
+GAMEPLAY :: 2;
+ENDING :: 3;
+
+SCREEN_WIDTH :: 800i32;
+SCREEN_HEIGHT :: 450i32;
+
+RAYWHITE :: color(245u8,245u8,245u8,255u8);
+LIGHTGRAY :: color(200u8,200u8,200u8,255u8);
+GRAY :: color(130u8,130u8,130u8,255u8);
+GREEN :: color(0u8,228u8,48u8,255u8);
+DARKGREEN :: color(0u8,117u8,44u8,255u8);
+BLUE :: color(0u8,121u8,241u8,255u8);
+DARKBLUE :: color(0u8,82u8,172u8,255u8);
+PURPLE :: color(200u8,122u8,255u8,255u8);
+MAROON :: color(100u8,33u8,55u8,255u8);
+
+main :: () -> void {
+ title := "Hello\0";
+
+ InitWindow(SCREEN_WIDTH,SCREEN_HEIGHT,title.ptr);
+
+ currentScreen := LOGO;
+
+ framesCounter := 0i32;
+
+ TARGET_FPS :: 144i32;
+ SetTargetFPS(TARGET_FPS);
+
+ while(!WindowShouldClose()){
+ if currentScreen == LOGO {
+ framesCounter += 1i32;
+ if framesCounter > TARGET_FPS * 2i32 {
+ currentScreen = TITLE;
+ }
+ } else if currentScreen == TITLE {
+ if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
+ currentScreen = GAMEPLAY;
+ }
+ } else if currentScreen == GAMEPLAY {
+ if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
+ currentScreen = ENDING;
+ }
+ } else if currentScreen == ENDING {
+ if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) {
+ currentScreen = TITLE;
+ }
}
- if rect_posy >= screenHeight {
- print("hi");
- print(dy);
- print("\n");
- dy = @cast(-@cast(1,i32),i32);
- }else if rect_posy < @cast(0,i32) {
- dy = @cast(1,i32);
+
+ BeginDrawing();
+
+ if currentScreen == LOGO {
+ drawLogo();
+ } else if currentScreen == TITLE {
+ ClearBackground(GREEN);
+ title := "TITLE SCREEN\0";
+ DrawText(title.ptr,20i32,20i32,40i32,DARKGREEN);
+ text := "PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN\0";
+ DrawText(text.ptr,120i32,220i32,20i32,DARKGREEN);
+ } else if currentScreen == GAMEPLAY {
+ drawGamePlay();
+ } else if currentScreen == ENDING {
+ ClearBackground(BLUE);
+ title := "ENDING SCREEN\0";
+ DrawText(title.ptr,20i32,20i32,40i32,DARKBLUE);
+ text := "PRESS ENTER or TAP to RETURN to TITLE SCREEN\0";
+ DrawText(text.ptr,120i32,220i32,20i32,DARKBLUE);
+ } else {
+ println(-1);
+ return;
}
+
+ EndDrawing();
}
+
CloseWindow();
};
-color :: (a:u8,r:u8,g:u8,b:u8)->Color{
- c : Color = undefined;
- c.r = r;
- c.g = g;
- c.b = b;
- c.a = a;
- return c;
+drawLogo :: () -> void {
+ ClearBackground(RAYWHITE);
+ title := "LOGO SCREEN\0";
+ DrawText(title.ptr,20i32,20i32,40i32,LIGHTGRAY);
+ text := "WAIT for 2 SECONDS...\0";
+ DrawText(text.ptr,290i32,220i32,20i32,LIGHTGRAY);
};
-color :: (value:u32)->Color{
- c : Color = undefined;
- c.r = @cast((value&@cast(0xff000000,u32))>>@cast(6*4,u32),u8);
- c.g = @cast((value&@cast(0x00ff0000,u32))>>@cast(4*4,u32),u8);
- c.b = @cast((value&@cast(0x0000ff00,u32))>>@cast(2*4,u32),u8);
- c.a = @cast((value&@cast(0x000000ff,u32))>>@cast(0*4,u32),u8);
- return c;
-}
+x := 0i32;
+y := 0i32;
+
+dx := 1i32;
+dy := 1i32;
+
+RECT_SIZE :: 40i32;
+
+drawGamePlay :: () -> void {
+ ClearBackground(PURPLE);
+ title := "GAMEPLAY SCREEN\0";
+ DrawText(title.ptr,20i32,20i32,40i32,MAROON);
+ text := "PRESS ENTER or TAP to JUMP to ENDING SCREEN\0";
+ DrawText(text.ptr,130i32,220i32,20i32,MAROON);
+ DrawRectangle(x,y,RECT_SIZE,RECT_SIZE,MAROON);
+ DrawLine(SCREEN_WIDTH/2i32,0i32,SCREEN_WIDTH/2i32,SCREEN_HEIGHT,MAROON);
+
+ x += dx;
+ y += dy;
+ if x <= 0i32 {
+ dx = 1i32;
+ } else if x+RECT_SIZE >= SCREEN_WIDTH {
+ dx = -1i32;
+ }
+
+ if y <= 0i32 {
+ dy = 1i32;
+ } else if y+RECT_SIZE >= SCREEN_HEIGHT {
+ dy = -1i32;
+ }
+};
+
+color :: (r:u8,g:u8,b:u8,a:u8)->Color {
+ result:Color = undefined;
+
+ result.r = r;
+ result.g = g;
+ result.b = b;
+ result.a = a;
+
+ return result;
+};
+
+
+color :: (value : u32) -> Color {
+ result:Color = undefined;
+
+ result.r = @cast(value >> @cast(3*8,u32),u8);
+ result.g = @cast(value >> @cast(2*8,u32),u8);
+ result.b = @cast(value >> @cast(1*8,u32),u8);
+ result.a = @cast(value >> @cast(0*8,u32),u8);
+
+ return result;
+};
diff --git a/src/backend/bba.c b/src/backend/bba.c
index fe156c6..64c2984 100644
--- a/src/backend/bba.c
+++ b/src/backend/bba.c
@@ -1 +1,18 @@
#include "bba.h"
+
+BBA makeBBA(AstTreeRoots roots) {
+ BBA bba;
+
+ for (size_t i = 0; i < roots.size; ++i) {
+ makeBBABack(&bba, roots.data[i]);
+ }
+
+ return bba;
+}
+
+bool makeBBABack(BBA *bba, AstTreeRoot *root){
+ for(size_t i = 0;i < root->variables.size;++i){
+ AstTreeVariable *variable = root->variables.data[i];
+
+ }
+}
diff --git a/src/backend/bba.h b/src/backend/bba.h
index 2e77d78..2fc5741 100644
--- a/src/backend/bba.h
+++ b/src/backend/bba.h
@@ -55,6 +55,7 @@ typedef enum BBAOperation {
typedef union BBAInstructionValue {
struct BBAInstruction *instruction;
+ struct BBABlock *block;
u8 u8;
i8 i8;
@@ -87,4 +88,11 @@ typedef struct BBABlock {
} BBABlock;
typedef struct BBA {
+ BBAInstructionValue *globals;
+ size_t globals_size;
+ BBABlock blocks;
+ size_t blocks_size;
} BBA;
+
+BBA makeBBA(AstTreeRoots roots);
+bool makeBBABack(BBA *bba, AstTreeRoot *root);
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 057e96d..bc19523 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -8220,10 +8220,6 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
}
}
if (variable.var == NULL) {
- printLog("%ld", helper.variables_size);
- for (size_t i = 0; i < helper.variables_size; ++i) {
- printLog("is %ld", helper.variables[i].size);
- }
printError(name_begin, name_end, "No candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;