forked from MightyPork/crsn
Reduce true/false conditionals down to just 'else' and warn if else is used in non-final branch
This commit is contained in:
@@ -138,8 +138,7 @@ pub fn parse_cond(text: &str, pos: &SourcePosition) -> Result<Cond, CrsnError> {
|
||||
"neof" => Cond::NotEof,
|
||||
"ov" => Cond::Overflow,
|
||||
"nov" => Cond::NotOverflow,
|
||||
"true" | "always" | "else" => Cond::True,
|
||||
"false" | "never" => Cond::False,
|
||||
"else" => Cond::True,
|
||||
_ => {
|
||||
return Err(CrsnError::Parse(format!("Unknown cond: {}", text).into(), pos.clone()));
|
||||
}
|
||||
@@ -180,8 +179,8 @@ impl Display for Cond {
|
||||
Cond::Valid => "valid",
|
||||
Cond::Eof => "eof",
|
||||
Cond::NotEof => "neof",
|
||||
Cond::True => "true",
|
||||
Cond::False => "false",
|
||||
Cond::True => "else",
|
||||
Cond::False => "never",
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,10 @@ impl Flatten for InstrWithBranches {
|
||||
return Err(CrsnError::Asm(AsmError::ConditionalAlreadyUsed(cond), branch.pos()));
|
||||
}
|
||||
|
||||
if cnt != branch_count - 1 && cond == Cond::True {
|
||||
warn!("\"Else\" conditional used in non-final branch at {}:{}", branch.pos().line, branch.pos().column);
|
||||
}
|
||||
|
||||
let next_lbl = if cnt == branch_count - 1 {
|
||||
end_lbl.clone()
|
||||
} else {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
(ld r8 0)
|
||||
|
||||
(ld r0 1
|
||||
(true? (add r8 1))
|
||||
(else? (add r8 1))
|
||||
)
|
||||
|
||||
(sub r0 1
|
||||
@@ -10,15 +10,8 @@
|
||||
(else? (add r8 1))
|
||||
)
|
||||
|
||||
(nop
|
||||
(always? (add r8 1))
|
||||
)
|
||||
|
||||
(nop
|
||||
(never? (fault))
|
||||
)
|
||||
|
||||
(cmp r8 3
|
||||
(cmp r8 2
|
||||
(ne? (fault))
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user