remove enums
This commit is contained in:
@@ -514,9 +514,6 @@ _builtin_environ:
|
|||||||
Stmt::Struct { .. } => {
|
Stmt::Struct { .. } => {
|
||||||
// handled in SymbolTable
|
// handled in SymbolTable
|
||||||
}
|
}
|
||||||
Stmt::Enum { .. } => {
|
|
||||||
// handled in SymbolTable
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,10 +77,6 @@ pub enum Stmt {
|
|||||||
name: Token,
|
name: Token,
|
||||||
fields: Vec<Param>,
|
fields: Vec<Param>,
|
||||||
},
|
},
|
||||||
Enum {
|
|
||||||
name: Token,
|
|
||||||
variants: Vec<Token>,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub static NEXT_EXPR_ID: AtomicUsize = AtomicUsize::new(0);
|
pub static NEXT_EXPR_ID: AtomicUsize = AtomicUsize::new(0);
|
||||||
@@ -195,9 +191,6 @@ impl Parser {
|
|||||||
if self.match_token(&[TokenType::KeywordStruct]) {
|
if self.match_token(&[TokenType::KeywordStruct]) {
|
||||||
return self.struct_declaration();
|
return self.struct_declaration();
|
||||||
}
|
}
|
||||||
if self.match_token(&[TokenType::KeywordEnum]) {
|
|
||||||
return self.enum_declaration();
|
|
||||||
}
|
|
||||||
return error!(
|
return error!(
|
||||||
self.peek().loc,
|
self.peek().loc,
|
||||||
"statements not allowed outside function body"
|
"statements not allowed outside function body"
|
||||||
@@ -281,21 +274,6 @@ impl Parser {
|
|||||||
Ok(Stmt::Struct { name, fields })
|
Ok(Stmt::Struct { name, fields })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn enum_declaration(&mut self) -> Result<Stmt, ZernError> {
|
|
||||||
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<Stmt, ZernError> {
|
fn const_declaration(&mut self) -> Result<Stmt, ZernError> {
|
||||||
let name = self.consume(TokenType::Identifier, "expected const name")?;
|
let name = self.consume(TokenType::Identifier, "expected const name")?;
|
||||||
self.consume(TokenType::Equal, "expected '=' after const name")?;
|
self.consume(TokenType::Equal, "expected '=' after const name")?;
|
||||||
|
|||||||
@@ -144,16 +144,6 @@ impl SymbolTable {
|
|||||||
|
|
||||||
self.structs.insert(name.lexeme.clone(), fields_map);
|
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(())
|
Ok(())
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ pub enum TokenType {
|
|||||||
KeywordStruct,
|
KeywordStruct,
|
||||||
KeywordNew,
|
KeywordNew,
|
||||||
KeywordAs,
|
KeywordAs,
|
||||||
KeywordEnum,
|
|
||||||
|
|
||||||
Indent,
|
Indent,
|
||||||
Dedent,
|
Dedent,
|
||||||
@@ -395,7 +394,6 @@ impl Tokenizer {
|
|||||||
"struct" => TokenType::KeywordStruct,
|
"struct" => TokenType::KeywordStruct,
|
||||||
"new" => TokenType::KeywordNew,
|
"new" => TokenType::KeywordNew,
|
||||||
"as" => TokenType::KeywordAs,
|
"as" => TokenType::KeywordAs,
|
||||||
"enum" => TokenType::KeywordEnum,
|
|
||||||
"true" => TokenType::True,
|
"true" => TokenType::True,
|
||||||
"false" => TokenType::False,
|
"false" => TokenType::False,
|
||||||
_ => TokenType::Identifier,
|
_ => TokenType::Identifier,
|
||||||
|
|||||||
@@ -361,7 +361,6 @@ impl<'a> TypeChecker<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Stmt::Enum { .. } => {}
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,4 @@
|
|||||||
const STDIN = 0
|
include "std/posix.zr"
|
||||||
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
|
|
||||||
|
|
||||||
const SYS_read = 0
|
const SYS_read = 0
|
||||||
const SYS_write = 1
|
const SYS_write = 1
|
||||||
27
std/posix.zr
Normal file
27
std/posix.zr
Normal file
@@ -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
|
||||||
22
std/std.zr
22
std/std.zr
@@ -1,4 +1,4 @@
|
|||||||
include "std/linux_constants.zr"
|
include "std/linux.zr"
|
||||||
|
|
||||||
func panic[msg: str] : void
|
func panic[msg: str] : void
|
||||||
io.print("PANIC: ")
|
io.print("PANIC: ")
|
||||||
@@ -265,7 +265,7 @@ func io.printf[..] : void
|
|||||||
s += 1
|
s += 1
|
||||||
|
|
||||||
func io.print_sized[x: ptr, size: i64] : void
|
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
|
func io.print[x: str] : void
|
||||||
io.print_sized(x as ptr, x->len())
|
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
|
func io.read_char[] : u8
|
||||||
c := 0 as u8
|
c := 0 as u8
|
||||||
_builtin_syscall(SYS_read, STDIN, ^c, 1)
|
_builtin_syscall(SYS_read, STDIN_FILENO, ^c, 1)
|
||||||
return c
|
return c
|
||||||
|
|
||||||
func io.read_line[] : str
|
func io.read_line[] : str
|
||||||
@@ -1157,6 +1157,12 @@ func os.sleep[ms: i64] : void
|
|||||||
req->tv_nsec = (ms % 1000) * 1000000
|
req->tv_nsec = (ms % 1000) * 1000000
|
||||||
_builtin_syscall(SYS_nanosleep, req, 0)
|
_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
|
func os.urandom_buf[buf: ptr, n: i64] : void
|
||||||
pos := 0
|
pos := 0
|
||||||
while pos < n
|
while pos < n
|
||||||
@@ -1175,16 +1181,6 @@ func os.urandom_i64[] : i64
|
|||||||
os.urandom_buf(^n, 8)
|
os.urandom_buf(^n, 8)
|
||||||
return n
|
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
|
func os.run_shell_command[command: str] : i64, bool
|
||||||
pid := _builtin_syscall(SYS_fork)
|
pid := _builtin_syscall(SYS_fork)
|
||||||
if pid < 0
|
if pid < 0
|
||||||
|
|||||||
Reference in New Issue
Block a user