what did this commit even do
This commit is contained in:
parent
02011dfe44
commit
e836c6f110
5 changed files with 55 additions and 12 deletions
|
@ -2,7 +2,7 @@ use anyhow::Result;
|
||||||
use cranelift::prelude::*;
|
use cranelift::prelude::*;
|
||||||
use cranelift_module::{Linkage, Module};
|
use cranelift_module::{Linkage, Module};
|
||||||
|
|
||||||
use super::{Decl, Program};
|
use crate::ast::{Decl, Program};
|
||||||
|
|
||||||
impl Program {
|
impl Program {
|
||||||
pub fn codegen(&self, mut module: impl Module) -> Result<()> {
|
pub fn codegen(&self, mut module: impl Module) -> Result<()> {
|
||||||
|
@ -26,7 +26,7 @@ impl Program {
|
||||||
ctx.func.signature.returns.push(AbiParam::new(int));
|
ctx.func.signature.returns.push(AbiParam::new(int));
|
||||||
|
|
||||||
let func_id = module.declare_function(
|
let func_id = module.declare_function(
|
||||||
&func.name,
|
&func.name.0,
|
||||||
Linkage::Export,
|
Linkage::Export,
|
||||||
&ctx.func.signature,
|
&ctx.func.signature,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
pub mod ast;
|
pub mod ast;
|
||||||
|
pub mod codegen;
|
||||||
pub mod name_res;
|
pub mod name_res;
|
||||||
pub mod parser;
|
pub mod parser;
|
||||||
|
pub mod type_check;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
||||||
use std::fs::{File, OpenOptions};
|
use std::fs::{File, OpenOptions};
|
||||||
|
@ -31,11 +33,10 @@ fn main() -> Result<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let parsed = parser::parse(&contents)?;
|
let parsed = parser::parse(&contents)?;
|
||||||
println!("parsed: {:?}", parsed);
|
|
||||||
|
|
||||||
let namespaces = Namespaces::create(parsed);
|
let namespaces = Namespaces::create(parsed);
|
||||||
println!("namespaces: {:?}", namespaces);
|
let resolved = namespaces.name_resolution();
|
||||||
let tree = namespaces.name_resolution();
|
println!("resolved: {:?}", resolved);
|
||||||
|
|
||||||
let isa = {
|
let isa = {
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
|
@ -11,20 +11,44 @@ use petgraph::{algo, graphmap::DiGraphMap};
|
||||||
use crate::ast::*;
|
use crate::ast::*;
|
||||||
use crate::utils::Id;
|
use crate::utils::Id;
|
||||||
|
|
||||||
|
type HDecls = HashMap<Id, HDecl>;
|
||||||
type Graph = DiGraphMap<Id, ()>;
|
type Graph = DiGraphMap<Id, ()>;
|
||||||
type Scopes = Vec<HashSet<String>>;
|
type Scopes = Vec<HashSet<String>>;
|
||||||
|
|
||||||
pub enum HExpr {}
|
#[derive(Debug)]
|
||||||
|
pub enum HDecl {
|
||||||
|
Func(HFunc),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct HFunc {}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct HExpr {}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct HStmt {}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct HType {}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Namespaces {
|
pub struct Namespaces {
|
||||||
funcs: HashMap<Id, Func>,
|
funcs: HashMap<Id, Func>,
|
||||||
types: HashMap<Id, Type>,
|
types: HashMap<Id, Type>,
|
||||||
|
|
||||||
|
hfuncs: HashMap<Id, HFunc>,
|
||||||
|
|
||||||
func_names: HashMap<String, Id>,
|
func_names: HashMap<String, Id>,
|
||||||
type_names: HashMap<String, Id>,
|
type_names: HashMap<String, Id>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct NamesResolved {
|
||||||
|
pub decls: HashMap<Id, HDecl>,
|
||||||
|
pub visit_order: Vec<HashSet<Id>>,
|
||||||
|
}
|
||||||
|
|
||||||
impl Namespaces {
|
impl Namespaces {
|
||||||
pub fn create(program: Program) -> Self {
|
pub fn create(program: Program) -> Self {
|
||||||
let mut funcs = HashMap::new();
|
let mut funcs = HashMap::new();
|
||||||
|
@ -46,27 +70,35 @@ impl Namespaces {
|
||||||
Namespaces {
|
Namespaces {
|
||||||
funcs,
|
funcs,
|
||||||
types,
|
types,
|
||||||
|
hfuncs: HashMap::new(),
|
||||||
func_names,
|
func_names,
|
||||||
type_names,
|
type_names,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn name_resolution(&self) {
|
pub fn name_resolution(&self) -> NamesResolved {
|
||||||
|
let mut hdecls = HashMap::new();
|
||||||
let mut graph = Graph::new();
|
let mut graph = Graph::new();
|
||||||
|
|
||||||
for (id, func) in self.funcs.iter() {
|
for (id, func) in self.funcs.iter() {
|
||||||
walk_func(&mut graph, &self, *id, func);
|
walk_func(&mut hdecls, &mut graph, &self, *id, func);
|
||||||
}
|
}
|
||||||
println!("graph: {:?}", graph);
|
|
||||||
|
|
||||||
|
let mut visit_order = Vec::new();
|
||||||
let scc = algo::tarjan_scc(&graph);
|
let scc = algo::tarjan_scc(&graph);
|
||||||
for group in scc.iter() {
|
for group in scc.iter() {
|
||||||
println!("group: {:?}", group);
|
let set = group.iter().cloned().collect();
|
||||||
|
visit_order.push(set);
|
||||||
|
}
|
||||||
|
|
||||||
|
NamesResolved {
|
||||||
|
decls: hdecls,
|
||||||
|
visit_order,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn walk_func(g: &mut Graph, n: &Namespaces, src: Id, f: &Func) {
|
fn walk_func(h: &mut HDecls, g: &mut Graph, n: &Namespaces, src: Id, f: &Func) {
|
||||||
let mut scopes = Vec::new();
|
let mut scopes = Vec::new();
|
||||||
scopes.push(HashSet::new());
|
scopes.push(HashSet::new());
|
||||||
for s in f.stmts.iter() {
|
for s in f.stmts.iter() {
|
||||||
|
@ -77,6 +109,9 @@ fn walk_func(g: &mut Graph, n: &Namespaces, src: Id, f: &Func) {
|
||||||
}
|
}
|
||||||
scopes.pop();
|
scopes.pop();
|
||||||
assert!(scopes.is_empty());
|
assert!(scopes.is_empty());
|
||||||
|
|
||||||
|
let func = HFunc {};
|
||||||
|
h.insert(src, HDecl::Func(func));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn walk_stmt(g: &mut Graph, n: &Namespaces, src: Id, sc: &mut Scopes, s: &Stmt) {
|
fn walk_stmt(g: &mut Graph, n: &Namespaces, src: Id, sc: &mut Scopes, s: &Stmt) {
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
//! Type checking
|
||||||
|
//! ===
|
||||||
|
//!
|
||||||
|
//! This module implements a Hindley-Milner based type checker.
|
||||||
|
|
||||||
|
pub fn type_check() {}
|
|
@ -8,6 +8,7 @@ lazy_static! {
|
||||||
static ref N: Arc<Mutex<usize>> = Arc::new(Mutex::new(0));
|
static ref N: Arc<Mutex<usize>> = Arc::new(Mutex::new(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An Id is a uniquely generated value, whose implementation is opaque.
|
||||||
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
pub struct Id(usize);
|
pub struct Id(usize);
|
||||||
|
|
||||||
|
@ -17,7 +18,7 @@ impl Default for Id {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gen_int() -> usize {
|
fn gen_int() -> usize {
|
||||||
let mut n = N.lock();
|
let mut n = N.lock();
|
||||||
let res = *n;
|
let res = *n;
|
||||||
*n += 1;
|
*n += 1;
|
||||||
|
|
Loading…
Reference in a new issue