main.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use matzo::grammar::StmtsParser;
  2. use matzo::interp::State;
  3. use matzo::lexer::tokens;
  4. fn run(src: &str) {
  5. let lexed = tokens(&src);
  6. let stmts = StmtsParser::new().parse(lexed).unwrap();
  7. let mut state = State::new();
  8. for stmt in stmts {
  9. if let Err(err) = state.execute(&stmt) {
  10. eprintln!("error: {}", err);
  11. }
  12. }
  13. }
  14. fn run_repl() -> Result<(), Box<dyn std::error::Error>> {
  15. let mut rl = rustyline::Editor::<()>::new();
  16. let mut state = State::new();
  17. let parser = StmtsParser::new();
  18. println!("matzo interpreter");
  19. println!("(work-in-progress)");
  20. loop {
  21. let line = match rl.readline(">>> ") {
  22. Ok(ln) => ln,
  23. Err(rustyline::error::ReadlineError::Eof) |
  24. Err(rustyline::error::ReadlineError::Interrupted) =>
  25. return Ok(()),
  26. err => err?,
  27. };
  28. let lexed = tokens(&line);
  29. let stmts = match parser.parse(lexed) {
  30. Ok(stmts) => stmts,
  31. Err(err) => {
  32. eprintln!("{:?}", err);
  33. continue;
  34. }
  35. };
  36. for stmt in stmts {
  37. if let Err(err) = state.execute(&stmt) {
  38. eprintln!("error: {}", err);
  39. }
  40. }
  41. }
  42. }
  43. fn main() {
  44. let args = std::env::args().skip(1).collect::<Vec<String>>();
  45. if args.is_empty() {
  46. run_repl().unwrap();
  47. return;
  48. }
  49. for arg in args {
  50. let buf = std::fs::read_to_string(arg).unwrap();
  51. run(&buf);
  52. }
  53. }