lab 6
This commit is contained in:
31
src/util.rs
31
src/util.rs
@@ -1,11 +1,42 @@
|
||||
use std::collections::HashSet;
|
||||
use std::io;
|
||||
|
||||
use crate::representation::intermediate::IntermediateValue;
|
||||
use crate::symbols::Symbol;
|
||||
use crate::{
|
||||
ast::{typed::TypedExpr, UntypedExpr},
|
||||
representation::intermediate::IntermediateExpr,
|
||||
symbols::SymbolsTable,
|
||||
};
|
||||
|
||||
pub fn collect_used_symbols(expr: &[IntermediateExpr]) -> Vec<Symbol> {
|
||||
let mut used_symbols = HashSet::new();
|
||||
|
||||
for expr in expr {
|
||||
match expr {
|
||||
IntermediateExpr::IntToFloat { result, value } => {
|
||||
used_symbols.insert(*result);
|
||||
if let IntermediateValue::Var { name } = value {
|
||||
used_symbols.insert(*name);
|
||||
}
|
||||
}
|
||||
IntermediateExpr::BinOp {
|
||||
result, lhs, rhs, ..
|
||||
} => {
|
||||
used_symbols.insert(*result);
|
||||
if let IntermediateValue::Var { name } = lhs {
|
||||
used_symbols.insert(*name);
|
||||
}
|
||||
if let IntermediateValue::Var { name } = rhs {
|
||||
used_symbols.insert(*name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
used_symbols.into_iter().collect()
|
||||
}
|
||||
|
||||
pub fn print_intermediate_exprs(
|
||||
exprs: &[IntermediateExpr],
|
||||
writer: &mut impl io::Write,
|
||||
|
||||
Reference in New Issue
Block a user