Improvments to interpreter directives parsing

This commit is contained in:
greg 2017-01-13 17:53:23 -08:00
parent d7181afa91
commit 1f50fcc620
1 changed files with 31 additions and 36 deletions

View File

@ -89,7 +89,6 @@ type LineReader = linefeed::Reader<linefeed::terminal::DefaultTerminal>;
struct Repl<'a> { struct Repl<'a> {
show_tokens: bool, show_tokens: bool,
show_parse: bool, show_parse: bool,
show_eval: bool,
evaluator: Evaluator<'a>, evaluator: Evaluator<'a>,
interpreter_directive_sigil: char, interpreter_directive_sigil: char,
reader: LineReader, reader: LineReader,
@ -102,7 +101,6 @@ impl<'a> Repl<'a> {
Repl { Repl {
show_tokens: false, show_tokens: false,
show_parse: false, show_parse: false,
show_eval: false,
evaluator: Evaluator::new_with_opts(None, trace_evaluation), evaluator: Evaluator::new_with_opts(None, trace_evaluation),
interpreter_directive_sigil: '.', interpreter_directive_sigil: '.',
reader: reader, reader: reader,
@ -168,50 +166,47 @@ impl<'a> Repl<'a> {
_ => return false _ => return false
} }
let trimmed_sigil: String = input.chars() let mut iter = input.chars();
.skip(1) iter.next();
.collect(); let trimmed_sigil: &str = iter.as_str();
let commands: Vec<&str> = trimmed_sigil
let commands: Vec<&str> = trimmed_sigil
.split_whitespace() .split_whitespace()
.collect(); .collect();
let cmd: &str = match commands.get(0).clone() { None => return true, Some(s) => s }; let cmd: &str = match commands.get(0).clone() {
None => return true,
Some(s) => s
};
match cmd { match cmd {
"exit" | "quit" => process::exit(0), "exit" | "quit" => process::exit(0),
"history" => { "history" => {
for item in self.reader.history() {
println!("{}", item);
}
}, },
"output_history" => { "set" => {
let show = match commands[1] {
"show" => true,
"hide" => false,
e => {
println!("Bad `set` argument: {}", e);
return true;
}
};
match commands[2] {
"tokens" => self.show_tokens = show,
"parse" => self.show_parse = show,
"eval" => self.evaluator.trace_evaluation = show,
e => {
println!("Bad `show`/`hide` argument: {}", e);
return true;
}
}
}, },
_ => { _ => (),
self.update_state(&commands);
}
} }
return true; return true;
} }
fn update_state(&mut self, input: &Vec<&str>) {
match input[..] {
["set", "show", "tokens", "true"] => {
self.show_tokens = true;
}
["set", "show", "tokens", "false"] => {
self.show_tokens = false;
}
["set", "show", "parse", "true"] => {
self.show_parse = true;
}
["set", "show", "parse", "false"] => {
self.show_parse = false;
}
["set", "show", "eval", "true"] => {
self.evaluator.trace_evaluation = true;
}
["set", "show", "eval", "false"] => {
self.evaluator.trace_evaluation = false;
}
_ => (),
}
}
} }