Kill old trait
This commit is contained in:
parent
fb009497a4
commit
55e1600b97
@ -18,86 +18,6 @@ pub struct ParseError {
|
|||||||
|
|
||||||
pub struct LLVMCodeString(pub String);
|
pub struct LLVMCodeString(pub String);
|
||||||
|
|
||||||
pub trait ProgrammingLanguage {
|
|
||||||
type Token: Debug;
|
|
||||||
type AST: Debug;
|
|
||||||
type Evaluator: EvaluationMachine;
|
|
||||||
|
|
||||||
fn name() -> String;
|
|
||||||
fn tokenize(input: &str) -> Result<Vec<Self::Token>, TokenError>;
|
|
||||||
fn parse(input: Vec<Self::Token>) -> Result<Self::AST, ParseError>;
|
|
||||||
fn evaluate(ast: Self::AST, evaluator: &mut Self::Evaluator) -> Vec<String>;
|
|
||||||
fn compile(ast: Self::AST) -> LLVMCodeString;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait EvaluationMachine {
|
|
||||||
fn set_option(&mut self, option: &str, value: bool) -> bool;
|
|
||||||
fn new() -> Self;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct LanguageInterfaceOptions {
|
|
||||||
pub show_parse: bool,
|
|
||||||
pub show_tokens: bool,
|
|
||||||
pub show_llvm_ir: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait LanguageInterface {
|
|
||||||
fn evaluate_in_repl(&mut self, input: &str, options: LanguageInterfaceOptions) -> String;
|
|
||||||
fn get_language_name(&self) -> String;
|
|
||||||
fn set_option(&mut self, option: &str, value: bool) -> bool;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<PL, T, A, E> LanguageInterface for (PL, PL::Evaluator) where PL: ProgrammingLanguage<Token=T, AST=A, Evaluator=E>, T: Debug, A: Debug, E: EvaluationMachine {
|
|
||||||
fn set_option(&mut self, option: &str, value: bool) -> bool {
|
|
||||||
self.1.set_option(option, value)
|
|
||||||
}
|
|
||||||
fn get_language_name(&self) -> String {
|
|
||||||
PL::name()
|
|
||||||
}
|
|
||||||
fn evaluate_in_repl(&mut self, input: &str, options: LanguageInterfaceOptions) -> String {
|
|
||||||
let mut output = String::new();
|
|
||||||
|
|
||||||
let tokens = match PL::tokenize(input) {
|
|
||||||
Ok(tokens) => tokens,
|
|
||||||
Err(err) => {
|
|
||||||
output.push_str(&format!("Tokenization error: {}\n", err.msg));
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if options.show_tokens {
|
|
||||||
output.push_str(&format!("Tokens: {:?}\n", tokens));
|
|
||||||
}
|
|
||||||
|
|
||||||
let ast = match PL::parse(tokens) {
|
|
||||||
Ok(ast) => ast,
|
|
||||||
Err(err) => {
|
|
||||||
output.push_str(&format!("Parse error: {:?}\n", err.msg));
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if options.show_parse {
|
|
||||||
output.push_str(&format!("AST: {:?}\n", ast));
|
|
||||||
}
|
|
||||||
|
|
||||||
if options.show_llvm_ir {
|
|
||||||
let LLVMCodeString(s) = PL::compile(ast);
|
|
||||||
output.push_str(&s);
|
|
||||||
} else {
|
|
||||||
// for now only handle last output
|
|
||||||
let ref mut evaluator = self.1;
|
|
||||||
let mut full_output: Vec<String> = PL::evaluate(ast, evaluator);
|
|
||||||
output.push_str(&full_output.pop().unwrap_or("".to_string()));
|
|
||||||
}
|
|
||||||
output
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* below here is new versions of everything */
|
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct EvalOptions {
|
pub struct EvalOptions {
|
||||||
pub debug_tokens: bool,
|
pub debug_tokens: bool,
|
||||||
@ -109,9 +29,6 @@ pub struct EvalOptions {
|
|||||||
pub trait ProgrammingLanguageInterface {
|
pub trait ProgrammingLanguageInterface {
|
||||||
fn evaluate_in_repl(&mut self, input: &str, eval_options: EvalOptions) -> Vec<String>;
|
fn evaluate_in_repl(&mut self, input: &str, eval_options: EvalOptions) -> Vec<String>;
|
||||||
fn get_language_name(&self) -> String;
|
fn get_language_name(&self) -> String;
|
||||||
fn set_option(&mut self, option: &str, value: bool) -> bool {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait CompileableLanguage : ProgrammingLanguageInterface {
|
pub trait CompileableLanguage : ProgrammingLanguageInterface {
|
||||||
|
20
src/main.rs
20
src/main.rs
@ -29,15 +29,11 @@ use virtual_machine::{run_vm, run_assembler};
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let languages: Vec<Box<ProgrammingLanguageInterface>> =
|
let languages: Vec<Box<ProgrammingLanguageInterface>> =
|
||||||
vec![
|
vec![
|
||||||
Box::new(schala_lang::Schala::new()),
|
Box::new(schala_lang::Schala::new()),
|
||||||
Box::new(maaru_lang::Maaru::new()),
|
Box::new(maaru_lang::Maaru::new()),
|
||||||
Box::new(robo_lang::Robo::new()),
|
Box::new(robo_lang::Robo::new()),
|
||||||
/*
|
];
|
||||||
Box::new((schala_lang::Schala::new(), schala_lang::SchalaEvaluator::new())),
|
|
||||||
Box::new((maaru_lang::Maaru::new(), maaru_lang::MaaruEvaluator::new(None))),
|
|
||||||
*/
|
|
||||||
];
|
|
||||||
|
|
||||||
let option_matches =
|
let option_matches =
|
||||||
match program_options().parse(std::env::args()) {
|
match program_options().parse(std::env::args()) {
|
||||||
@ -126,7 +122,7 @@ fn program_options() -> getopts::Options {
|
|||||||
options
|
options
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_noninteractive<T: ProgrammingLanguageInterface>(filename: &str, language: &mut T, options: EvalOptions, compile: bool) {
|
fn run_noninteractive<T: ProgrammingLanguageInterface>(filename: &str, language: &mut T, _options: EvalOptions, compile: bool) {
|
||||||
let mut source_file = File::open(&Path::new(filename)).unwrap();
|
let mut source_file = File::open(&Path::new(filename)).unwrap();
|
||||||
let mut buffer = String::new();
|
let mut buffer = String::new();
|
||||||
source_file.read_to_string(&mut buffer).unwrap();
|
source_file.read_to_string(&mut buffer).unwrap();
|
||||||
@ -306,8 +302,8 @@ impl Repl {
|
|||||||
Some(&"tokens") => self.show_tokens = show,
|
Some(&"tokens") => self.show_tokens = show,
|
||||||
Some(&"parse") => self.show_parse = show,
|
Some(&"parse") => self.show_parse = show,
|
||||||
Some(&"eval") => {
|
Some(&"eval") => {
|
||||||
let ref mut language = self.languages[self.current_language_index];
|
//let ref mut language = self.languages[self.current_language_index];
|
||||||
language.set_option("trace_evaluation", show);
|
//language.set_option("trace_evaluation", show);
|
||||||
},
|
},
|
||||||
Some(&"llvm") => self.show_llvm_ir = show,
|
Some(&"llvm") => self.show_llvm_ir = show,
|
||||||
Some(e) => {
|
Some(e) => {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
extern crate itertools;
|
extern crate itertools;
|
||||||
use self::itertools::Itertools;
|
use self::itertools::Itertools;
|
||||||
|
|
||||||
use language::{ProgrammingLanguageInterface, EvalOptions, ProgrammingLanguage, ParseError, TokenError, LLVMCodeString};
|
use language::{ProgrammingLanguageInterface, EvalOptions, ParseError, TokenError, LLVMCodeString};
|
||||||
|
|
||||||
pub struct Robo {
|
pub struct Robo {
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ impl ProgrammingLanguageInterface for Robo {
|
|||||||
"Robo".to_string()
|
"Robo".to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn evaluate_in_repl(&mut self, input: &str, eval_options: EvalOptions) -> Vec<String> {
|
fn evaluate_in_repl(&mut self, input: &str, _eval_options: EvalOptions) -> Vec<String> {
|
||||||
let mut output = vec!();
|
let mut output = vec!();
|
||||||
let tokens = match tokenize(input) {
|
let tokens = match tokenize(input) {
|
||||||
Ok(tokens) => tokens,
|
Ok(tokens) => tokens,
|
||||||
|
Loading…
Reference in New Issue
Block a user