Move reduced ir types to separate file
This commit is contained in:
parent
f2c9cf20cb
commit
16164c2235
@ -4,10 +4,12 @@ use crate::builtin::Builtin;
|
|||||||
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::rc::Rc;
|
|
||||||
|
|
||||||
|
mod types;
|
||||||
mod test;
|
mod test;
|
||||||
|
|
||||||
|
pub use types::*;
|
||||||
|
|
||||||
pub fn reduce(ast: &ast::AST, symbol_table: &SymbolTable) -> ReducedIR {
|
pub fn reduce(ast: &ast::AST, symbol_table: &SymbolTable) -> ReducedIR {
|
||||||
let reducer = Reducer::new(symbol_table);
|
let reducer = Reducer::new(symbol_table);
|
||||||
reducer.reduce(ast)
|
reducer.reduce(ast)
|
||||||
@ -209,96 +211,3 @@ impl<'a> Reducer<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The reduced intermediate representation consists of a list of function definitions, and a block
|
|
||||||
/// of entrypoint statements. In a repl or script context this can be an arbitrary list of
|
|
||||||
/// statements, in an executable context will likely just be a pointer to the main() function.
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct ReducedIR {
|
|
||||||
pub functions: HashMap<DefId, FunctionDefinition>,
|
|
||||||
pub entrypoint: Vec<Statement>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ReducedIR {
|
|
||||||
fn debug(&self, symbol_table: &SymbolTable) {
|
|
||||||
println!("Reduced IR:");
|
|
||||||
println!("Functions:");
|
|
||||||
println!("-----------");
|
|
||||||
for (id, callable) in self.functions.iter() {
|
|
||||||
let name = &symbol_table.lookup_symbol_by_def(id).unwrap().local_name;
|
|
||||||
println!("{}({}) -> {:?}", id, name, callable);
|
|
||||||
}
|
|
||||||
println!("");
|
|
||||||
println!("Entrypoint:");
|
|
||||||
println!("-----------");
|
|
||||||
for stmt in self.entrypoint.iter() {
|
|
||||||
println!("{:?}", stmt);
|
|
||||||
}
|
|
||||||
println!("-----------");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Statement {
|
|
||||||
Expression(Expression),
|
|
||||||
Binding {
|
|
||||||
id: DefId,
|
|
||||||
constant: bool,
|
|
||||||
expr: Expression
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Expression {
|
|
||||||
Literal(Literal),
|
|
||||||
Tuple(Vec<Expression>),
|
|
||||||
Lookup {
|
|
||||||
id: DefId, //TODO eventually not everything that can be looked up will have a DefId
|
|
||||||
kind: Lookup,
|
|
||||||
},
|
|
||||||
Assign {
|
|
||||||
lval: DefId,
|
|
||||||
rval: Box<Expression>,
|
|
||||||
},
|
|
||||||
Callable(Function),
|
|
||||||
Call {
|
|
||||||
f: Box<Expression>,
|
|
||||||
args: Vec<Expression>
|
|
||||||
},
|
|
||||||
Unimplemented,
|
|
||||||
ReductionError(String),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Expression {
|
|
||||||
pub fn unit() -> Self {
|
|
||||||
Expression::Tuple(vec![])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct FunctionDefinition {
|
|
||||||
pub body: Vec<Statement>
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum Function {
|
|
||||||
Builtin(Builtin),
|
|
||||||
UserDefined(DefId)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Lookup {
|
|
||||||
LocalVar,
|
|
||||||
GlobalVar,
|
|
||||||
Function,
|
|
||||||
Param,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum Literal {
|
|
||||||
Nat(u64),
|
|
||||||
Int(i64),
|
|
||||||
Float(f64),
|
|
||||||
Bool(bool),
|
|
||||||
StringLit(Rc<String>),
|
|
||||||
}
|
|
||||||
|
98
schala-lang/language/src/reduced_ir/types.rs
Normal file
98
schala-lang/language/src/reduced_ir/types.rs
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use crate::builtin::Builtin;
|
||||||
|
use crate::symbol_table::{DefId, Symbol, SymbolSpec, SymbolTable};
|
||||||
|
|
||||||
|
/// The reduced intermediate representation consists of a list of function definitions, and a block
|
||||||
|
/// of entrypoint statements. In a repl or script context this can be an arbitrary list of
|
||||||
|
/// statements, in an executable context will likely just be a pointer to the main() function.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct ReducedIR {
|
||||||
|
pub functions: HashMap<DefId, FunctionDefinition>,
|
||||||
|
pub entrypoint: Vec<Statement>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ReducedIR {
|
||||||
|
fn debug(&self, symbol_table: &SymbolTable) {
|
||||||
|
println!("Reduced IR:");
|
||||||
|
println!("Functions:");
|
||||||
|
println!("-----------");
|
||||||
|
for (id, callable) in self.functions.iter() {
|
||||||
|
let name = &symbol_table.lookup_symbol_by_def(id).unwrap().local_name;
|
||||||
|
println!("{}({}) -> {:?}", id, name, callable);
|
||||||
|
}
|
||||||
|
println!("");
|
||||||
|
println!("Entrypoint:");
|
||||||
|
println!("-----------");
|
||||||
|
for stmt in self.entrypoint.iter() {
|
||||||
|
println!("{:?}", stmt);
|
||||||
|
}
|
||||||
|
println!("-----------");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Statement {
|
||||||
|
Expression(Expression),
|
||||||
|
Binding {
|
||||||
|
id: DefId,
|
||||||
|
constant: bool,
|
||||||
|
expr: Expression
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Expression {
|
||||||
|
Literal(Literal),
|
||||||
|
Tuple(Vec<Expression>),
|
||||||
|
Lookup {
|
||||||
|
id: DefId, //TODO eventually not everything that can be looked up will have a DefId
|
||||||
|
kind: Lookup,
|
||||||
|
},
|
||||||
|
Assign {
|
||||||
|
lval: DefId,
|
||||||
|
rval: Box<Expression>,
|
||||||
|
},
|
||||||
|
Callable(Function),
|
||||||
|
Call {
|
||||||
|
f: Box<Expression>,
|
||||||
|
args: Vec<Expression>
|
||||||
|
},
|
||||||
|
Unimplemented,
|
||||||
|
ReductionError(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Expression {
|
||||||
|
pub fn unit() -> Self {
|
||||||
|
Expression::Tuple(vec![])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct FunctionDefinition {
|
||||||
|
pub body: Vec<Statement>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Function {
|
||||||
|
Builtin(Builtin),
|
||||||
|
UserDefined(DefId)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Lookup {
|
||||||
|
LocalVar,
|
||||||
|
GlobalVar,
|
||||||
|
Function,
|
||||||
|
Param,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Literal {
|
||||||
|
Nat(u64),
|
||||||
|
Int(i64),
|
||||||
|
Float(f64),
|
||||||
|
Bool(bool),
|
||||||
|
StringLit(Rc<String>),
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user