nitg&i: handle new `implies` operator
authorJean Privat <jean@pryen.org>
Fri, 23 Aug 2013 19:25:37 +0000 (15:25 -0400)
committerJean Privat <jean@pryen.org>
Fri, 23 Aug 2013 19:25:37 +0000 (15:25 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/abstract_compiler.nit
src/flow.nit
src/naive_interpreter.nit
src/transform.nit
src/typing.nit

index fa14030..9bf87bd 100644 (file)
@@ -2020,6 +2020,21 @@ redef class AOrExpr
        end
 end
 
+redef class AImpliesExpr
+       redef fun expr(v)
+       do
+               var res = v.new_var(self.mtype.as(not null))
+               var i1 = v.expr_bool(self.n_expr)
+               v.add("if (!{i1}) \{")
+               v.add("{res} = 1;")
+               v.add("\} else \{")
+               var i2 = v.expr_bool(self.n_expr2)
+               v.add("{res} = {i2};")
+               v.add("\}")
+               return res
+       end
+end
+
 redef class AAndExpr
        redef fun expr(v)
        do
index 05a40b9..a18da43 100644 (file)
@@ -485,6 +485,21 @@ redef class AOrExpr
        end
 end
 
+redef class AImpliesExpr
+       redef fun accept_flow_visitor(v)
+       do
+               var after_expr = v.visit_expr(self.n_expr)
+
+               v.current_flow_context = after_expr.when_true
+               var after_expr2 = v.visit_expr(self.n_expr2)
+
+               var merge_true = v.make_merge_flow(after_expr.when_false, after_expr2.when_true)
+               merge_true.name = "OR TRUE"
+
+               v.make_true_false_flow(merge_true, after_expr2.when_false)
+       end
+end
+
 redef class AAndExpr
        redef fun accept_flow_visitor(v)
        do
index ba80cd9..592c90a 100644 (file)
@@ -1320,6 +1320,16 @@ redef class AOrExpr
        end
 end
 
+redef class AImpliesExpr
+       redef fun expr(v)
+       do
+               var cond = v.expr(self.n_expr)
+               if cond == null then return null
+               if not cond.is_true then return v.true_instance
+               return v.expr(self.n_expr2)
+       end
+end
+
 redef class AAndExpr
        redef fun expr(v)
        do
index af19ef6..f3200fa 100644 (file)
@@ -128,6 +128,13 @@ redef class AOrExpr
        end
 end
 
+redef class AImpliesExpr
+       redef fun accept_transform_visitor(v)
+       do
+               # TODO
+       end
+end
+
 redef class AAndExpr
        # `x and y` is replaced with `if x then y else x`
        redef fun accept_transform_visitor(v)
index 3c11789..be3b2b0 100644 (file)
@@ -942,6 +942,15 @@ redef class AOrExpr
        end
 end
 
+redef class AImpliesExpr
+       redef fun accept_typing(v)
+       do
+               v.visit_expr_bool(n_expr)
+               v.visit_expr_bool(n_expr2)
+               self.mtype = v.type_bool(self)
+       end
+end
+
 redef class AAndExpr
        redef fun accept_typing(v)
        do