2020-01-20 12:40:07 +00:00
|
|
|
use crate::{
|
|
|
|
lexer::Lexer,
|
|
|
|
parser::{Error as ParserError, Parser},
|
|
|
|
};
|
|
|
|
use std::io::{self, BufRead, Result as IoResult, Write};
|
2019-02-05 08:57:20 +00:00
|
|
|
|
2019-12-25 12:25:15 +00:00
|
|
|
const PROMPT: &[u8] = b">> ";
|
2019-02-05 08:57:20 +00:00
|
|
|
|
|
|
|
pub fn init() {
|
|
|
|
let stdin = io::stdin();
|
|
|
|
let read_handle = stdin.lock();
|
|
|
|
let stdout = io::stdout();
|
|
|
|
let write_handle = stdout.lock();
|
|
|
|
|
|
|
|
start(read_handle, write_handle);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn start<R: BufRead, W: Write>(mut ip: R, mut out: W) {
|
|
|
|
loop {
|
2019-12-25 12:25:15 +00:00
|
|
|
out.write_all(PROMPT).unwrap();
|
2019-02-05 08:57:20 +00:00
|
|
|
out.flush().unwrap();
|
|
|
|
let mut s = String::new();
|
|
|
|
ip.read_line(&mut s).unwrap();
|
2019-04-14 11:15:40 +00:00
|
|
|
|
2020-01-20 12:40:07 +00:00
|
|
|
let tokens = Lexer::new(&s);
|
2019-12-25 17:37:39 +00:00
|
|
|
let mut parser = Parser::new(tokens);
|
2020-01-19 14:27:53 +00:00
|
|
|
let program = parser.parse_program();
|
2020-01-20 12:40:07 +00:00
|
|
|
if !parser.errors.is_empty() {
|
|
|
|
print_parser_errors(&mut out, &parser.errors).unwrap();
|
|
|
|
continue;
|
|
|
|
}
|
2020-01-20 14:16:51 +00:00
|
|
|
if let Some(program) = program {
|
|
|
|
for stmt in &program.statements {
|
|
|
|
out.write_fmt(format_args!("{}\n", stmt)).unwrap();
|
2020-01-20 12:40:07 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn print_parser_errors<W: Write>(mut out: W, errors: &[ParserError]) -> IoResult<()> {
|
|
|
|
for error in errors {
|
|
|
|
out.write_fmt(format_args!("\t{}\n", error)).unwrap();
|
2019-02-05 08:57:20 +00:00
|
|
|
}
|
2020-01-20 12:40:07 +00:00
|
|
|
out.flush()
|
2019-02-05 08:57:20 +00:00
|
|
|
}
|