feat: Add parsing support for primitive types.
This commit is contained in:
4
example/simple.bky
Normal file
4
example/simple.bky
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
fn main(): i32 {
|
||||||
|
let return_code: i32 = 12;
|
||||||
|
return return_code;
|
||||||
|
}
|
||||||
@@ -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 },
|
||||||
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user