use std::fs; use parser::ASTPart; mod lexer; mod parser; fn log_ast_part(part: &ASTPart, prefix: String) { match part { ASTPart::Number(number) => println!("{}{}: Number: {}", prefix, number.pos, number.value), ASTPart::String(str) => println!("{}{}: String: {}", prefix, str.pos, str.value), ASTPart::Assigment(assigment) => { println!("{}{}: Assigment: {}", prefix, assigment.pos, assigment.variable); println!("{} Value:", prefix); log_ast_part(&assigment.value, format!("{} ", prefix)); }, ASTPart::Operation(operation) => { println!("{}{}: Operation: {}", prefix, operation.pos, operation.operator); println!("{} Left:", prefix); log_ast_part(&operation.left, format!("{} ", prefix)); println!("{} Right:", prefix); log_ast_part(&operation.right, format!("{} ", prefix)); }, ASTPart::VarRead(var_read) => println!("{}{}: Variable Read: {}", prefix, var_read.pos, var_read.variable), ASTPart::Call(call) => { println!("{}{}: Call:", prefix, call.pos); println!("{} Function:", prefix); log_ast_part(&call.function, format!("{} ", prefix)); println!("{} Args:", prefix); for arg in &call.args { log_ast_part(&arg, format!("{} ", prefix)); } }, ASTPart::NOOP => println!("{}NOOP", prefix) } } fn main() { let inp = fs::read_to_string("./test.as"); match inp { Result::Ok(data) => { let lexed = lexer::lex(data); println!("Lexer output: "); for token in &lexed { println!(" {}: {:?}: {}", token.pos, token.typ, token.value); } let ast = parser::parse(lexed); println!("AST: "); for part in &ast { log_ast_part(part, String::from(" ")); } }, Result::Err(err) => { panic!("Error while reading file: {}", err) } } }