bools
This commit is contained in:
@@ -4,12 +4,12 @@ A very cool language
|
||||
|
||||
## Syntax
|
||||
```go
|
||||
func fib[n: U32] : U32
|
||||
func fib[n: I64] : I64
|
||||
if n <= 1
|
||||
return n
|
||||
return fib(n-2) + fib(n-1)
|
||||
|
||||
func main[]
|
||||
func main[] : I64
|
||||
for i in 0..20
|
||||
fib(i) |> U32.to_string() |> IO.print()
|
||||
fib(i) |> I64.to_string() |> print()
|
||||
```
|
||||
@@ -3,18 +3,18 @@ func print_i64[x: I64] : I64
|
||||
|
||||
func is_prime[n: I64]: I64
|
||||
if n <= 1
|
||||
return 0
|
||||
return false
|
||||
if n == 2 || n == 3
|
||||
return 1
|
||||
return true
|
||||
if n % 2 == 0 || n % 3 == 0
|
||||
return 0
|
||||
return false
|
||||
|
||||
let i: I64 = 5
|
||||
while i * i <= n
|
||||
if n % i == 0 || n % (i + 2) == 0
|
||||
return 0
|
||||
return false
|
||||
i = i + 6
|
||||
return 1
|
||||
return true
|
||||
|
||||
func main[] : I64
|
||||
let sum: I64 = 0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
func print_i64[x: I64] : I64
|
||||
printf("%ld\n", x)
|
||||
|
||||
func i64_to_string[n: I64] : String
|
||||
func I64.to_string[n: I64] : String
|
||||
let x: I64 = malloc(21)
|
||||
sprintf(x, "%ld", n)
|
||||
return x
|
||||
@@ -14,7 +14,7 @@ func main[] : I64
|
||||
let b: I64 = 500
|
||||
while b < 1000
|
||||
if a * b > out
|
||||
let s: String = i64_to_string(a * b)
|
||||
let s: String = I64.to_string(a * b)
|
||||
let s_rev: String = strrev(s)
|
||||
if strcmp(s, s_rev) == 0
|
||||
out = a * b
|
||||
|
||||
@@ -3,18 +3,18 @@ func print_i64[x: I64] : I64
|
||||
|
||||
func is_prime[n: I64]: I64
|
||||
if n <= 1
|
||||
return 0
|
||||
return false
|
||||
if n == 2 || n == 3
|
||||
return 1
|
||||
return true
|
||||
if n % 2 == 0 || n % 3 == 0
|
||||
return 0
|
||||
return false
|
||||
|
||||
let i: I64 = 5
|
||||
while i * i <= n
|
||||
if n % i == 0 || n % (i + 2) == 0
|
||||
return 0
|
||||
return false
|
||||
i = i + 6
|
||||
return 1
|
||||
return true
|
||||
|
||||
func main[] : I64
|
||||
let found: I64 = 0
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
func print_i64[x: I64] : I64
|
||||
printf("%ld\n", x)
|
||||
|
||||
func i64_to_string[n: I64] : String
|
||||
let x: I64 = malloc(21)
|
||||
sprintf(x, "%d", n)
|
||||
func I64.to_string[n: I64] : String
|
||||
let x: String = malloc(21)
|
||||
sprintf(x, "%ld", n)
|
||||
return x
|
||||
|
||||
func main[] : I64
|
||||
let s: String = i64_to_string(58394)
|
||||
let s: String = I64.to_string(58394)
|
||||
print_i64(strlen(s))
|
||||
free(s)
|
||||
@@ -58,7 +58,7 @@ macro_rules! emit {
|
||||
}
|
||||
|
||||
static REGISTERS: [&str; 6] = ["rdi", "rsi", "rdx", "rcx", "r8", "r9"];
|
||||
static TYPES: [&str; 2] = ["I64", "String"];
|
||||
static TYPES: [&str; 3] = ["I64", "String", "Bool"];
|
||||
|
||||
pub struct CodegenX86_64 {
|
||||
output: String,
|
||||
@@ -259,7 +259,11 @@ nth:
|
||||
|
||||
self.compile_stmt(env, *body)?;
|
||||
|
||||
emit!(&mut self.output, " mov rax, 0"); // TODO: remove default return value
|
||||
if name.lexeme == "main" {
|
||||
// default exit code
|
||||
emit!(&mut self.output, " mov rax, 0");
|
||||
}
|
||||
|
||||
emit!(&mut self.output, " mov rsp, rbp");
|
||||
emit!(&mut self.output, " pop rbp");
|
||||
emit!(&mut self.output, " ret");
|
||||
@@ -366,6 +370,12 @@ nth:
|
||||
emit!(&mut self.output, " mov rax, S{}", self.data_counter);
|
||||
self.data_counter += 1;
|
||||
}
|
||||
TokenType::True => {
|
||||
emit!(&mut self.output, " mov rax, 1");
|
||||
}
|
||||
TokenType::False => {
|
||||
emit!(&mut self.output, " mov rax, 0");
|
||||
}
|
||||
_ => unreachable!(),
|
||||
},
|
||||
Expr::Unary { op, right } => {
|
||||
|
||||
@@ -396,7 +396,12 @@ impl Parser {
|
||||
}
|
||||
|
||||
fn primary(&mut self) -> Result<Expr, ZernError> {
|
||||
if self.match_token(&[TokenType::Number, TokenType::String]) {
|
||||
if self.match_token(&[
|
||||
TokenType::Number,
|
||||
TokenType::String,
|
||||
TokenType::True,
|
||||
TokenType::False,
|
||||
]) {
|
||||
Ok(Expr::Literal(self.previous().clone()))
|
||||
} else if self.match_token(&[TokenType::LeftParen]) {
|
||||
let expr = self.expression()?;
|
||||
|
||||
@@ -30,6 +30,8 @@ pub enum TokenType {
|
||||
Identifier,
|
||||
String,
|
||||
Number,
|
||||
True,
|
||||
False,
|
||||
|
||||
KeywordLet,
|
||||
KeywordIf,
|
||||
@@ -305,6 +307,8 @@ impl Tokenizer {
|
||||
"while" => TokenType::KeywordWhile,
|
||||
"func" => TokenType::KeywordFunc,
|
||||
"return" => TokenType::KeywordReturn,
|
||||
"true" => TokenType::True,
|
||||
"false" => TokenType::False,
|
||||
_ => TokenType::Identifier,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user