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

65 lines
1.7 KiB
Rust

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