|
|
@ -80,10 +80,12 @@ impl Parser { |
|
|
|
TokenKind::Comma => { |
|
|
|
TokenKind::Comma => { |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
TokenKind::Identifier(name) => args.push(Variable { |
|
|
|
TokenKind::Identifier(name) => { |
|
|
|
name: name, |
|
|
|
args.push(Variable { |
|
|
|
ty: Some(self.parse_type()?), |
|
|
|
name: name, |
|
|
|
}), |
|
|
|
ty: Some(self.parse_type()?), |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
_ => return Err(self.make_error(TokenKind::Identifier("Argument".into()), next)), |
|
|
|
_ => return Err(self.make_error(TokenKind::Identifier("Argument".into()), next)), |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -92,13 +94,14 @@ impl Parser { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fn parse_type(&mut self) -> Result<Type, String> { |
|
|
|
fn parse_type(&mut self) -> Result<Type, String> { |
|
|
|
let next = self.next()?; |
|
|
|
self.match_token(TokenKind::Colon)?; |
|
|
|
|
|
|
|
let next = self.peek()?; |
|
|
|
let typ = match next.kind { |
|
|
|
let typ = match next.kind { |
|
|
|
TokenKind::Identifier(t) => Type::try_from(t), |
|
|
|
TokenKind::Identifier(_) => Type::try_from(self.next()?.raw), |
|
|
|
_ => Err("Expected type".into()), |
|
|
|
_ => Err("Expected type".into()), |
|
|
|
}?; |
|
|
|
}?; |
|
|
|
if let Ok(_) = self.peek_token(TokenKind::SquareBraceOpen) { |
|
|
|
if let Ok(_) = self.peek_token(TokenKind::SquareBraceOpen) { |
|
|
|
self.drop(1); |
|
|
|
self.match_token(TokenKind::SquareBraceOpen)?; |
|
|
|
self.match_token(TokenKind::SquareBraceClose)?; |
|
|
|
self.match_token(TokenKind::SquareBraceClose)?; |
|
|
|
Ok(Type::Array(Box::new(typ))) |
|
|
|
Ok(Type::Array(Box::new(typ))) |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -242,16 +245,20 @@ impl Parser { |
|
|
|
fn parse_array(&mut self) -> Result<Expression, String> { |
|
|
|
fn parse_array(&mut self) -> Result<Expression, String> { |
|
|
|
let mut elements = Vec::new(); |
|
|
|
let mut elements = Vec::new(); |
|
|
|
loop { |
|
|
|
loop { |
|
|
|
let next = self.next()?; |
|
|
|
let next = self.peek()?; |
|
|
|
match next.kind { |
|
|
|
match next.kind { |
|
|
|
|
|
|
|
TokenKind::SquareBraceClose => {} |
|
|
|
TokenKind::Literal(Value::Int) => { |
|
|
|
TokenKind::Literal(Value::Int) => { |
|
|
|
let value = next.raw.parse::<u32>().map_err(|e| e.to_string())?; |
|
|
|
let value = self.next()?.raw.parse::<u32>().map_err(|e| e.to_string())?; |
|
|
|
elements.push(Expression::Int(value)); |
|
|
|
elements.push(Expression::Int(value)); |
|
|
|
} |
|
|
|
} |
|
|
|
TokenKind::Literal(Value::Str) => { |
|
|
|
TokenKind::Literal(Value::Str) => { |
|
|
|
elements.push(Expression::Str(next.raw)); |
|
|
|
elements.push(Expression::Str(self.next()?.raw)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_ => { |
|
|
|
|
|
|
|
let n = self.next()?; |
|
|
|
|
|
|
|
return Err(self.make_error(TokenKind::Identifier("Argument".into()), n)); |
|
|
|
} |
|
|
|
} |
|
|
|
_ => return Err(self.make_error(TokenKind::Identifier("Argument".into()), next)), |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
if self.peek_token(TokenKind::SquareBraceClose).is_ok() { |
|
|
|
if self.peek_token(TokenKind::SquareBraceClose).is_ok() { |
|
|
|
break; |
|
|
|
break; |
|
|
@ -347,17 +354,14 @@ impl Parser { |
|
|
|
|
|
|
|
|
|
|
|
fn parse_declare(&mut self) -> Result<Statement, String> { |
|
|
|
fn parse_declare(&mut self) -> Result<Statement, String> { |
|
|
|
self.match_keyword(Keyword::Let)?; |
|
|
|
self.match_keyword(Keyword::Let)?; |
|
|
|
match (self.next()?.kind, self.peek()?.kind) { |
|
|
|
let name = self.match_identifier()?; |
|
|
|
(TokenKind::Identifier(name), TokenKind::SemiColon) => { |
|
|
|
let ty = match self.peek()?.kind { |
|
|
|
Ok(Statement::Declare(Variable { name, ty: None }, None)) |
|
|
|
TokenKind::Colon => Some(self.parse_type()?), |
|
|
|
} |
|
|
|
_ => None, |
|
|
|
(TokenKind::Identifier(name), TokenKind::Assign) => { |
|
|
|
}; |
|
|
|
self.drop(1); |
|
|
|
self.match_token(TokenKind::Assign)?; |
|
|
|
let exp = self.parse_expression().ok(); |
|
|
|
let expr = self.parse_expression()?; |
|
|
|
Ok(Statement::Declare(Variable { name, ty: None }, exp)) |
|
|
|
Ok(Statement::Declare(Variable { name, ty }, Some(expr))) |
|
|
|
} |
|
|
|
|
|
|
|
other => Err(format!("Expected identifier, found {:?}", other)), |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fn parse_assignent(&mut self, name: Option<Expression>) -> Result<Statement, String> { |
|
|
|
fn parse_assignent(&mut self, name: Option<Expression>) -> Result<Statement, String> { |
|
|
|