More work
This commit is contained in:
parent
c4666b82ec
commit
07af54b78a
@ -36,7 +36,7 @@ mod eval;
|
|||||||
pub struct Schala {
|
pub struct Schala {
|
||||||
state: eval::State<'static>,
|
state: eval::State<'static>,
|
||||||
symbol_table: Rc<RefCell<symbol_table::SymbolTable>>,
|
symbol_table: Rc<RefCell<symbol_table::SymbolTable>>,
|
||||||
type_context: typechecking::TypeContext,
|
type_context: typechecking::TypeContext<'static>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Schala {
|
impl Schala {
|
||||||
|
@ -9,6 +9,7 @@ use itertools::Itertools;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
use parsing;
|
use parsing;
|
||||||
|
use util::StateStack;
|
||||||
|
|
||||||
pub type TypeName = Rc<String>;
|
pub type TypeName = Rc<String>;
|
||||||
type TypeResult<T> = Result<T, String>;
|
type TypeResult<T> = Result<T, String>;
|
||||||
@ -28,11 +29,13 @@ enum TConst {
|
|||||||
Custom(String)
|
Custom(String)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TypeContext;
|
pub struct TypeContext<'a> {
|
||||||
|
values: StateStack<'a, TypeName, Type>
|
||||||
|
}
|
||||||
|
|
||||||
impl TypeContext {
|
impl<'a> TypeContext<'a> {
|
||||||
pub fn new() -> TypeContext {
|
pub fn new() -> TypeContext<'static> {
|
||||||
TypeContext { }
|
TypeContext { values: StateStack::new(None) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn debug_types(&self) -> String {
|
pub fn debug_types(&self) -> String {
|
||||||
@ -45,7 +48,7 @@ impl TypeContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TypeContext {
|
impl<'a> TypeContext<'a> {
|
||||||
fn infer_block(&mut self, block: &Vec<parsing::Statement>) -> TypeResult<Type> {
|
fn infer_block(&mut self, block: &Vec<parsing::Statement>) -> TypeResult<Type> {
|
||||||
let mut output = Type::Const(TConst::Unit);
|
let mut output = Type::Const(TConst::Unit);
|
||||||
for statement in block {
|
for statement in block {
|
||||||
@ -60,6 +63,13 @@ impl TypeContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn infer_decl(&mut self, decl: &parsing::Declaration) -> TypeResult<Type> {
|
fn infer_decl(&mut self, decl: &parsing::Declaration) -> TypeResult<Type> {
|
||||||
|
use parsing::Declaration::*;
|
||||||
|
match decl {
|
||||||
|
Binding { name, expr, .. } => {
|
||||||
|
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
Ok(Type::Const(TConst::Unit))
|
Ok(Type::Const(TConst::Unit))
|
||||||
}
|
}
|
||||||
fn infer_expr(&mut self, expr: &parsing::Expression) -> TypeResult<Type> {
|
fn infer_expr(&mut self, expr: &parsing::Expression) -> TypeResult<Type> {
|
||||||
@ -79,6 +89,10 @@ impl TypeContext {
|
|||||||
Ok(match expr {
|
Ok(match expr {
|
||||||
NatLiteral(_) => Type::Const(Nat),
|
NatLiteral(_) => Type::Const(Nat),
|
||||||
StringLiteral(_) => Type::Const(StringT),
|
StringLiteral(_) => Type::Const(StringT),
|
||||||
|
Call { f, arguments } => {
|
||||||
|
|
||||||
|
return Err(format!("NOTDONE"))
|
||||||
|
},
|
||||||
_ => Type::Const(Unit)
|
_ => Type::Const(Unit)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ use std::collections::HashMap;
|
|||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::cmp::Eq;
|
use std::cmp::Eq;
|
||||||
|
|
||||||
|
//TODO rename this ScopeStack
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct StateStack<'a, T: 'a, V: 'a> where T: Hash + Eq {
|
pub struct StateStack<'a, T: 'a, V: 'a> where T: Hash + Eq {
|
||||||
parent: Option<&'a StateStack<'a, T, V>>,
|
parent: Option<&'a StateStack<'a, T, V>>,
|
||||||
@ -27,6 +28,7 @@ impl<'a, T, V> StateStack<'a, T, V> where T: Hash + Eq {
|
|||||||
(Some(value), _) => Some(value),
|
(Some(value), _) => Some(value),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//TODO rename new_scope
|
||||||
pub fn new_frame(&'a self, name: Option<String>) -> StateStack<'a, T, V> where T: Hash + Eq {
|
pub fn new_frame(&'a self, name: Option<String>) -> StateStack<'a, T, V> where T: Hash + Eq {
|
||||||
StateStack {
|
StateStack {
|
||||||
parent: Some(self),
|
parent: Some(self),
|
||||||
|
Loading…
Reference in New Issue
Block a user