Fix infix generation

This commit is contained in:
Rerumu 2022-05-19 03:54:35 -04:00
parent d5c9028be4
commit 642711e67d
2 changed files with 26 additions and 20 deletions

View File

@ -2,13 +2,11 @@ use wasm_ast::node::{BinOpType, CmpOpType};
pub fn bin_symbol_of(op: BinOpType) -> Option<&'static str> {
let result = match op {
BinOpType::Add_I32 | BinOpType::Add_I64 | BinOpType::Add_FN => "+",
BinOpType::Sub_I32 | BinOpType::Sub_I64 | BinOpType::Sub_FN => "-",
BinOpType::Mul_I32 | BinOpType::Mul_I64 | BinOpType::Mul_FN => "*",
BinOpType::DivS_I32 | BinOpType::DivS_I64 | BinOpType::Div_FN => "/",
BinOpType::RemS_I32 | BinOpType::RemU_I32 | BinOpType::RemS_I64 | BinOpType::RemU_I64 => {
"%"
}
BinOpType::Add_I64 | BinOpType::Add_FN => "+",
BinOpType::Sub_I64 | BinOpType::Sub_FN => "-",
BinOpType::Mul_I64 | BinOpType::Mul_FN => "*",
BinOpType::Div_FN => "/",
BinOpType::RemS_I32 | BinOpType::RemU_I32 => "%",
_ => return None,
};
@ -17,12 +15,12 @@ pub fn bin_symbol_of(op: BinOpType) -> Option<&'static str> {
pub fn cmp_symbol_of(op: CmpOpType) -> Option<&'static str> {
let result = match op {
CmpOpType::Eq_I32 | CmpOpType::Eq_I64 | CmpOpType::Eq_FN => "==",
CmpOpType::Ne_I32 | CmpOpType::Ne_I64 | CmpOpType::Ne_FN => "~=",
CmpOpType::LtS_I32 | CmpOpType::LtS_I64 | CmpOpType::Lt_FN => "<",
CmpOpType::GtS_I32 | CmpOpType::GtS_I64 | CmpOpType::Gt_FN => ">",
CmpOpType::LeS_I32 | CmpOpType::LeS_I64 | CmpOpType::Le_FN => "<=",
CmpOpType::GeS_I32 | CmpOpType::GeS_I64 | CmpOpType::Ge_FN => ">=",
CmpOpType::Eq_I32 | CmpOpType::Eq_FN => "==",
CmpOpType::Ne_I32 | CmpOpType::Ne_FN => "~=",
CmpOpType::LtU_I32 | CmpOpType::Lt_FN => "<",
CmpOpType::GtU_I32 | CmpOpType::Gt_FN => ">",
CmpOpType::LeU_I32 | CmpOpType::Le_FN => "<=",
CmpOpType::GeU_I32 | CmpOpType::Ge_FN => ">=",
_ => return None,
};

View File

@ -5,7 +5,7 @@ use wasm_ast::node::{
UnOp, Value,
};
use crate::analyzer::operator::bin_symbol_of;
use crate::analyzer::operator::{bin_symbol_of, cmp_symbol_of};
use super::manager::{write_separated, write_variable, Driver, Manager};
@ -133,14 +133,22 @@ impl Driver for BinOp {
impl Driver for CmpOp {
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
let (a, b) = self.op.as_name();
if let Some(symbol) = cmp_symbol_of(self.op) {
write!(w, "(")?;
self.lhs.write(mng, w)?;
write!(w, "{symbol} ")?;
self.rhs.write(mng, w)?;
write!(w, ")")
} else {
let (head, tail) = self.op.as_name();
write!(w, "{a}_{b}(")?;
write!(w, "{head}_{tail}(")?;
self.lhs.write(mng, w)?;
write!(w, ", ")?;
self.rhs.write(mng, w)?;
write!(w, ")")
}
}
}
impl Driver for Expression {