1
0
Fork 0
monkey-interpreter/src/parser/program.rs

65 lines
1.7 KiB
Rust
Raw Normal View History

2019-09-06 19:46:52 +00:00
use crate::lexer::{Lexer, Token};
use crate::parser::ast::StatementType;
2019-09-06 19:46:52 +00:00
use crate::parser::Parser;
#[derive(Debug)]
2019-09-06 19:46:52 +00:00
pub struct Program {
statements: Vec<StatementType>,
2019-09-06 19:46:52 +00:00
}
impl Program {
2019-09-07 14:02:44 +00:00
pub fn parse(lexer: Lexer) -> Program {
2019-09-06 19:46:52 +00:00
let mut statements = vec![];
2019-09-07 14:02:44 +00:00
let mut parser = Parser::new(lexer);
2019-09-06 19:46:52 +00:00
loop {
2019-09-07 14:02:44 +00:00
if let Some(token) = parser.lexer.next() {
if parser.current_token_is(Token::EOF) {
2019-09-06 19:46:52 +00:00
break;
}
2019-09-07 14:02:44 +00:00
if let Some(stmt) = parser.parse_statement(token) {
2019-09-06 19:46:52 +00:00
statements.push(stmt);
} else {
continue;
}
} else {
break;
}
}
println!("statements={:?}", statements);
2019-09-06 19:46:52 +00:00
Program { statements }
}
}
#[cfg(test)]
mod tests {
use crate::lexer::Lexer;
2019-09-07 14:02:44 +00:00
use crate::parser::ast::{Identifier, LetStatement};
2019-09-06 19:46:52 +00:00
use crate::parser::Program;
#[test]
fn let_statements() {
let ip = "
let yr = 5;
let qq = 10;
let foobar = 8388383;
";
2019-09-07 14:02:44 +00:00
let out = Program {
statements: vec![
LetStatement::new(Identifier::new("yr")),
LetStatement::new(Identifier::new("qq")),
LetStatement::new(Identifier::new("foobar")),
2019-09-07 14:02:44 +00:00
],
};
2019-09-06 19:46:52 +00:00
let lexer = Lexer::new(ip);
let ast_tree = Program::parse(lexer);
if ast_tree.statements.len() != 3 {
assert_eq!(ast_tree.statements.len(), 3);
}
2019-09-07 14:02:44 +00:00
for (out, expected_out) in ast_tree.statements.iter().zip(out.statements.iter()) {
assert_eq!(out, expected_out);
2019-09-07 14:02:44 +00:00
}
2019-09-06 19:46:52 +00:00
}
}