Add a lot of new stuff to the compile mod

* compile::sym is now compile::name
* add basic block structure
* add visitor pattern
* some other minor things (e.g. syn::ast::prelude)

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-05-19 15:26:38 -04:00
parent c0833086b6
commit 8dc89f7153
9 changed files with 316 additions and 31 deletions

59
src/compile/ir.rs Normal file
View File

@@ -0,0 +1,59 @@
use crate::{
compile::Ctx,
obj::Sym,
syn::{ast, span::*},
};
pub type Body = Vec<Stmt>;
#[derive(Debug, Clone)]
pub enum Stmt {
Eval(Expr),
Assign(Lhs, Expr),
}
#[derive(Debug, Clone)]
pub enum Lhs {
Sym(Sym),
Complex(Expr),
}
#[derive(Debug, Clone)]
pub enum Expr {
Call(Box<Expr>, Vec<Expr>),
Base(BaseExpr),
}
#[derive(Debug, Clone)]
pub enum BaseExprKind {
Num(i64),
Str(String),
Sym(Sym),
Ident(String),
}
#[derive(Debug, Clone)]
pub struct BaseExpr {
pub kind: BaseExprKind,
pub span: Span,
}
// FromAst and IntoAst are just so we can use .into_ast(ctx, text)
// some impls may not need ctx &mut ref - but probably needed for symbol resolution
pub trait FromAst<A> {
fn from_ast(other: A, ctx: &mut Ctx, text: &str) -> Self;
}
pub trait IntoIr<I> {
fn into_ir(self, ctx: &mut Ctx, text: &str) -> I;
}
impl<A, I> IntoIr<I> for A
where
I: FromAst<A>,
{
fn into_ir(self, ctx: &mut Ctx, text: &str) -> I {
FromAst::from_ast(self, ctx, text)
}
}