main.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. use matzo::grammar::StmtsParser;
  2. use matzo::interp::State;
  3. use std::io::Write;
  4. fn run(src: &str) {
  5. let stmts = StmtsParser::new().parse(&src).unwrap();
  6. let mut state = State::new();
  7. for stmt in stmts {
  8. if let Err(err) = state.execute(&stmt) {
  9. eprintln!("error: {}", err);
  10. }
  11. }
  12. }
  13. fn run_repl() -> std::io::Result<()> {
  14. let mut state = State::new();
  15. let parser = StmtsParser::new();
  16. let mut stdout = std::io::stdout();
  17. let stdin = std::io::stdin();
  18. let mut buf = String::new();
  19. loop {
  20. stdout.write(b">>> ")?;
  21. stdout.flush()?;
  22. buf.clear();
  23. stdin.read_line(&mut buf)?;
  24. let stmts = match parser.parse(&buf) {
  25. Ok(stmts) => stmts,
  26. Err(err) => {
  27. eprintln!("{:?}", err);
  28. continue;
  29. }
  30. };
  31. for stmt in stmts {
  32. if let Err(err) = state.execute(&stmt) {
  33. eprintln!("error: {}", err);
  34. }
  35. }
  36. }
  37. }
  38. fn main() {
  39. let args = std::env::args().skip(1).collect::<Vec<String>>();
  40. if args.is_empty() {
  41. run_repl().unwrap();
  42. return;
  43. }
  44. for arg in args {
  45. let buf = std::fs::read_to_string(arg).unwrap();
  46. run(&buf);
  47. }
  48. }