From e054c4b27f9aad468c3434fe45da089c42d971e6 Mon Sep 17 00:00:00 2001 From: greg Date: Mon, 23 Oct 2017 00:45:01 -0700 Subject: [PATCH] Revert "Starting to split project into multiple crates" This reverts commit e3b0f4a51ebaaa5469d7340b640f6b8bf3473113. Bah, this was a bad idea, wrong way to do it --- Cargo.toml | 4 - schala-lang/src/mod.rs | 0 src/main.rs | 9 +- {schala-lang/src => src/schala_lang}/eval.rs | 3 +- src/schala_lang/mod.rs | 95 +++++++++++++++++++ .../src => src/schala_lang}/parsing.rs | 0 .../src => src/schala_lang}/type_check.rs | 3 +- 7 files changed, 98 insertions(+), 16 deletions(-) delete mode 100644 schala-lang/src/mod.rs rename {schala-lang/src => src/schala_lang}/eval.rs (98%) create mode 100644 src/schala_lang/mod.rs rename {schala-lang/src => src/schala_lang}/parsing.rs (100%) rename {schala-lang/src => src/schala_lang}/type_check.rs (98%) diff --git a/Cargo.toml b/Cargo.toml index 348aecc..921c6af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,5 @@ rocket_contrib = "*" phf = "0.7.12" includedir = "0.2.0" -schala-lang = { path = "schala-lang" } - [build-dependencies] includedir_codegen = "0.2.0" - -[workspace] diff --git a/schala-lang/src/mod.rs b/schala-lang/src/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/main.rs b/src/main.rs index 5cf6649..68534ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,17 +16,13 @@ extern crate rocket_contrib; extern crate includedir; extern crate phf; - -extern crate schala_lang; - use std::path::Path; use std::fs::File; use std::io::{Read, Write}; use std::process::exit; use std::default::Default; - -mod schala_language; +mod schala_lang; mod maaru_lang; mod robo_lang; @@ -370,6 +366,3 @@ fn program_options() -> getopts::Options { options } - - - diff --git a/schala-lang/src/eval.rs b/src/schala_lang/eval.rs similarity index 98% rename from schala-lang/src/eval.rs rename to src/schala_lang/eval.rs index 9bd7725..536b370 100644 --- a/schala-lang/src/eval.rs +++ b/src/schala_lang/eval.rs @@ -1,8 +1,7 @@ +use schala_lang::parsing::{AST, Statement, Declaration, Expression, Variant, ExpressionType, Operation}; use std::collections::HashMap; use std::rc::Rc; -use parsing::{AST, Statement, Declaration, Expression, Variant, ExpressionType, Operation}; - pub struct ReplState { values: HashMap, ValueEntry>, } diff --git a/src/schala_lang/mod.rs b/src/schala_lang/mod.rs new file mode 100644 index 0000000..7dff4d1 --- /dev/null +++ b/src/schala_lang/mod.rs @@ -0,0 +1,95 @@ +use itertools::Itertools; +use language::{ProgrammingLanguageInterface, EvalOptions, TraceArtifact, ReplOutput}; + +mod parsing; +mod type_check; +mod eval; + +use self::type_check::{TypeContext}; + +pub struct Schala { + state: eval::ReplState, + type_context: TypeContext +} + +impl Schala { + pub fn new() -> Schala { + Schala { + state: eval::ReplState::new(), + type_context: TypeContext::new(), + } + } +} + +impl ProgrammingLanguageInterface for Schala { + fn get_language_name(&self) -> String { + "Schala".to_string() + } + + fn get_source_file_suffix(&self) -> String { + format!("schala") + } + + fn evaluate_in_repl(&mut self, input: &str, options: &EvalOptions) -> ReplOutput { + let mut output = ReplOutput::default(); + let tokens = parsing::tokenize(input); + if options.debug_tokens { + let token_string = tokens.iter().map(|t| format!("{:?}<{}>", t.token_type, t.offset)).join(", "); + output.add_artifact(TraceArtifact::new("tokens", format!("{:?}", token_string))); + + } + + { + 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; + } + } + + let ast = match parsing::parse(tokens) { + (Ok(ast), trace) => { + if options.debug_parse { + output.add_artifact(TraceArtifact::new_parse_trace(trace)); + output.add_artifact(TraceArtifact::new("ast", format!("{:?}", ast))); + } + ast + }, + (Err(err), trace) => { + output.add_artifact(TraceArtifact::new_parse_trace(trace)); + output.add_output(format!("Parse error: {:?}\n", err.msg)); + return output; + } + }; + + self.type_context.add_symbols(&ast); + + if options.debug_symbol_table { + let text = self.type_context.debug_symbol_table(); + output.add_artifact(TraceArtifact::new("symbol_table", text)); + } + + match self.type_context.type_check(&ast) { + Ok(ty) => { + output.add_artifact(TraceArtifact::new("type_check", format!("type: {:?}", ty))); + }, + Err(msg) => { + output.add_artifact(TraceArtifact::new("type_check", msg)); + output.add_output(format!("Type error")); + return output; + } + } + + let evaluation_output = self.state.evaluate(ast); + let mut acc = String::new(); + let mut iter = evaluation_output.iter().peekable(); + while let Some(s) = iter.next() { + acc.push_str(&s); + if let Some(_) = iter.peek() { + acc.push_str("\n"); + } + } + output.add_output(acc); + return output; + } +} diff --git a/schala-lang/src/parsing.rs b/src/schala_lang/parsing.rs similarity index 100% rename from schala-lang/src/parsing.rs rename to src/schala_lang/parsing.rs diff --git a/schala-lang/src/type_check.rs b/src/schala_lang/type_check.rs similarity index 98% rename from schala-lang/src/type_check.rs rename to src/schala_lang/type_check.rs index f7f7f0d..caf15e7 100644 --- a/schala-lang/src/type_check.rs +++ b/src/schala_lang/type_check.rs @@ -1,10 +1,9 @@ use std::collections::HashMap; use std::rc::Rc; -use parsing::{AST, Statement, Declaration, Signature, Expression, ExpressionType, Operation, Variant, TypeName}; - //SKOLEMIZATION - how you prevent an unassigned existential type variable from leaking! +use schala_lang::parsing::{AST, Statement, Declaration, Signature, Expression, ExpressionType, Operation, Variant, TypeName}; // from Niko's talk /* fn type_check(expression, expected_ty) -> Ty {