diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs
index 1bb7892..98738d9 100644
--- a/src/codegen_x86_64.rs
+++ b/src/codegen_x86_64.rs
@@ -514,9 +514,6 @@ _builtin_environ:
Stmt::Struct { .. } => {
// handled in SymbolTable
}
- Stmt::Enum { .. } => {
- // handled in SymbolTable
- }
}
Ok(())
}
diff --git a/src/parser.rs b/src/parser.rs
index b115c1f..c6a046d 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -77,10 +77,6 @@ pub enum Stmt {
name: Token,
fields: Vec,
},
- Enum {
- name: Token,
- variants: Vec,
- },
}
pub static NEXT_EXPR_ID: AtomicUsize = AtomicUsize::new(0);
@@ -195,9 +191,6 @@ impl Parser {
if self.match_token(&[TokenType::KeywordStruct]) {
return self.struct_declaration();
}
- if self.match_token(&[TokenType::KeywordEnum]) {
- return self.enum_declaration();
- }
return error!(
self.peek().loc,
"statements not allowed outside function body"
@@ -281,21 +274,6 @@ impl Parser {
Ok(Stmt::Struct { name, fields })
}
- fn enum_declaration(&mut self) -> Result {
- let name = self.consume(TokenType::Identifier, "expected enum name")?;
-
- self.consume(TokenType::Indent, "expected indent after enum name")?;
-
- let mut variants = vec![];
- while !self.eof() && !self.check(&TokenType::Dedent) {
- variants.push(self.consume(TokenType::Identifier, "expected variant name")?);
- }
-
- self.consume(TokenType::Dedent, "expected dedent after enum variants")?;
-
- Ok(Stmt::Enum { name, variants })
- }
-
fn const_declaration(&mut self) -> Result {
let name = self.consume(TokenType::Identifier, "expected const name")?;
self.consume(TokenType::Equal, "expected '=' after const name")?;
diff --git a/src/symbol_table.rs b/src/symbol_table.rs
index 6cd2876..163919d 100644
--- a/src/symbol_table.rs
+++ b/src/symbol_table.rs
@@ -144,16 +144,6 @@ impl SymbolTable {
self.structs.insert(name.lexeme.clone(), fields_map);
}
- Stmt::Enum { name, variants } => {
- // TODO: distinct enum types
- for (i, v) in variants.iter().enumerate() {
- let variant = format!("{}.{}", name.lexeme, v.lexeme);
- if self.is_name_defined(&variant) {
- return error!(name.loc, format!("tried to redefine '{}'", variant));
- }
- self.constants.insert(variant, i as i64);
- }
- }
_ => {}
}
Ok(())
diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index 0641cf2..2acd6af 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -58,7 +58,6 @@ pub enum TokenType {
KeywordStruct,
KeywordNew,
KeywordAs,
- KeywordEnum,
Indent,
Dedent,
@@ -395,7 +394,6 @@ impl Tokenizer {
"struct" => TokenType::KeywordStruct,
"new" => TokenType::KeywordNew,
"as" => TokenType::KeywordAs,
- "enum" => TokenType::KeywordEnum,
"true" => TokenType::True,
"false" => TokenType::False,
_ => TokenType::Identifier,
diff --git a/src/typechecker.rs b/src/typechecker.rs
index 5c51c25..668394d 100644
--- a/src/typechecker.rs
+++ b/src/typechecker.rs
@@ -361,7 +361,6 @@ impl<'a> TypeChecker<'a> {
}
}
}
- Stmt::Enum { .. } => {}
}
Ok(())
}
diff --git a/std/linux_constants.zr b/std/linux.zr
similarity index 97%
rename from std/linux_constants.zr
rename to std/linux.zr
index 6d41487..4b12050 100644
--- a/std/linux_constants.zr
+++ b/std/linux.zr
@@ -1,28 +1,4 @@
-const STDIN = 0
-const STDOUT = 1
-
-const SIGABRT = 6
-
-const AT_FDCWD = -100
-
-const S_IFDIR = 16384
-const S_IFMT = 61440
-
-const PROT_READ = 1
-const PROT_WRITE = 2
-
-const MAP_PRIVATE = 2
-const MAP_ANONYMOUS = 32
-
-const O_RDONLY = 0
-const O_WRONLY = 1
-const O_CREAT = 64
-const O_TRUNC = 512
-
-const SEEK_SET = 0
-const SEEK_END = 2
-
-const F_OK = 0
+include "std/posix.zr"
const SYS_read = 0
const SYS_write = 1
diff --git a/std/posix.zr b/std/posix.zr
new file mode 100644
index 0000000..2cb0993
--- /dev/null
+++ b/std/posix.zr
@@ -0,0 +1,27 @@
+const STDIN_FILENO = 0
+const STDOUT_FILENO = 1
+
+const SIGABRT = 6
+
+const AT_FDCWD = -100
+
+const S_IFDIR = 16384
+const S_IFMT = 61440
+
+const PROT_READ = 1
+const PROT_WRITE = 2
+
+const MAP_PRIVATE = 2
+const MAP_ANONYMOUS = 32
+
+const O_RDONLY = 0
+const O_WRONLY = 1
+const O_CREAT = 64
+const O_TRUNC = 512
+
+const SEEK_SET = 0
+const SEEK_END = 2
+
+const F_OK = 0
+
+const CLOCK_REALTIME = 0
diff --git a/std/std.zr b/std/std.zr
index 92112ef..6f6ed0c 100644
--- a/std/std.zr
+++ b/std/std.zr
@@ -1,4 +1,4 @@
-include "std/linux_constants.zr"
+include "std/linux.zr"
func panic[msg: str] : void
io.print("PANIC: ")
@@ -265,7 +265,7 @@ func io.printf[..] : void
s += 1
func io.print_sized[x: ptr, size: i64] : void
- _builtin_syscall(SYS_write, STDOUT, x, size)
+ _builtin_syscall(SYS_write, STDOUT_FILENO, x, size)
func io.print[x: str] : void
io.print_sized(x as ptr, x->len())
@@ -381,7 +381,7 @@ func f64.to_str_buf[x: i64, buf: ptr] : void
func io.read_char[] : u8
c := 0 as u8
- _builtin_syscall(SYS_read, STDIN, ^c, 1)
+ _builtin_syscall(SYS_read, STDIN_FILENO, ^c, 1)
return c
func io.read_line[] : str
@@ -1157,6 +1157,12 @@ func os.sleep[ms: i64] : void
req->tv_nsec = (ms % 1000) * 1000000
_builtin_syscall(SYS_nanosleep, req, 0)
+func os.time[] : i64
+ ts := new os.Timespec
+ _builtin_syscall(SYS_clock_gettime, CLOCK_REALTIME, ts)
+ out := ts->tv_sec * 1000 + ts->tv_nsec / 1000000
+ return out
+
func os.urandom_buf[buf: ptr, n: i64] : void
pos := 0
while pos < n
@@ -1175,16 +1181,6 @@ func os.urandom_i64[] : i64
os.urandom_buf(^n, 8)
return n
-struct os.Timeval
- tv_sec: i64
- tv_usec: i64
-
-func os.time[] : i64
- tv := new os.Timeval
- _builtin_syscall(SYS_gettimeofday, tv, 0)
- out := tv->tv_sec * 1000 + tv->tv_usec / 1000
- return out
-
func os.run_shell_command[command: str] : i64, bool
pid := _builtin_syscall(SYS_fork)
if pid < 0