type checking / symbol table stuff

This commit is contained in:
greg 2017-10-08 12:22:04 -07:00
parent e412fb9a89
commit 62edc7c996

View File

@ -1,11 +1,17 @@
use std::collections::HashMap;
use schala_lang::parsing::{AST, Statement, Declaration, Expression, ExpressionType, Operation, TypeAnno}; use schala_lang::parsing::{AST, Statement, Declaration, Expression, ExpressionType, Operation, TypeAnno};
#[derive(Debug, PartialEq, Eq, Hash)]
struct PathSpecifier(String);
struct SymbolTable { struct SymbolTable {
map: HashMap<PathSpecifier, Expression>,
} }
impl SymbolTable { impl SymbolTable {
fn new() -> SymbolTable { fn new() -> SymbolTable {
SymbolTable { } SymbolTable { map: HashMap::new() }
} }
fn add_symbols(&mut self, ast: &AST) { fn add_symbols(&mut self, ast: &AST) {
@ -51,18 +57,25 @@ impl TypeContext {
return Err(format!("Declarations not supported")); return Err(format!("Declarations not supported"));
}, },
&Statement::ExpressionStatement(ref expr) => { &Statement::ExpressionStatement(ref expr) => {
match (&expr.0, &expr.1) { self.expr_type_check(expr)?;
(&IntLiteral(_), &Some(ref t)) => {
match t {
&TypeAnno::Singleton { ref name, ref params } if **name == "Int" && params.len() == 0 => (),
t => return Err(format!("Bad type {:?} for int literal", t)),
}
},
_ => (),
}
} }
} }
} }
Ok(SchalaType { }) Ok(SchalaType { })
} }
fn expr_type_check(&mut self, expr: &Expression) -> TypeCheckResult {
use self::ExpressionType::*;
match (&expr.0, &expr.1) {
(&IntLiteral(_), &Some(ref t)) => {
match t {
&TypeAnno::Singleton { ref name, ref params } if **name == "Int" && params.len() == 0 => (),
t => return Err(format!("Bad type {:?} for int literal", t)),
}
},
_ => (),
}
Ok(SchalaType { })
}
} }