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