AstBuilder: binary op for integers
All checks were successful
ci/woodpecker/push/build_rust Pipeline was successful

This commit is contained in:
Akemi Izuko 2023-11-18 00:15:19 -07:00
parent 393349cad5
commit a40d4c3410
Signed by: akemi
GPG key ID: 8DE0764E1809E9FC
2 changed files with 36 additions and 2 deletions

View file

@ -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;

View file

@ -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<BaseType, Vec<String>>,
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(&params),
rng_int: IntGenerator::new(&params),
@ -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 {