def emit_action(a): if isinstance(a, ia.AssignAction): vars = [ (x if isinstance(x, lg.Variable) else lg.Variable('$V' + str(idx))) for x, idx in enumerate(a.args[0].args) ] emit(' ' + a.args[0].rep.name + ' ::= ') rhs = a.args[1] if len(vars) != 0: cond = lg.And( *[lg.Eq(v, w) for v, w in zip(vars, a.args[0].args) if v != w]) rhs = lg.Ite(cond, rhs, lg.Apply(a.func, vars)) emit_expr(rhs) elif isinstance(a, ia.Sequence): emit('(') first = True for x in a.args: if not first: emit(';\n') emit_action(x) first = False emit(')') elif isinstance(a, ia.IfAction): emit('(PL.pterm.ite ') emit_expr(a.args[0]) emit_action(a.args[1]) if len(a.args) > 2: emit_action(a.args[1]) else: emit('PL.pterm.skip') else: raise iu.IvyError(a, 'action not supported yet')
def ite_drop_annotations(self, inferred_sort, annotated_vars): arg1 = self.args[1].drop_annotations(inferred_sort, annotated_vars) arg2 = self.args[2].drop_annotations(True, annotated_vars) arg0 = self.args[0].drop_annotations(True, annotated_vars) return lg.Ite(arg0, arg1, arg2)