Make loops typecheck and type infere
This commit is contained in:
parent
15ff9c5906
commit
a251be2715
@ -1,9 +1,12 @@
|
|||||||
// Arithmetic, function calls and imports!
|
// Arithmetic, function calls and imports!
|
||||||
|
|
||||||
|
import std::print;
|
||||||
|
import std::from_str;
|
||||||
|
|
||||||
fn main() -> u32 {
|
fn main() -> u32 {
|
||||||
for i in 0 to 10 {
|
let text = from_str("hello");
|
||||||
print("hello")
|
for i in 0 .. 10 {
|
||||||
|
print(&text)
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
|
@ -440,7 +440,6 @@ impl Builder {
|
|||||||
}
|
}
|
||||||
Instr::GetStructElemPtr(ptr_val, idx) => {
|
Instr::GetStructElemPtr(ptr_val, idx) => {
|
||||||
let ptr_ty = ptr_val.get_type(&self)?;
|
let ptr_ty = ptr_val.get_type(&self)?;
|
||||||
dbg!(&ptr_ty);
|
|
||||||
if let Type::Ptr(ty) = ptr_ty {
|
if let Type::Ptr(ty) = ptr_ty {
|
||||||
if let Type::CustomType(val) = *ty {
|
if let Type::CustomType(val) = *ty {
|
||||||
match self.type_data(&val).kind {
|
match self.type_data(&val).kind {
|
||||||
|
@ -155,11 +155,12 @@ impl Parse for PrimaryExpression {
|
|||||||
}
|
}
|
||||||
Token::DecimalValue(v) => {
|
Token::DecimalValue(v) => {
|
||||||
stream.next(); // Consume decimal
|
stream.next(); // Consume decimal
|
||||||
if let Some(Token::Dot) = stream.peek() {
|
if let (Some(Token::Dot), Some(Token::DecimalValue(fractional))) =
|
||||||
|
(stream.peek(), stream.peek2())
|
||||||
|
{
|
||||||
stream.next(); // Consume dot
|
stream.next(); // Consume dot
|
||||||
let Some(Token::DecimalValue(fractional)) = stream.next() else {
|
stream.next(); // Consume fractional
|
||||||
return Err(stream.expected_err("fractional part")?);
|
|
||||||
};
|
|
||||||
Expression(
|
Expression(
|
||||||
Kind::Literal(Literal::Decimal(
|
Kind::Literal(Literal::Decimal(
|
||||||
format!("{}.{}", v, fractional)
|
format!("{}.{}", v, fractional)
|
||||||
@ -706,7 +707,8 @@ impl Parse for ForStatement {
|
|||||||
let start_range = stream.get_range().unwrap();
|
let start_range = stream.get_range().unwrap();
|
||||||
stream.expect(Token::In)?;
|
stream.expect(Token::In)?;
|
||||||
let start = stream.parse()?;
|
let start = stream.parse()?;
|
||||||
stream.expect(Token::To)?;
|
stream.expect(Token::Dot)?;
|
||||||
|
stream.expect(Token::Dot)?;
|
||||||
let end = stream.parse()?;
|
let end = stream.parse()?;
|
||||||
|
|
||||||
Ok(ForStatement(idx, start_range, start, end, stream.parse()?))
|
Ok(ForStatement(idx, start_range, start, end, stream.parse()?))
|
||||||
|
@ -1001,7 +1001,6 @@ impl mir::Expression {
|
|||||||
let TypeKind::CodegenPtr(inner) = &struct_val.1 else {
|
let TypeKind::CodegenPtr(inner) = &struct_val.1 else {
|
||||||
panic!("tried accessing non-pointer");
|
panic!("tried accessing non-pointer");
|
||||||
};
|
};
|
||||||
dbg!(&inner);
|
|
||||||
let TypeKind::CustomType(key) = *inner.clone() else {
|
let TypeKind::CustomType(key) = *inner.clone() else {
|
||||||
panic!("tried accessing non-custom-type");
|
panic!("tried accessing non-custom-type");
|
||||||
};
|
};
|
||||||
|
@ -46,11 +46,7 @@ pub enum Token {
|
|||||||
While,
|
While,
|
||||||
/// `for`
|
/// `for`
|
||||||
For,
|
For,
|
||||||
/// `from`
|
/// `In`
|
||||||
From,
|
|
||||||
/// `to`
|
|
||||||
To,
|
|
||||||
/// `to`
|
|
||||||
In,
|
In,
|
||||||
|
|
||||||
// Symbols
|
// Symbols
|
||||||
@ -147,9 +143,7 @@ impl ToString for Token {
|
|||||||
Token::Struct => String::from("struct"),
|
Token::Struct => String::from("struct"),
|
||||||
Token::AsKeyword => String::from("as"),
|
Token::AsKeyword => String::from("as"),
|
||||||
Token::For => String::from("for"),
|
Token::For => String::from("for"),
|
||||||
Token::From => String::from("from"),
|
|
||||||
Token::In => String::from("in"),
|
Token::In => String::from("in"),
|
||||||
Token::To => String::from("to"),
|
|
||||||
Token::While => String::from("while"),
|
Token::While => String::from("while"),
|
||||||
Token::Semi => String::from(';'),
|
Token::Semi => String::from(';'),
|
||||||
Token::Equals => String::from('='),
|
Token::Equals => String::from('='),
|
||||||
@ -340,8 +334,6 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error
|
|||||||
"for" => Token::For,
|
"for" => Token::For,
|
||||||
"while" => Token::While,
|
"while" => Token::While,
|
||||||
"in" => Token::In,
|
"in" => Token::In,
|
||||||
"from" => Token::From,
|
|
||||||
"to" => Token::To,
|
|
||||||
_ => Token::Identifier(value),
|
_ => Token::Identifier(value),
|
||||||
};
|
};
|
||||||
variant
|
variant
|
||||||
|
@ -335,7 +335,14 @@ impl Block {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StmtKind::While(while_statement) => todo!(),
|
StmtKind::While(WhileStatement {
|
||||||
|
condition, block, ..
|
||||||
|
}) => {
|
||||||
|
condition.typecheck(&mut state, typerefs, Some(&TypeKind::Bool))?;
|
||||||
|
block.typecheck(&mut state, typerefs, None)?;
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some((ReturnKind::Hard, _)) = ret {
|
if let Some((ReturnKind::Hard, _)) = ret {
|
||||||
|
@ -16,6 +16,7 @@ use super::{
|
|||||||
IfExpression, Module, ReturnKind, StmtKind,
|
IfExpression, Module, ReturnKind, StmtKind,
|
||||||
TypeKind::*,
|
TypeKind::*,
|
||||||
VagueType::*,
|
VagueType::*,
|
||||||
|
WhileStatement,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Struct used to implement Type Inference, where an intermediary
|
/// Struct used to implement Type Inference, where an intermediary
|
||||||
@ -126,7 +127,12 @@ impl Block {
|
|||||||
let expr_res = expr.infer_types(&mut state, &inner_refs);
|
let expr_res = expr.infer_types(&mut state, &inner_refs);
|
||||||
state.ok(expr_res, expr.1);
|
state.ok(expr_res, expr.1);
|
||||||
}
|
}
|
||||||
StmtKind::While(while_statement) => todo!(),
|
StmtKind::While(WhileStatement {
|
||||||
|
condition, block, ..
|
||||||
|
}) => {
|
||||||
|
condition.infer_types(&mut state, &inner_refs)?;
|
||||||
|
block.infer_types(&mut state, &inner_refs)?;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user