extern statement

This commit is contained in:
2025-11-16 13:30:07 +01:00
parent 552a404d73
commit 5a41163ca1
6 changed files with 38 additions and 29 deletions

View File

@@ -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

View File

@@ -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()
CloseWindow()

View File

@@ -87,6 +87,7 @@ impl Analyzer {
}
Stmt::Break => {}
Stmt::Continue => {}
Stmt::Extern(_) => {}
}
Ok(())
}

View File

@@ -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(())
}

View File

@@ -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()?))
}

View File

@@ -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,