2017-08-31 20:59:43 -07:00
|
|
|
use language::{ProgrammingLanguageInterface, EvalOptions, TraceArtifact, ReplOutput};
|
2017-08-29 04:15:31 -07:00
|
|
|
|
2017-08-29 04:27:07 -07:00
|
|
|
mod parsing;
|
|
|
|
|
2017-08-29 04:15:31 -07:00
|
|
|
pub struct Schala {
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Schala {
|
|
|
|
pub fn new() -> Schala {
|
|
|
|
Schala { }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-31 14:57:56 -07:00
|
|
|
impl ProgrammingLanguageInterface for Schala {
|
|
|
|
fn get_language_name(&self) -> String {
|
2017-08-29 04:15:31 -07:00
|
|
|
"Schala".to_string()
|
|
|
|
}
|
|
|
|
|
2017-09-01 02:08:26 -07:00
|
|
|
fn evaluate_in_repl(&mut self, input: &str, options: &EvalOptions) -> ReplOutput {
|
2017-08-31 20:59:43 -07:00
|
|
|
let mut output = ReplOutput::default();
|
2017-09-06 23:52:25 -07:00
|
|
|
let tokens = parsing::tokenize(input);
|
|
|
|
if options.debug_tokens {
|
|
|
|
output.add_artifact(TraceArtifact::new("tokens", format!("{:?}", tokens)));
|
|
|
|
}
|
|
|
|
|
2017-09-08 16:42:42 -07:00
|
|
|
{
|
|
|
|
let token_errors: Vec<&String> = tokens.iter().filter_map(|t| t.get_error()).collect();
|
|
|
|
if token_errors.len() != 0 {
|
|
|
|
output.add_output(format!("Tokenization error: {:?}\n", token_errors));
|
|
|
|
return output;
|
|
|
|
}
|
2017-09-06 23:52:25 -07:00
|
|
|
}
|
2017-08-31 16:26:55 -07:00
|
|
|
|
2017-08-31 20:59:43 -07:00
|
|
|
let ast = match parsing::parse(tokens) {
|
|
|
|
Ok(ast) => {
|
|
|
|
if options.debug_parse {
|
2017-09-15 04:23:39 -07:00
|
|
|
output.add_artifact(TraceArtifact::new("Recursive descent calls:", format!("{:?}", "OI")));
|
2017-08-31 20:59:43 -07:00
|
|
|
output.add_artifact(TraceArtifact::new("ast", format!("{:?}", ast)));
|
|
|
|
}
|
|
|
|
ast
|
|
|
|
},
|
|
|
|
Err(err) => {
|
|
|
|
output.add_output(format!("Parse error: {:?}\n", err.msg));
|
2017-08-31 16:26:55 -07:00
|
|
|
return output;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-09-08 16:42:42 -07:00
|
|
|
let evaluation_output = format!("{:?}", ast);
|
2017-08-31 20:59:43 -07:00
|
|
|
output.add_output(evaluation_output);
|
|
|
|
return output;
|
2017-08-29 04:15:31 -07:00
|
|
|
}
|
|
|
|
}
|