This commit is contained in:
2025-06-01 19:54:35 +02:00
parent e84419f0cf
commit 437697b287
9 changed files with 44 additions and 25 deletions

View File

@@ -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 } => {

View File

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

View File

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