handball/src/main.rs

70 lines
1.6 KiB
Rust
Raw Normal View History

2021-12-17 02:57:20 +00:00
#![feature(array_windows)]
2021-12-27 20:43:01 +00:00
#![feature(assert_matches)]
2021-12-17 02:57:20 +00:00
#![feature(box_patterns)]
2021-12-27 22:19:29 +00:00
#![feature(crate_visibility_modifier)]
2021-12-27 20:43:01 +00:00
#![feature(let_else)]
2021-12-16 18:23:02 +00:00
2021-12-27 22:19:29 +00:00
use std::io;
2021-12-27 03:35:57 +00:00
2021-12-16 20:30:28 +00:00
use rustyline::validate::{
MatchingBracketValidator, ValidationContext, ValidationResult, Validator,
};
2021-12-16 22:24:31 +00:00
use rustyline::Editor;
2021-12-16 20:30:28 +00:00
use rustyline_derive::{Completer, Helper, Highlighter, Hinter};
2021-12-16 18:23:02 +00:00
2021-12-27 22:19:29 +00:00
mod ast;
mod eval;
#[allow(clippy::all)]
mod grammar;
mod prims;
#[cfg(test)]
mod tests;
mod value;
2021-12-16 18:23:02 +00:00
2021-12-16 22:24:31 +00:00
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)?;
2021-12-27 15:07:07 +00:00
let tree = grammar::FileParser::new().parse(&src).unwrap();
2021-12-27 22:19:29 +00:00
let mut env = eval::default_env();
for i in tree {
2021-12-27 22:19:29 +00:00
eval::eval(&i, &mut env).unwrap();
}
Ok(())
}
fn repl() {
2021-12-16 20:30:28 +00:00
let mut rl = Editor::new();
rl.set_helper(Some(InputValidator {
brackets: MatchingBracketValidator::new(),
}));
2021-12-16 22:24:31 +00:00
2021-12-27 22:19:29 +00:00
let mut env = eval::default_env();
2021-12-16 22:24:31 +00:00
2021-12-16 20:30:28 +00:00
while let Ok(line) = rl.readline("> ") {
rl.add_history_entry(&line);
2021-12-16 18:23:02 +00:00
2021-12-16 20:30:28 +00:00
let tree = grammar::TreeParser::new().parse(&line).unwrap();
2021-12-17 04:15:53 +00:00
// dbg!(&tree);
2021-12-27 22:19:29 +00:00
println!("< {:?}", eval::eval(&tree, &mut env))
2021-12-16 18:23:02 +00:00
}
}
2021-12-17 02:57:20 +00:00
#[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)
}
}