More visitor stuff
This commit is contained in:
parent
3dad077a09
commit
b0dd1a6527
@ -115,7 +115,7 @@ impl ASTVisitor for Reducer {
|
|||||||
|
|
||||||
pub fn perform_reduction(mut input: AST, _symbol_table: &SymbolTable) -> Result<ReducedAST, String> {
|
pub fn perform_reduction(mut input: AST, _symbol_table: &SymbolTable) -> Result<ReducedAST, String> {
|
||||||
let mut reducer = Reducer::new();
|
let mut reducer = Reducer::new();
|
||||||
input.visit(&mut reducer);
|
let _ = input.visit(&mut reducer).map_err(|e| e.to_string())?;
|
||||||
reducer.output()
|
reducer.output()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,10 @@ use crate::ast::*;
|
|||||||
pub type VResult = Result<(), Box<dyn Error>>;
|
pub type VResult = Result<(), Box<dyn Error>>;
|
||||||
|
|
||||||
pub trait ASTVisitor {
|
pub trait ASTVisitor {
|
||||||
fn visit_expression(&mut self, _: &mut Expression) -> VResult {
|
fn post_ast(&mut self, _: &mut AST) -> VResult {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
fn post_expression(&mut self, _: &mut Expression) -> VResult {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -13,16 +16,63 @@ pub trait Visitable {
|
|||||||
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult;
|
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: Visitable> Visitable for Option<T> {
|
||||||
|
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult {
|
||||||
|
match self {
|
||||||
|
Some(t) => t.visit(v),
|
||||||
|
None => Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Visitable for AST {
|
impl Visitable for AST {
|
||||||
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult {
|
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult {
|
||||||
for s in self.0.iter_mut() {
|
for s in self.0.iter_mut() {
|
||||||
s.node_mut().visit(v)?
|
s.node_mut().visit(v)?
|
||||||
}
|
}
|
||||||
Ok(())
|
v.post_ast(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Visitable for Statement {
|
impl Visitable for Statement {
|
||||||
|
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult {
|
||||||
|
match self {
|
||||||
|
Statement::ExpressionStatement(meta) => meta.node_mut().visit(v),
|
||||||
|
Statement::Declaration(decl) => decl.visit(v),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Visitable for Expression {
|
||||||
|
fn visit(&mut self, v: &mut dyn ASTVisitor) -> VResult {
|
||||||
|
let _ = self.kind.visit(v)?;
|
||||||
|
let _ = self.type_anno.visit(v)?;
|
||||||
|
v.post_expression(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Visitable for Declaration {
|
||||||
|
fn visit(&mut self, _v: &mut dyn ASTVisitor) -> VResult {
|
||||||
|
use Declaration::*;
|
||||||
|
Ok(match self {
|
||||||
|
FuncSig(sig) => (),
|
||||||
|
FuncDecl(sig, block) => (),
|
||||||
|
TypeDecl { .. } => (),
|
||||||
|
TypeAlias(_, _) => (),
|
||||||
|
Binding { .. } => (),
|
||||||
|
Impl { .. } => (),
|
||||||
|
Interface { .. } => (),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Visitable for ExpressionKind {
|
||||||
|
fn visit(&mut self, _v: &mut dyn ASTVisitor) -> VResult {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Visitable for TypeIdentifier {
|
||||||
fn visit(&mut self, _v: &mut dyn ASTVisitor) -> VResult {
|
fn visit(&mut self, _v: &mut dyn ASTVisitor) -> VResult {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user