wip
This commit is contained in:
@@ -301,6 +301,45 @@ impl<'a, W: std::io::Write> Compiler<'a, W> {
|
|||||||
expr: BinaryExpression,
|
expr: BinaryExpression,
|
||||||
scope: &mut VariableScope<'v>,
|
scope: &mut VariableScope<'v>,
|
||||||
) -> Result<VariableLocation, Error> {
|
) -> Result<VariableLocation, Error> {
|
||||||
|
enum VariableType {
|
||||||
|
Location(VariableLocation),
|
||||||
|
Literal(String),
|
||||||
|
}
|
||||||
|
let mut comp_bin_expr = move |expr: Expression| -> Result<VariableType, Error> {
|
||||||
|
if let Expression::Negation(box_expr) = &expr
|
||||||
|
&& let Expression::Literal(Literal::Number(num)) = &**box_expr
|
||||||
|
{
|
||||||
|
return Ok(VariableType::Literal(format!("-{num}")));
|
||||||
|
}
|
||||||
|
|
||||||
|
let var_type = match expr {
|
||||||
|
Expression::Binary(bin) => {
|
||||||
|
VariableType::Location(self.expression_binary(bin, scope)?)
|
||||||
|
}
|
||||||
|
Expression::Variable(var_name) => {
|
||||||
|
VariableType::Location(scope.get_location_of(var_name)?)
|
||||||
|
}
|
||||||
|
Expression::Invocation(invocation_expression) => {
|
||||||
|
let temp_ret = scope.add_variable("temp_ret", LocationRequest::Temp)?;
|
||||||
|
self.expression_function_invocation(invocation_expression, scope)?;
|
||||||
|
self.emit_variable_assignment(
|
||||||
|
"temp_ret",
|
||||||
|
&temp_ret,
|
||||||
|
format!("r{}", VariableScope::RETURN_REGISTER),
|
||||||
|
)?;
|
||||||
|
VariableType::Location(temp_ret)
|
||||||
|
}
|
||||||
|
Expression::Literal(Literal::Number(num)) => VariableType::Literal(num.into()),
|
||||||
|
_ => {
|
||||||
|
return Err(Error::Unknown(
|
||||||
|
"Unsupported expression in binary expression.".into(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(var_type)
|
||||||
|
};
|
||||||
|
|
||||||
let (op, l, r) = match expr {
|
let (op, l, r) = match expr {
|
||||||
BinaryExpression::Add(l, r) => ("add", *l, *r),
|
BinaryExpression::Add(l, r) => ("add", *l, *r),
|
||||||
BinaryExpression::Multiply(l, r) => ("mul", *l, *r),
|
BinaryExpression::Multiply(l, r) => ("mul", *l, *r),
|
||||||
@@ -309,6 +348,16 @@ impl<'a, W: std::io::Write> Compiler<'a, W> {
|
|||||||
BinaryExpression::Exponent(l, r) => ("pow", *l, *r),
|
BinaryExpression::Exponent(l, r) => ("pow", *l, *r),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut l = comp_bin_expr(l)?;
|
||||||
|
let mut r = comp_bin_expr(r)?;
|
||||||
|
|
||||||
|
// make sure l and r are in registers. If they aren't, backup 2 temp registers to the stack
|
||||||
|
// and
|
||||||
|
|
||||||
|
if let VariableType::Location(VariableLocation::Stack(offset)) = l {}
|
||||||
|
|
||||||
|
if let VariableType::Location(VariableLocation::Stack(offset)) = r {}
|
||||||
|
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user