|
@@ -62,6 +62,7 @@ args:
|
|
|
| [expr ("," expr)*]
|
|
|
|
|
|
?expr: op1
|
|
|
+ | op1 "?" op1 ":" expr -> ifexpr
|
|
|
?op1: op2
|
|
|
| vardec
|
|
|
| op1 "==" op1 -> equals
|
|
@@ -419,6 +420,45 @@ class WMC:
|
|
|
)
|
|
|
else:
|
|
|
raise Exception(f"Not implemented: {node}")
|
|
|
+ elif node.data == "ifexpr":
|
|
|
+ else_label = self.make_label()
|
|
|
+ exit_label = self.make_label()
|
|
|
+
|
|
|
+ buffer.emit(
|
|
|
+ self.compile_expr(
|
|
|
+ node.children[0]
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ buffer.emit(
|
|
|
+ "nbnz Y {}",
|
|
|
+ else_label
|
|
|
+ )
|
|
|
+
|
|
|
+ buffer.emit(
|
|
|
+ self.compile_expr(
|
|
|
+ node.children[1]
|
|
|
+ )
|
|
|
+ )
|
|
|
+ buffer.emit(
|
|
|
+ "jmp {}",
|
|
|
+ exit_label
|
|
|
+ )
|
|
|
+
|
|
|
+ buffer.emit(
|
|
|
+ "{}:",
|
|
|
+ else_label
|
|
|
+ )
|
|
|
+ buffer.emit(
|
|
|
+ self.compile_expr(
|
|
|
+ node.children[2]
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ buffer.emit(
|
|
|
+ "{}:",
|
|
|
+ exit_label
|
|
|
+ )
|
|
|
elif node.data == "equals":
|
|
|
buffer.emit(
|
|
|
self.compile_compare_expr(
|