handball/src/main.rs

70 lines
1.6 KiB
Rust

#![feature(array_windows)]
#![feature(assert_matches)]
#![feature(box_patterns)]
#![feature(crate_visibility_modifier)]
#![feature(let_else)]
use std::io;
use rustyline::validate::{
MatchingBracketValidator, ValidationContext, ValidationResult, Validator,
};
use rustyline::Editor;
use rustyline_derive::{Completer, Helper, Highlighter, Hinter};
mod ast;
mod eval;
#[allow(clippy::all)]
mod grammar;
mod prims;
#[cfg(test)]
mod tests;
mod value;
fn main() {
let args = std::env::args().collect::<Vec<_>>();
match &args[..] {
[_] => repl(),
[_, file] => run_file(file).unwrap(),
_ => panic!("To many args `{:?}`", args),
}
}
fn run_file(file: &str) -> io::Result<()> {
let src = std::fs::read_to_string(file)?;
let tree = grammar::FileParser::new().parse(&src).unwrap();
let mut env = eval::default_env();
for i in tree {
eval::eval(&i, &mut env).unwrap();
}
Ok(())
}
fn repl() {
let mut rl = Editor::new();
rl.set_helper(Some(InputValidator {
brackets: MatchingBracketValidator::new(),
}));
let mut env = eval::default_env();
while let Ok(line) = rl.readline("> ") {
rl.add_history_entry(&line);
let tree = grammar::TreeParser::new().parse(&line).unwrap();
// dbg!(&tree);
println!("< {:?}", eval::eval(&tree, &mut env))
}
}
#[derive(Completer, Helper, Highlighter, Hinter)]
struct InputValidator {
brackets: MatchingBracketValidator,
}
impl Validator for InputValidator {
fn validate(&self, ctx: &mut ValidationContext) -> rustyline::Result<ValidationResult> {
self.brackets.validate(ctx)
}
}