WIP
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
//! Generate Rust code from a series of Sequences.
|
||||
|
||||
use crate::error::Error;
|
||||
use crate::ir::{lower_rule, ExprSequence, PatternInst, PatternSequence, Value};
|
||||
use crate::sema::{RuleId, TermEnv, TermId, TypeEnv};
|
||||
use peepmatic_automata::{Automaton, Builder as AutomatonBuilder};
|
||||
@@ -70,6 +71,8 @@ struct TermFunctionsBuilder<'a> {
|
||||
|
||||
impl<'a> TermFunctionsBuilder<'a> {
|
||||
fn new(typeenv: &'a TypeEnv, termenv: &'a TermEnv) -> Self {
|
||||
log::trace!("typeenv: {:?}", typeenv);
|
||||
log::trace!("termenv: {:?}", termenv);
|
||||
Self {
|
||||
builders_by_input: HashMap::new(),
|
||||
builders_by_output: HashMap::new(),
|
||||
@@ -82,6 +85,14 @@ impl<'a> TermFunctionsBuilder<'a> {
|
||||
for rule in 0..self.termenv.rules.len() {
|
||||
let rule = RuleId(rule);
|
||||
let (lhs_root, pattern, rhs_root, expr) = lower_rule(self.typeenv, self.termenv, rule);
|
||||
log::trace!(
|
||||
"build:\n- rule {:?}\n- lhs_root {:?} rhs_root {:?}\n- pattern {:?}\n- expr {:?}",
|
||||
self.termenv.rules[rule.index()],
|
||||
lhs_root,
|
||||
rhs_root,
|
||||
pattern,
|
||||
expr
|
||||
);
|
||||
if let Some(input_root_term) = lhs_root {
|
||||
self.builders_by_input
|
||||
.entry(input_root_term)
|
||||
@@ -115,9 +126,16 @@ impl<'a> TermFunctionsBuilder<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Automata {
|
||||
pub automata_by_input: HashMap<TermId, Automaton<PatternInst, (), ExprSequence>>,
|
||||
pub automata_by_output: HashMap<TermId, Automaton<PatternInst, (), ExprSequence>>,
|
||||
}
|
||||
|
||||
impl Automata {}
|
||||
impl Automata {
|
||||
pub fn compile(typeenv: &TypeEnv, termenv: &TermEnv) -> Result<Automata, Error> {
|
||||
let mut builder = TermFunctionsBuilder::new(typeenv, termenv);
|
||||
builder.build();
|
||||
Ok(builder.create_automata())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,11 @@
|
||||
//! Compilation process, from AST to Sema to Sequences of Insts.
|
||||
|
||||
use crate::{ast, sema, ir, codegen};
|
||||
use crate::error::Error;
|
||||
|
||||
pub fn compile(defs: &ast::Defs) -> Result<codegen::Automata, Error> {
|
||||
let mut typeenv = sema::TypeEnv::from_ast(defs)?;
|
||||
let termenv = sema::TermEnv::from_ast(&mut typeenv, defs)?;
|
||||
let automata = codegen::Automata::compile(&typeenv, &termenv)?;
|
||||
Ok(automata)
|
||||
}
|
||||
|
||||
@@ -17,7 +17,8 @@ fn main() -> Result<(), error::Error> {
|
||||
let mut input = String::new();
|
||||
stdin().read_to_string(&mut input)?;
|
||||
let mut parser = parser::Parser::new("<stdin>", &input[..]);
|
||||
let _defs = parser.parse_defs()?;
|
||||
|
||||
let defs = parser.parse_defs()?;
|
||||
let automata = compile::compile(&defs)?;
|
||||
println!("automata: {:?}", automata);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user