diff --git a/README.md b/README.md index 575f07a..17ab0d0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ func main[] : I64 io.print("Too high!") ``` -## Quick Start +## Quickstart ``` cargo install --git https://github.com/antpiasecki/zern zern -m -r hello.zr diff --git a/examples/raylib.zr b/examples/raylib.zr index e394609..fe07bdb 100644 --- a/examples/raylib.zr +++ b/examples/raylib.zr @@ -1,42 +1,40 @@ -// musl doesnt like dlopen, needs to be compiled with -m +// musl doesnt like dlopen, needs to be compiled with -m -C="/usr/local/lib/libraylib.a -lm" func main[] : I64 - let rl: Ptr = c.dlopen("libraylib.so", 2) + extern InitWindow + extern SetTargetFPS + extern WindowShouldClose + extern BeginDrawing + extern EndDrawing + extern ClearBackground + extern CloseWindow + extern DrawRectangle + extern IsKeyDown - let rl.InitWindow: Ptr = c.dlsym(rl, "InitWindow") - let rl.SetTargetFPS: Ptr = c.dlsym(rl, "SetTargetFPS") - let rl.WindowShouldClose: Ptr = c.dlsym(rl, "WindowShouldClose") - let rl.BeginDrawing: Ptr = c.dlsym(rl, "BeginDrawing") - let rl.EndDrawing: Ptr = c.dlsym(rl, "EndDrawing") - let rl.ClearBackground: Ptr = c.dlsym(rl, "ClearBackground") - let rl.CloseWindow: Ptr = c.dlsym(rl, "CloseWindow") - let rl.DrawRectangle: Ptr = c.dlsym(rl, "DrawRectangle") - let rl.IsKeyDown: Ptr = c.dlsym(rl, "IsKeyDown") - - let rl.KEY_W: I64 = 87 - let rl.KEY_S: I64 = 83 - let rl.KEY_A: I64 = 65 - let rl.KEY_D: I64 = 68 + let KEY_W: I64 = 87 + let KEY_S: I64 = 83 + let KEY_A: I64 = 65 + let KEY_D: I64 = 68 let x: I64 = 200 let y: I64 = 200 - rl.InitWindow(800, 600, "Hello, World!") - rl.SetTargetFPS(60) + InitWindow(800, 600, "Hello, World!") + SetTargetFPS(60) - while !rl.WindowShouldClose() - if rl.IsKeyDown(rl.KEY_W) & 255 + while !WindowShouldClose() + if IsKeyDown(KEY_W) & 255 y = y - 10 - if rl.IsKeyDown(rl.KEY_S) & 255 + if IsKeyDown(KEY_S) & 255 y = y + 10 - if rl.IsKeyDown(rl.KEY_A) & 255 + if IsKeyDown(KEY_A) & 255 x = x - 10 - if rl.IsKeyDown(rl.KEY_D) & 255 + if IsKeyDown(KEY_D) & 255 x = x + 10 - rl.BeginDrawing() - rl.ClearBackground(0xffffffff) - rl.DrawRectangle(x, y, 100, 100, 0xff0000ff) - rl.EndDrawing() + BeginDrawing() + ClearBackground(0xffffffff) + DrawRectangle(x, y, 100, 100, 0xff0000ff) + EndDrawing() - rl.CloseWindow() \ No newline at end of file + CloseWindow() \ No newline at end of file diff --git a/src/analyzer.rs b/src/analyzer.rs index 8e9d7a8..bca64db 100644 --- a/src/analyzer.rs +++ b/src/analyzer.rs @@ -87,6 +87,7 @@ impl Analyzer { } Stmt::Break => {} Stmt::Continue => {} + Stmt::Extern(_) => {} } Ok(()) } diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index 1b03ef2..d48f190 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -281,6 +281,9 @@ _builtin_set64: // TODO: skips incrementing when used in a for loop emit!(&mut self.output, " jmp {}", env.loop_begin_label); } + Stmt::Extern(name) => { + emit!(&mut self.output, " extern {}", name.lexeme); + } } Ok(()) } diff --git a/src/parser.rs b/src/parser.rs index 26089a1..da26145 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -39,6 +39,7 @@ pub enum Stmt { Return(Expr), Break, Continue, + Extern(Token), } #[derive(Debug, Clone)] @@ -198,6 +199,10 @@ impl Parser { Ok(Stmt::Break) } else if self.match_token(&[TokenType::KeywordContinue]) { Ok(Stmt::Continue) + } else if self.match_token(&[TokenType::KeywordExtern]) { + Ok(Stmt::Extern( + self.consume(TokenType::Identifier, "expected extern name")?, + )) } else { Ok(Stmt::Expression(self.expression()?)) } diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 7224f0f..1c4e2cb 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -47,6 +47,7 @@ pub enum TokenType { KeywordReturn, KeywordBreak, KeywordContinue, + KeywordExtern, Indent, Dedent, @@ -334,6 +335,7 @@ impl Tokenizer { "return" => TokenType::KeywordReturn, "break" => TokenType::KeywordBreak, "continue" => TokenType::KeywordContinue, + "extern" => TokenType::KeywordExtern, "true" => TokenType::True, "false" => TokenType::False, _ => TokenType::Identifier,