From 16f0234f091f71b4ac944d16464ab12b7108735c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 23 Aug 2013 15:25:37 -0400 Subject: [PATCH 1/1] nitg&i: handle new `implies` operator Signed-off-by: Jean Privat --- src/abstract_compiler.nit | 15 +++++++++++++++ src/flow.nit | 15 +++++++++++++++ src/naive_interpreter.nit | 10 ++++++++++ src/transform.nit | 7 +++++++ src/typing.nit | 9 +++++++++ 5 files changed, 56 insertions(+) diff --git a/src/abstract_compiler.nit b/src/abstract_compiler.nit index fa14030..9bf87bd 100644 --- a/src/abstract_compiler.nit +++ b/src/abstract_compiler.nit @@ -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 diff --git a/src/flow.nit b/src/flow.nit index 05a40b9..a18da43 100644 --- a/src/flow.nit +++ b/src/flow.nit @@ -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 diff --git a/src/naive_interpreter.nit b/src/naive_interpreter.nit index ba80cd9..592c90a 100644 --- a/src/naive_interpreter.nit +++ b/src/naive_interpreter.nit @@ -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 diff --git a/src/transform.nit b/src/transform.nit index af19ef6..f3200fa 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -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) diff --git a/src/typing.nit b/src/typing.nit index 3c11789..be3b2b0 100644 --- a/src/typing.nit +++ b/src/typing.nit @@ -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 -- 1.7.9.5