From a40d4c3410a86c82e7045d2750dbde50c10e9923 Mon Sep 17 00:00:00 2001 From: Akemi Izuko Date: Sat, 18 Nov 2023 00:15:19 -0700 Subject: [PATCH] AstBuilder: binary op for integers --- src/ast/expr.rs | 2 +- src/ast_builder.rs | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/ast/expr.rs b/src/ast/expr.rs index c8180df..48f7908 100644 --- a/src/ast/expr.rs +++ b/src/ast/expr.rs @@ -135,7 +135,7 @@ impl BinaryOperator { } } - pub fn sub(left: Expr, right: Expr) -> Self { + pub fn subtract(left: Expr, right: Expr) -> Self { let is_both_same = left.get_base() == right.get_base(); let is_one_real = left.get_base() == BaseType::Real || right.get_base() == BaseType::Real; let is_one_int = left.get_base() == BaseType::Int || right.get_base() == BaseType::Int; diff --git a/src/ast_builder.rs b/src/ast_builder.rs index eed232e..d55bf9f 100644 --- a/src/ast_builder.rs +++ b/src/ast_builder.rs @@ -6,12 +6,18 @@ use std::collections::HashMap; use crate::params::Params; use crate::ast::*; +#[derive(Default)] +struct StateTracking { + int_recursion_depth: u32, +} + pub struct AstBuilder { params: Params, ast: GlobalBlock, name_counter: u64, typedef_map: HashMap>, typedef_vec: Vec<(String, BaseType)>, + state: StateTracking, // Random generation rng: rand::rngs::ThreadRng, rng_float: FloatGenerator, @@ -33,6 +39,7 @@ impl AstBuilder { name_counter: 0, typedef_map, typedef_vec, + state: StateTracking::default(), rng: rand::thread_rng(), rng_float: FloatGenerator::new(¶ms), rng_int: IntGenerator::new(¶ms), @@ -119,7 +126,34 @@ impl AstBuilder { } fn gen_integer(&mut self) -> Expr { - Expr::new_literal(self.gen_literal(BaseType::Int)) + let p: f64 = self.rng.gen(); + let mut ps = &self.params.types.gen_integer; + + self.state.int_recursion_depth += 1; + + if p < ps.get_instant || self.state.int_recursion_depth >= ps.max_depth { + self.state.int_recursion_depth -= 1; + return Expr::new_literal(self.gen_literal(BaseType::Int)); + } + + let lhs = self.gen_integer(); + let rhs = self.gen_integer(); + self.state.int_recursion_depth -= 1; + + ps = &self.params.types.gen_integer; + + if p < ps.get_instant + ps.expr_add { + Expr::new_binary_op(BinaryOperator::add(lhs, rhs)) + } else if p < ps.get_instant + ps.expr_add + ps.expr_sub { + Expr::new_binary_op(BinaryOperator::subtract(lhs, rhs)) + } else if p < ps.get_instant + ps.expr_add + ps.expr_sub + ps.expr_mul { + Expr::new_binary_op(BinaryOperator::multiply(lhs, rhs)) + } else if p < ps.get_instant + ps.expr_add + ps.expr_sub + ps.expr_mul + ps.expr_div { + Expr::new_binary_op(BinaryOperator::divide(lhs, rhs)) + } else { + Expr::new_literal(self.gen_literal(BaseType::Int)) // TODO: this shouldn't be here + } + } fn gen_real(&mut self) -> Expr {