diff --git a/TODO b/TODO index 5f8dc0e..9894a16 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,4 @@ # Bugs -- Uninitialized variables don't compile - stdlib moves line of file, which makes error reporting impossible # Features diff --git a/examples/playground.sb b/examples/playground.sb index caabd24..523052e 100644 --- a/examples/playground.sb +++ b/examples/playground.sb @@ -1,4 +1,6 @@ fn main() { - let x: string = "Hello World\n" + let x: string + + x = "Hello World" _printf(x) } \ No newline at end of file diff --git a/src/parser/rules.rs b/src/parser/rules.rs index 60bb4d3..bd7ec6a 100644 --- a/src/parser/rules.rs +++ b/src/parser/rules.rs @@ -366,9 +366,17 @@ impl Parser { TokenKind::Colon => Some(self.parse_type()?), _ => None, }; - self.match_token(TokenKind::Assign)?; - let expr = self.parse_expression()?; - Ok(Statement::Declare(Variable { name, ty }, Some(expr))) + + match self.peek()?.kind { + TokenKind::Assign => { + self.match_token(TokenKind::Assign)?; + let expr = self.parse_expression()?; + Ok(Statement::Declare(Variable { name, ty }, Some(expr))) + }, + _ => { + Ok(Statement::Declare(Variable {name, ty}, None)) + } + } } fn parse_assignent(&mut self, name: Option) -> Result { diff --git a/src/parser/tests.rs b/src/parser/tests.rs index 64c83dd..6a6c40a 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -621,3 +621,23 @@ fn test_booleans_in_function_call() { let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()); } + +#[test] +fn test_late_initializing_variable() { + let raw = " + fn main() { + let x: int + let y: string + x = 5 + if x > 2 { + y = 'test' + } + + _printf(x) + _printf(y) + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()); +}