append (struct coroutine *k, expr a, expr b, expr c) { begin_decl (); decl_expr (&a); decl_expr (&b); decl_expr (&c); if (alt (k, 1, 0)) /* append ([], L, L) */ { expr l, var_l; decl_loc (l); decl_loc (var_l); l = UNDEF; var_l = mk_var (&l); unify (k, nil, a); unify (k, var_l, b); unify (k, var_l, c); unify (k, a, nil); unify (k, b, var_l); unify (k, c, var_l); } else /* append ([X|A], B, [X|C]) :- append (A, B, C) */ if (alt (k, 1, 0)) { expr X, A, B, C, _X, _A, _B, _C, XA, XC; dle(X) dle(A) dle(B) dle(X) dle(_X) dle(_A) dle(_B) dle(_C) dle(XA) dle(XC) X = UNDEF; A = UNDEF; B = UNDEF; C = UNDEF; _X = mk_var (&X); _A = mk_var (&A); _B = mk_var (&B); _C = mk_var (&C); XA = cons (_X, _A); XC = cons (_X, _C); unify (k, XA, a); unify (k, _B, b); unify (k, XC, c); append (k, _A, _B, _C); unify (k, a, XA); unify (k, b, _B); unify (k, c, XC); } else end (k); free_expr (); }
inter (expr x, expr y) { expr r, t1; begin_decl (); decl_expr (&x); decl_expr (&y); r = nil; decl_expr (&r); t1 = nil; decl_expr (&t1); if (x > y) return nil; /* r = cons (x, inter (x+1, y)); */ t1 = inter (x+1, y); r = cons (x, t1); t1 = nil; free_expr (); return r; }
void cpp_from_isl::process_for(isl_ast_node *node) { auto iter_expr = isl_ast_node_for_get_iterator(node); auto init_expr = isl_ast_node_for_get_init(node); auto cond_expr = isl_ast_node_for_get_cond(node); auto inc_expr = isl_ast_node_for_get_inc(node); auto body_node = isl_ast_node_for_get_body(node); auto iter = process_expr(iter_expr); auto init = process_expr(init_expr); auto cond = process_expr(cond_expr); auto inc = process_expr(inc_expr); auto iter_id = dynamic_pointer_cast<id_expression>(iter); if (!iter_id) throw error("Iterator expression is not an identifier."); auto iter_decl = decl_expr(make_shared<basic_type>("int"), *iter_id, init); auto for_stmt = make_shared<for_statement>(); for_stmt->initialization = iter_decl; for_stmt->condition = cond; for_stmt->update = binop(op::assign_add, iter, inc); { vector<statement_ptr> stmts; m_ctx->push(&stmts); process_node(body_node); m_ctx->pop(); if (stmts.size() == 1) for_stmt->body = stmts.front(); else for_stmt->body = block(stmts); } m_ctx->add(for_stmt); isl_ast_expr_free(iter_expr); isl_ast_expr_free(init_expr); isl_ast_expr_free(cond_expr); isl_ast_expr_free(inc_expr); isl_ast_node_free(body_node); }
pl_consonne_1 (struct coroutine *k, expr a0) { expr nx[MAX_NEW_CONS]; int pnx, i; struct process_list *alt_process; pnx = 0; begin_decl (); decl_expr (&a0); for (i=0; i<MAX_NEW_CONS; i++) dle (nx[i]); #ifdef TRACE printf ("\nconsonne: a0 = "); print_expr (a0); #endif if (alt (k, 1, 0)) { /* clause */ expr val_X, var_X; alt_process = getpl (k) -> alt; dle(val_X) dle(var_X) val_X=UNDEF; var_X=mk_var(&val_X); #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, var_X, a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; pl_lettre_1 (k, var_X); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; pl_non_voyelle_1 (k, var_X); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, var_X); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else end (k); free_expr (); }
pl_lettre_1 (struct coroutine *k, expr a0) { expr nx[MAX_NEW_CONS]; int pnx, i; struct process_list *alt_process; pnx = 0; begin_decl (); decl_expr (&a0); for (i=0; i<MAX_NEW_CONS; i++) dle (nx[i]); #ifdef TRACE printf ("\nlettre: a0 = "); print_expr (a0); #endif if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("a"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("a"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("b"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("b"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("c"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("c"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("d"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("d"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("e"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("e"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("f"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("f"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("g"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("g"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("h"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("h"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else if (alt (k, 1, 0)) { /* clause */ alt_process = getpl (k) -> alt; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif unify (k, nx[pnx++] = cons (symbol("i"), 0), a0); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; unify (k, a0, nx[pnx++] = cons (symbol("i"), 0)); for (i=0; i<pnx; i++) nx[i] = 0; pnx=0; #ifdef TRACE printf ("\n\ta0 = "); print_expr (a0); #endif } else end (k); free_expr (); }
append (struct coroutine *k, expr a, expr b, expr c) { #ifndef OLD begin_decl (); decl_expr (&a); decl_expr (&b); decl_expr (&c); #endif #ifdef TRACE printf ("\na = "); print_expr (a); printf ("\nb = "); print_expr (b); printf ("\nc = "); print_expr (c); #endif if (alt (k, 1, 0)) /* append ([], L, L) */ { expr l, var_l; #ifndef OLD decl_loc (l); decl_loc (var_l); #endif l = UNDEF; var_l = mk_var (&l); unify (k, nil, a); unify (k, var_l, b); unify (k, var_l, c); #ifdef TRACE printf ("\nvar_l = "); print_expr (var_l); #endif unify (k, a, nil); unify (k, b, var_l); unify (k, c, var_l); #ifdef TRACE printf ("\na = "); print_expr (a); printf ("\nb = "); print_expr (b); printf ("\nc = "); print_expr (c); #endif /* free (var_l); */ } else /* append ([X|A], B, [X|C]) :- append (A, B, C) */ { expr X, A, B, C, _X, _A, _B, _C, XA, XC; #ifndef OLD dle(X) dle(A) dle(B) dle(X) dle(_X) dle(_A) dle(_B) dle(_C) dle(XA) dle(XC) #endif X = UNDEF; A = UNDEF; B = UNDEF; C = UNDEF; _X = mk_var (&X); _A = mk_var (&A); _B = mk_var (&B); _C = mk_var (&C); XA = cons (_X, _A); XC = cons (_X, _C); #ifdef TRACE printf ("\nXA = "); print_expr (XA); printf ("\n_B = "); print_expr (_B); printf ("\nXC = "); print_expr (XC); printf ("\na = "); print_expr (a); printf ("\nb = "); print_expr (b); printf ("\nc = "); print_expr (c); #endif unify (k, XA, a); unify (k, _B, b); unify (k, XC, c); #ifdef TRACE printf ("\nXA = "); print_expr (XA); printf ("\n_B = "); print_expr (_B); printf ("\nXC = "); print_expr (XC); #endif append (k, _A, _B, _C); #ifdef TRACE printf ("\n_A = "); print_expr (_A); printf ("\n_B = "); print_expr (_B); printf ("\n_C = "); print_expr (_C); printf ("\nXA = "); print_expr (XA); printf ("\n_B = "); print_expr (_B); printf ("\nXC = "); print_expr (XC); #endif unify (k, a, XA); unify (k, b, _B); unify (k, c, XC); #ifdef TRACE printf ("\na = "); print_expr (a); printf ("\nb = "); print_expr (b); printf ("\nc = "); print_expr (c); #endif /* free (_X); free (_A); free (_B); free (_C); free (XA); free (XC); */ } #ifndef OLD free_expr (); #endif }