AstroLang/src/main.rs

57 lines
No EOL
2 KiB
Rust

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)
}
}
}