main.rs 1.1 KB

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