feat: Add parsing support for primitive types.

This commit is contained in:
Jooris Hadeler
2026-01-16 21:02:14 +01:00
parent 4edcd1a7b7
commit fbf6726a78
4 changed files with 67 additions and 1 deletions

4
example/simple.bky Normal file
View File

@@ -0,0 +1,4 @@
fn main(): i32 {
let return_code: i32 = 12;
return return_code;
}

View File

@@ -64,6 +64,7 @@ pub enum Statement {
Let { Let {
name: Box<str>, name: Box<str>,
name_span: Span, name_span: Span,
type_: Option<Type>,
value: Option<Expression>, value: Option<Expression>,
}, },
@@ -94,3 +95,11 @@ pub enum Statement {
Expr(Expression), Expr(Expression),
} }
#[derive(Debug, PartialEq, Eq)]
pub enum Type {
Integer { size: u8, signed: bool },
Boolean,
Named { name: Box<str>, name_span: Span },
}

View File

@@ -5,7 +5,7 @@ pub mod parser;
pub mod token; pub mod token;
fn main() { fn main() {
let mut parser = Parser::new("break;"); let mut parser = Parser::new("{ let return_code: i32 = 12; return return_code; }");
println!("{:#?}", parser.parse_statement()); println!("{:#?}", parser.parse_statement());
} }

View File

@@ -56,6 +56,50 @@ impl<'src> Parser<'src> {
} }
} }
pub fn parse_type(&mut self) -> ParserResult<Type> {
let name_tok = self.expect(&[TokenKind::Identifier])?;
Ok(match name_tok.text {
"i8" => Type::Integer {
size: 8,
signed: true,
},
"u8" => Type::Integer {
size: 8,
signed: false,
},
"i16" => Type::Integer {
size: 16,
signed: true,
},
"u16" => Type::Integer {
size: 16,
signed: false,
},
"i32" => Type::Integer {
size: 32,
signed: true,
},
"u32" => Type::Integer {
size: 32,
signed: false,
},
"i64" => Type::Integer {
size: 64,
signed: true,
},
"u64" => Type::Integer {
size: 64,
signed: false,
},
"bool" => Type::Boolean,
name => Type::Named {
name: name.to_string().into_boxed_str(),
name_span: name_tok.span,
},
})
}
pub fn parse_statement(&mut self) -> ParserResult<Statement> { pub fn parse_statement(&mut self) -> ParserResult<Statement> {
match self.peek_no_eof()?.kind { match self.peek_no_eof()?.kind {
TokenKind::KwLet => self.parse_let_statement(), TokenKind::KwLet => self.parse_let_statement(),
@@ -63,6 +107,7 @@ impl<'src> Parser<'src> {
TokenKind::KwLoop => self.parse_loop_statement(), TokenKind::KwLoop => self.parse_loop_statement(),
TokenKind::KwBreak => self.parse_break_statement(), TokenKind::KwBreak => self.parse_break_statement(),
TokenKind::KwReturn => self.parse_return_statement(), TokenKind::KwReturn => self.parse_return_statement(),
TokenKind::LeftBrace => self.parse_compound_statement(),
_ => { _ => {
let expr = self.parse_expression(0)?; let expr = self.parse_expression(0)?;
@@ -147,6 +192,13 @@ impl<'src> Parser<'src> {
(token.text.to_string().into_boxed_str(), token.span) (token.text.to_string().into_boxed_str(), token.span)
}; };
let type_ = if self.is_peek(TokenKind::Colon) {
self.consume();
Some(self.parse_type()?)
} else {
None
};
let value = if self.is_peek(TokenKind::Assign) { let value = if self.is_peek(TokenKind::Assign) {
self.consume(); self.consume();
@@ -161,6 +213,7 @@ impl<'src> Parser<'src> {
name, name,
name_span, name_span,
value, value,
type_,
}) })
} }