zen_template/
expr.rs

1use crate::err::TmplResult;
2use crate::expr::common::{Expression, ExpressionIR, ExpressionManager};
3use crate::expr::utils::ExpressCompileIR;
4use crate::expr::ExpressionIR::*;
5
6pub mod common;
7pub mod common_utils;
8pub mod optimization;
9pub mod stack;
10mod template;
11pub mod util_ast;
12pub mod util_link;
13pub mod util_parse;
14pub mod util_reduce;
15pub mod util_tag;
16pub mod utils;
17
18// TODO: 剩下语法优化
19impl ExpressionManager {
20    fn compile(&self, expr_str: &str) -> TmplResult<Expression> {
21        let mut src = self.tagged_symbols(ExpressCompileIR::parse_static_str(expr_str))?;
22        ExpressionIR::parse_groups(&mut src)?; // 提取表达式的原始字符串
23        self.link_symbols(&mut src)?; // 替换符号
24        ExpressionIR::compile_primitives(&mut src)?; // 处理原语 (此时不应该有任何的未知符号)
25        self.link_static_primitives(&mut src)?; //渲染静态函数
26        let mut ir = ItemGroup(src);
27        println!("{:?}", ir.to_string());
28        ExpressionIR::flat_depth(&mut ir)?;
29        Ok(Expression::from(ir.to_ast()?))
30    }
31}
32
33#[cfg(test)]
34mod test {
35    use crate::expr::ExpressionManager;
36
37    #[test]
38    fn test() {
39        let manager = ExpressionManager::default();
40        println!(
41            "{:#?}",
42            manager
43                .compile(r#"(1+2)*3/12-31%121 in 212"#)
44                .map_err(|e| e.to_string())
45                .unwrap()
46                .to_string()
47        );
48    }
49}