This commit is contained in:
2024-10-07 19:05:33 -04:00
parent ca52443f81
commit bb3a0ad113
12 changed files with 173 additions and 218 deletions
+13 -21
View File
@@ -2,38 +2,30 @@ use std::io::{stdout, BufRead, BufReader};
mod parser;
use parser::{Module, Node, NodeContainer, Statement, TokenCursor};
use parser::{Module, Node, ParserErrors, Statement, TokenCursor};
pub fn parse_file(file: &str) {
let node = Node::<Module>::parse(&mut TokenCursor::from(file));
match node.inner {
Err(err) => err.write_for(&mut stdout(), file).unwrap(),
Ok(module) => {
println!("{module:#?}");
print_errors(module.children(), file)
},
let mut errors = ParserErrors::new();
let node = Node::<Module>::parse(&mut TokenCursor::from(file), &mut errors);
if let Ok(module) = node.as_ref() {
println!("{module:#?}");
};
}
pub fn print_errors(nodes: Vec<Node<Box<dyn NodeContainer>>>, file: &str) {
for node in &nodes {
if let Err(err) = &node.inner {
err.write_for(&mut stdout(), file).unwrap();
}
}
for node in nodes {
print_errors(node.children(), file)
for err in errors.errs {
err.write_for(&mut stdout(), file).unwrap();
}
}
pub fn run_stdin() {
for line in BufReader::new(std::io::stdin()).lines() {
let mut errors = ParserErrors::new();
let str = &line.expect("failed to read line");
let mut cursor = TokenCursor::from(&str[..]);
let out = &mut stdout();
match Node::<Statement>::parse(&mut cursor).inner {
Ok(expr) => println!("{:?}", expr),
Err(err) => err.write_for(out, str).unwrap(),
if let Ok(expr) = Node::<Statement>::parse(&mut cursor, &mut errors).as_ref() {
println!("{:?}", expr);
}
for err in errors.errs {
err.write_for(&mut stdout(), str).unwrap();
}
}
}