From 0021ce04ac1a767cd2beb31536d918ca94985ca6 Mon Sep 17 00:00:00 2001 From: Masashi Date: Fri, 19 Dec 2025 21:07:07 +0530 Subject: [PATCH] bitwise --- compile.sh | 2 +- compile_and_run.sh | 2 +- soup/client.c | 13 ++---- src/ast.rs | 2 + src/c_ir.rs | 4 ++ src/c_lowerer/statements_transpiler.rs | 2 + src/lexer/mod.rs | 6 +++ src/parser.rs | 48 +++++++++++++++++++++- src/typechecker.rs | 2 +- tests/arrays.o | Bin 75328 -> 75688 bytes tests/bitwise.c | 54 +++++++++++++++++++++++++ tests/bitwise.sui | 14 +++++++ 12 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 tests/bitwise.c create mode 100644 tests/bitwise.sui diff --git a/compile.sh b/compile.sh index 09e2f22..ec128e1 100755 --- a/compile.sh +++ b/compile.sh @@ -67,7 +67,7 @@ ODE_LIBS=$(pkg-config --libs ode 2>/dev/null || echo "-lode -lm") # Compile C to executable with libsuicmez, raylib, and ODE support echo "Compiling C code and linking with libsuicmez, raylib, and ODE..." -gcc $OPTIMIZE_FLAG -I. -Ilibfishsoup/include "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c libfishsoup/src/*.c $RAYLIB_CFLAGS $RAYLIB_LIBS $ODE_CFLAGS $ODE_LIBS -lm -o "$OUTPUT_BINARY" || exit 1 +gcc $OPTIMIZE_FLAG -I. -Ilibfishsoup/include "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c libfishsoup/src/*.c $RAYLIB_CFLAGS $ODE_CFLAGS -o "$OUTPUT_BINARY" $RAYLIB_LIBS $ODE_LIBS -lz -lm || exit 1 echo "✓ Successfully created: $OUTPUT_BINARY" echo " Run with: ./$OUTPUT_BINARY" diff --git a/compile_and_run.sh b/compile_and_run.sh index 57051f8..d15df76 100755 --- a/compile_and_run.sh +++ b/compile_and_run.sh @@ -78,7 +78,7 @@ RAYLIB_LIBS=$(pkg-config --libs raylib 2>/dev/null || echo "-lraylib -lm") ODE_CFLAGS=$(pkg-config --cflags ode 2>/dev/null || echo "-I/usr/include") ODE_LIBS=$(pkg-config --libs ode 2>/dev/null || echo "-lode -lm") -if ! gcc $OPTIMIZE_FLAG -I. -Ilibfishsoup/include "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c libfishsoup/src/*.c $RAYLIB_CFLAGS $RAYLIB_LIBS $ODE_CFLAGS $ODE_LIBS -lm -o "$OUTPUT_BINARY" 2>&1; then +if ! gcc $OPTIMIZE_FLAG -I. -Ilibfishsoup/include "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c libfishsoup/src/*.c $RAYLIB_CFLAGS $ODE_CFLAGS -o "$OUTPUT_BINARY" $RAYLIB_LIBS $ODE_LIBS -lz -lm 2>&1; then echo "" echo "✗ C compilation failed" exit 1 diff --git a/soup/client.c b/soup/client.c index 9707ff4..65dde12 100644 --- a/soup/client.c +++ b/soup/client.c @@ -29,19 +29,12 @@ int suic_main(void); int suic_main(void) { - char* GAME_NAME = suic_alloc_array(NULL, sizeof(char), 5, "Soup"); - char* GAME_VERSION = suic_alloc_array(NULL, sizeof(char), 6, "0.1.0"); - int WINDOW_WIDTH = 1280; - int WINDOW_HEIGHT = 720; - char* WINDOW_TITLE = suic_alloc_array(NULL, sizeof(char), 27, "Soup - Voxel Battle Royale"); - char* SERVER_HOST = suic_alloc_array(NULL, sizeof(char), 10, "127.0.0.1"); - int SERVER_PORT = 8888; - suic_init_window(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE); + suic_init_window(1280, 720, suic_alloc_array(NULL, sizeof(char), 27, "Soup - Voxel Battle Royale")); suic_enable_msaa_4x(); int current_screen = 0; char* player_name = suic_alloc_array(NULL, sizeof(char), 7, "Player"); - char* server_host = SERVER_HOST; - int server_port = SERVER_PORT; + char* server_host = suic_alloc_array(NULL, sizeof(char), 10, "127.0.0.1"); + int server_port = 8888; suic_show_fps_meter((suic_vec2){ .x = 10.000000, .y = 10.000000 }); while ((suic_window_should_close() == false)) { suic_begin_drawing(); diff --git a/src/ast.rs b/src/ast.rs index 518c18d..c4008c5 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -260,6 +260,8 @@ pub enum BinOp { Mod, And, Or, + BitwiseAnd, + BitwiseOr, Eq, Neq, Lt, diff --git a/src/c_ir.rs b/src/c_ir.rs index ec173e8..15e5ea0 100644 --- a/src/c_ir.rs +++ b/src/c_ir.rs @@ -114,6 +114,8 @@ pub enum CBinaryOp { Geq, And, Or, + BitwiseAnd, + BitwiseOr, } impl CBinaryOp { @@ -132,6 +134,8 @@ impl CBinaryOp { CBinaryOp::Geq => ">=", CBinaryOp::And => "&&", CBinaryOp::Or => "||", + CBinaryOp::BitwiseAnd => "&", + CBinaryOp::BitwiseOr => "|", } } } diff --git a/src/c_lowerer/statements_transpiler.rs b/src/c_lowerer/statements_transpiler.rs index 9f4a1a9..fdf35c5 100644 --- a/src/c_lowerer/statements_transpiler.rs +++ b/src/c_lowerer/statements_transpiler.rs @@ -454,6 +454,8 @@ impl StatementsTranspiler { BinOp::Geq => Ok(CBinaryOp::Geq), BinOp::And => Ok(CBinaryOp::And), BinOp::Or => Ok(CBinaryOp::Or), + BinOp::BitwiseAnd => Ok(CBinaryOp::BitwiseAnd), + BinOp::BitwiseOr => Ok(CBinaryOp::BitwiseOr), } } diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index 7cf5825..cb73cf5 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -204,6 +204,12 @@ pub enum Token { #[token("or")] Or, + #[token("bitand")] + BitAnd, + + #[token("bitor")] + BitOr, + #[token("xor")] Xor, diff --git a/src/parser.rs b/src/parser.rs index dd9e92c..0f87e82 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1114,13 +1114,13 @@ impl Parser { } fn parse_and_expr(&mut self) -> Result { - let mut left = self.parse_eq_expr()?; + let mut left = self.parse_bitwise_or_expr()?; loop { if matches!(self.peek(), Some(Token::And)) { let start = left.span.start; self.next(); - let right = self.parse_eq_expr()?; + let right = self.parse_bitwise_or_expr()?; let end = right.span.end; left = Expr { kind: ExprKind::BinOp(Box::new(left), BinOp::And, Box::new(right)), @@ -1135,6 +1135,50 @@ impl Parser { Ok(left) } + fn parse_bitwise_or_expr(&mut self) -> Result { + let mut left = self.parse_bitwise_and_expr()?; + + loop { + if matches!(self.peek(), Some(Token::BitOr)) { + let start = left.span.start; + self.next(); + let right = self.parse_bitwise_and_expr()?; + let end = right.span.end; + left = Expr { + kind: ExprKind::BinOp(Box::new(left), BinOp::BitwiseOr, Box::new(right)), + span: Span::new(&(start..end), self.file.clone()), + attributes: Vec::new(), + }; + } else { + break; + } + } + + Ok(left) + } + + fn parse_bitwise_and_expr(&mut self) -> Result { + let mut left = self.parse_eq_expr()?; + + loop { + if matches!(self.peek(), Some(Token::BitAnd)) { + let start = left.span.start; + self.next(); + let right = self.parse_eq_expr()?; + let end = right.span.end; + left = Expr { + kind: ExprKind::BinOp(Box::new(left), BinOp::BitwiseAnd, Box::new(right)), + span: Span::new(&(start..end), self.file.clone()), + attributes: Vec::new(), + }; + } else { + break; + } + } + + Ok(left) + } + fn parse_eq_expr(&mut self) -> Result { let mut left = self.parse_comp_expr()?; diff --git a/src/typechecker.rs b/src/typechecker.rs index d1a2b2b..e1c21fe 100644 --- a/src/typechecker.rs +++ b/src/typechecker.rs @@ -1840,7 +1840,7 @@ impl TypeChecker { let typed_right = self.typecheck_expr(right)?; let result_type = match op { - BinOp::Add | BinOp::Sub | BinOp::Mul | BinOp::Div | BinOp::Mod => { + BinOp::Add | BinOp::Sub | BinOp::Mul | BinOp::Div | BinOp::Mod | BinOp::BitwiseAnd | BinOp::BitwiseOr => { if !self.types_compatible(&typed_left.ty, &typed_right.ty) { return Err(TypeError { kind: TypeErrorKind::TypeMismatch( diff --git a/tests/arrays.o b/tests/arrays.o index f33660a6448dafc81c2ef9d00f69e9830646480d..ec5d2dde62de12d7dd39bf7d437347aff1ecbaa8 100755 GIT binary patch delta 21799 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 G9PqzLywN=X diff --git a/tests/bitwise.c b/tests/bitwise.c new file mode 100644 index 0000000..5e95ea6 --- /dev/null +++ b/tests/bitwise.c @@ -0,0 +1,54 @@ +#include "libsuicmez/libsuicmez.h" +#include +#include +#include +#include + +void* gc_alloc(const TypeInfo* type, size_t size); +void gc_init(void); +void gc_shutdown(void); + +// Helper for allocating arrays +static void* suic_alloc_array(const TypeInfo* type, size_t elem_size, size_t len, void* init_data) { + void* ptr = gc_alloc(type, elem_size * len); + if (init_data) memcpy(ptr, init_data, elem_size * len); + return ptr; +} + +// Helper for allocating structs +static void* suic_alloc_struct(const TypeInfo* type, size_t size, void* init_data) { + void* ptr = gc_alloc(type, size); + if (init_data) memcpy(ptr, init_data, size); + return ptr; +} + + + + +int test_bitwise(void); +int suic_main(void); + + +int test_bitwise(void) { + int a = 5; + int b = 3; + int and_result = (a & b); + int or_result = (a | b); + return (and_result + or_result); +} + +int suic_main(void) { + return test_bitwise(); +} + +int main(int argc, char* argv[]) { + // Initialize GC + gc_init(); + // init globals + // init event loop + int result = suic_main(); + // Shutdown GC + gc_shutdown(); + return result; +} + diff --git a/tests/bitwise.sui b/tests/bitwise.sui new file mode 100644 index 0000000..a520b72 --- /dev/null +++ b/tests/bitwise.sui @@ -0,0 +1,14 @@ +# Test bitwise operations +fn test_bitwise() -> int do + let a = 5; # 0b0101 + let b = 3; # 0b0011 + + let and_result = a bitand b; # Should be 1 (0b0001) + let or_result = a bitor b; # Should be 7 (0b0111) + + and_result + or_result # Should be 8 +end + +fn main() -> int do + test_bitwise() +end \ No newline at end of file