able-script/src/repl.rs

53 lines
1.6 KiB
Rust
Raw Normal View History

use logos::Source;
use rustyline::Editor;
use crate::{interpret::ExecEnv, parser::Parser};
2021-06-16 10:29:27 -05:00
pub fn repl(ast_print: bool) {
let mut rl = Editor::<()>::new();
let mut env = ExecEnv::new();
loop {
let readline = rl.readline(":: ");
match readline {
Ok(line) => {
if &line == "exit" {
println!("bye");
break;
}
let mut parser = Parser::new(&line);
let value = parser.init().and_then(|ast| {
2021-06-16 10:29:27 -05:00
if ast_print {
println!("{:#?}", &ast);
}
env.eval_stmts(&ast)
});
2021-06-04 18:56:26 -05:00
if let Err(e) = value {
println!(
"Error `{:?}` occurred at span: {:?} = `{:?}`",
e.kind,
e.span.clone(),
line.slice(e.span.clone())
);
println!(" | {}", line);
println!(
" {}{}-- Here",
" ".repeat(e.span.start),
"^".repeat((e.span.end - e.span.start).max(1))
);
}
}
Err(rustyline::error::ReadlineError::Eof) => {
println!("bye");
break;
}
Err(rustyline::error::ReadlineError::Interrupted) => (),
Err(e) => {
println!("Error: {:?}", e);
break;
}
}
}
}