Begin passing tests again
This commit is contained in:
parent
fdf324c866
commit
f4d29eca38
@ -24,6 +24,12 @@ impl AbstractSyntaxTree {
|
|||||||
statements: VecDeque::new(),
|
statements: VecDeque::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_statements<const LEN: usize>(statements: [Statement; LEN]) -> Self {
|
||||||
|
Self {
|
||||||
|
statements: statements.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for AbstractSyntaxTree {
|
impl Default for AbstractSyntaxTree {
|
||||||
|
@ -347,10 +347,10 @@ impl<'src> Parser<'src> {
|
|||||||
})?;
|
})?;
|
||||||
let position = (start_position.0, self.current_position.1);
|
let position = (start_position.0, self.current_position.1);
|
||||||
|
|
||||||
return Ok(Expression::literal(
|
Ok(Expression::literal(
|
||||||
LiteralExpression::Float(float),
|
LiteralExpression::Float(float),
|
||||||
position,
|
position,
|
||||||
));
|
))
|
||||||
}
|
}
|
||||||
Token::Identifier(text) => {
|
Token::Identifier(text) => {
|
||||||
let identifier = Identifier::new(text);
|
let identifier = Identifier::new(text);
|
||||||
@ -502,6 +502,17 @@ impl<'src> Parser<'src> {
|
|||||||
Token::LeftSquareBrace => {
|
Token::LeftSquareBrace => {
|
||||||
self.next_token()?;
|
self.next_token()?;
|
||||||
|
|
||||||
|
if let Token::RightSquareBrace = self.current_token {
|
||||||
|
let position = (start_position.0, self.current_position.1);
|
||||||
|
|
||||||
|
self.next_token()?;
|
||||||
|
|
||||||
|
return Ok(Expression::list(
|
||||||
|
ListExpression::Ordered(Vec::new()),
|
||||||
|
position,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
let first_expression = self.parse_expression(0)?;
|
let first_expression = self.parse_expression(0)?;
|
||||||
|
|
||||||
if let Token::Semicolon = self.current_token {
|
if let Token::Semicolon = self.current_token {
|
||||||
@ -1275,41 +1286,125 @@ mod tests {
|
|||||||
fn empty_list() {
|
fn empty_list() {
|
||||||
let source = "[]";
|
let source = "[]";
|
||||||
|
|
||||||
assert_eq!(parse(source), todo!());
|
assert_eq!(
|
||||||
|
parse(source),
|
||||||
|
Ok(AbstractSyntaxTree::with_statements([
|
||||||
|
Statement::Expression(Expression::list(ListExpression::Ordered(vec![]), (0, 2)))
|
||||||
|
]))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn float() {
|
fn float() {
|
||||||
let source = "42.0";
|
let source = "42.0";
|
||||||
|
|
||||||
assert_eq!(parse(source), todo!());
|
assert_eq!(
|
||||||
|
parse(source),
|
||||||
|
Ok(AbstractSyntaxTree::with_statements([
|
||||||
|
Statement::Expression(Expression::literal(LiteralExpression::Float(42.0), (0, 4)))
|
||||||
|
]))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add() {
|
fn add() {
|
||||||
let source = "1 + 2";
|
let source = "1 + 2";
|
||||||
|
|
||||||
assert_eq!(parse(source), todo!());
|
assert_eq!(
|
||||||
|
parse(source),
|
||||||
|
Ok(AbstractSyntaxTree::with_statements([
|
||||||
|
Statement::Expression(Expression::operator(
|
||||||
|
OperatorExpression::Math {
|
||||||
|
left: Expression::literal(LiteralExpression::Integer(1), (0, 1)),
|
||||||
|
operator: Node::new(MathOperator::Add, (2, 3)),
|
||||||
|
right: Expression::literal(LiteralExpression::Integer(2), (4, 5))
|
||||||
|
},
|
||||||
|
(0, 5)
|
||||||
|
))
|
||||||
|
]))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn multiply() {
|
fn multiply() {
|
||||||
let source = "1 * 2";
|
let source = "1 * 2";
|
||||||
|
|
||||||
assert_eq!(parse(source), todo!());
|
assert_eq!(
|
||||||
|
parse(source),
|
||||||
|
Ok(AbstractSyntaxTree::with_statements([
|
||||||
|
Statement::Expression(Expression::operator(
|
||||||
|
OperatorExpression::Math {
|
||||||
|
left: Expression::literal(LiteralExpression::Integer(1), (0, 1)),
|
||||||
|
operator: Node::new(MathOperator::Multiply, (2, 3)),
|
||||||
|
right: Expression::literal(LiteralExpression::Integer(2), (4, 5))
|
||||||
|
},
|
||||||
|
(0, 5)
|
||||||
|
))
|
||||||
|
]))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add_and_multiply() {
|
fn add_and_multiply() {
|
||||||
let source = "1 + 2 * 3";
|
let source = "1 + 2 * 3";
|
||||||
|
|
||||||
assert_eq!(parse(source), todo!());
|
assert_eq!(
|
||||||
|
parse(source),
|
||||||
|
Ok(AbstractSyntaxTree::with_statements([
|
||||||
|
Statement::Expression(Expression::operator(
|
||||||
|
OperatorExpression::Math {
|
||||||
|
left: Expression::literal(LiteralExpression::Integer(1), (0, 1)),
|
||||||
|
operator: Node::new(MathOperator::Add, (2, 3)),
|
||||||
|
right: Expression::operator(
|
||||||
|
OperatorExpression::Math {
|
||||||
|
left: Expression::literal(LiteralExpression::Integer(2), (4, 5)),
|
||||||
|
operator: Node::new(MathOperator::Multiply, (6, 7)),
|
||||||
|
right: Expression::literal(LiteralExpression::Integer(3), (8, 9))
|
||||||
|
},
|
||||||
|
(4, 9)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
(0, 5)
|
||||||
|
))
|
||||||
|
]))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn assignment() {
|
fn assignment() {
|
||||||
let source = "a = 1 + 2 * 3";
|
let source = "a = 1 + 2 * 3";
|
||||||
|
|
||||||
assert_eq!(parse(source), todo!());
|
assert_eq!(
|
||||||
|
parse(source),
|
||||||
|
Ok(AbstractSyntaxTree::with_statements([
|
||||||
|
Statement::Expression(Expression::operator(
|
||||||
|
OperatorExpression::Assignment {
|
||||||
|
assignee: Expression::identifier(Identifier::new("a"), (0, 1)),
|
||||||
|
value: Expression::operator(
|
||||||
|
OperatorExpression::Math {
|
||||||
|
left: Expression::literal(LiteralExpression::Integer(1), (4, 5)),
|
||||||
|
operator: Node::new(MathOperator::Add, (6, 7)),
|
||||||
|
right: Expression::operator(
|
||||||
|
OperatorExpression::Math {
|
||||||
|
left: Expression::literal(
|
||||||
|
LiteralExpression::Integer(2),
|
||||||
|
(8, 9)
|
||||||
|
),
|
||||||
|
operator: Node::new(MathOperator::Multiply, (10, 11)),
|
||||||
|
right: Expression::literal(
|
||||||
|
LiteralExpression::Integer(3),
|
||||||
|
(12, 13)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
(8, 13)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
(4, 13)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
(0, 13)
|
||||||
|
))
|
||||||
|
]))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user