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() {
|
2021-12-17 05:45:22 +00:00
|
|
|
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();
|
2021-12-17 05:45:22 +00:00
|
|
|
for i in tree {
|
2021-12-27 22:19:29 +00:00
|
|
|
eval::eval(&i, &mut env).unwrap();
|
2021-12-17 05:45:22 +00:00
|
|
|
}
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|