64 int n = (int)p.size();
68 return subtree((p[i]==0)?x0:x1, i+1, p);
82 Rule(
const Rule& rule) : r(rule.r), id(rule.id), p(rule.p) {}
85 { r = rule.
r;
id = rule.
id; p = rule.
p;
return *
this; }
88 {
return r == rule.
r; }
90 {
return r < rule.
r; }
93 ostream&
print(ostream& fout)
const;
119 {
return arity == trans.
arity && x == trans.
x && n == trans.
n; }
121 {
return (arity < trans.
arity) ? 1 :
122 (arity > trans.
arity) ? 0 :
123 (arity == 0) ? (x < trans.
x) :
124 (n.getSym() < trans.
n.
getSym()); }
127 ostream&
print(ostream& fout)
const;
139 s(0), match_num(false), rules(list<
Rule>()), trans(list<
Trans>()) {}
141 s(state.s), match_num(state.match_num),
142 rules(state.rules), trans(state.trans) {}
151 ostream&
print(ostream& fout)
const;
158 x(_x), n(0), arity(0), state(new
State)
163 x(NULL), n(_n), arity(_arity), state(new
State)
168 x(trans.x), n(trans.n), arity(trans.arity)
200 bool final(
int s) {
return trans(
s).empty(); }
207 ostream&
print(ostream& fout)
const;
215 list<Trans>::const_iterator t;
216 for (t = st->
trans.begin(); t != st->
trans.end(); t++) {
220 if (t->is_cst_trans(x) &&
231 {
return x.print(s); }
233 {
return x.print(s); }
235 {
return x.print(s); }
237 {
return x.print(s); }
242 fout <<
"#" <<
r <<
"(" << *
id <<
")";
251 fout <<
"\top " <<
n <<
": state " <<
state->
s << endl;
253 fout <<
"\tvar _: state " <<
state->
s << endl;
255 fout <<
"\tcst " << *x <<
": state " <<
state->
s << endl;
261 fout <<
"state " << s <<
":";
262 list<Rule>::const_iterator r;
263 for (r =
rules.begin(); r !=
rules.end(); r++)
266 list<Trans>::const_iterator t;
267 for (t =
trans.begin(); t !=
trans.end(); t++)
274 int i, n =
rhs.size();
275 for (i = 0; i < n; i++)
276 fout <<
"rule #" << i <<
": " << *
rhs[i] << endl;
278 for (i = 0; i < n; i++)
307 state->
rules.push_back(rule);
309 state->
trans.push_back(trans);
310 return state->
trans.begin()->state;
314 state->
rules.push_back(rule);
316 state->
trans.push_back(trans);
328 state->
rules.push_back(rule);
330 state->
trans.push_back(trans);
331 return state->
trans.begin()->state;
340 return new State(*state);
341 list<Rule>rules = state->
rules;
342 list<Rule>::iterator r;
343 for (r = rules.begin(); r != rules.end(); r++) {
344 r->id = NULL; r->p =
Path();
348 current->
rules = rules;
350 current->
trans.push_back(trans);
351 current = current->
trans.begin()->state;
364 static void inline merge_rules(list<Rule>& rules1, list<Rule>& rules2)
366 list<Rule> cprules2 = rules2;
367 rules1.merge(cprules2);
372 if (!trans.begin()->is_var_trans()) {
376 trans.push_front(tr);
378 list<Trans>::const_iterator t;
381 for (t = trans.begin(); t != trans.end(); t++) {
382 if (t->is_var_trans())
384 else if (t->is_cst_trans(x)) {
387 }
else if (t->is_op_trans(op)) {
398 list<Trans>::iterator t0 = trans.begin(), t1 = t0, t;
400 if (t0->is_var_trans()) t1++;
401 for (t = t1; t != trans.end(); t++) {
402 if (t->is_cst_trans(x1)) {
412 trans.insert(t, tr); t--;
413 State *state1 = t->state;
423 int arity,
State *state)
426 list<Trans>::iterator t0 = trans.begin(), t1 = t0, t;
428 if (t0->is_var_trans()) t1++;
429 for (t = t1; t != trans.end(); t++) {
430 if (t->is_op_trans(op1)) {
439 trans.insert(t, tr); t--;
440 State *state1 = t->state;
455 else if (trans1.empty()) {
456 list<Trans> cptrans2 = trans2;
458 trans1.splice(trans1.end(), cptrans2);
459 }
else if (trans2.begin()->is_var_trans())
462 else if (trans2.begin()->is_cst_trans(x))
465 else if (trans2.begin()->is_op_trans(op))
467 merge_trans_op(trans1, op, trans2.begin()->arity, trans2.begin()->state);
493 int n =
len(R), r = n;
496 vector<Tree> rules(n, (
Tree)NULL);
497 vector< vector<Tree> > testpats(n);
498 while (
isCons(R, rule, rest)) {
502 for (r = 0; r < n; r++) {
504 if (
isCons(rules[r], lhs, rhs)) {
506 int m =
len(lhs), i = m;
507 vector<Tree> pats(
len(lhs), (
Tree)NULL);
509 A->
rhs.push_back(rhs);
510 while (
isCons(lhs, pat, rest)) {
515 for (i = 0; i < m; i++) {
520 state->
rules.push_back(rule);
529 for (r = 0; r < n; r++) {
530 int s = 0, m = (int)testpats[r].size();
532 vector<Tree> E(n,
nil);
534 for (
int i = 0; i < m; i++) {
539 list<Rule>::const_iterator ru;
540 for (ru = A->
rules(s).begin(); ru != A->
rules(s).end(); ru++)
545 Tree lhs1, rhs1, lhs2, rhs2;
546 if (
isCons(rules[ru->r], lhs1, rhs1) &&
isCons(rules[r], lhs2, rhs2)) {
547 cerr <<
"WARNING : shadowed pattern-matching rule: "
549 <<
" previous rule was: "
553 cerr <<
"INTERNAL ERROR : " << __FILE__ <<
":" << __LINE__ << endl;
556 }
else if (ru->r >= r)
561 cerr <<
"automaton " << A << endl << *A <<
"end automaton" << endl;
582 list<Rule> rules = A->
rules(s);
583 list<Rule>::const_iterator r;
584 for (r = rules.begin(); r != rules.end(); r++)
586 subst[r->r].push_back(
Assoc(r->id, r->p));
594 vector<Subst>&
subst)
598 list<Trans>::const_iterator t;
599 if (A->
state[s]->match_num)
603 for (t = A->
trans(s).begin(); t != A->
trans(s).end(); t++) {
606 if (t->is_var_trans())
608 else if (t->is_cst_trans(x)) {
612 cerr <<
"state " << s <<
", " << *x <<
": goto state " << t->state->s << endl;
618 }
else if (t->is_op_trans(op)) {
623 cerr <<
"state " << s <<
", " << op <<
": goto state " << t->state->s << endl;
637 t = A->
trans(s).begin();
638 if (t->is_var_trans()) {
640 cerr <<
"state " << s <<
", _: goto state " << t->state->s << endl;
646 cerr <<
"state " << s <<
", *** match failed ***" << endl;
670 cerr <<
"automaton " << A <<
", state " << s <<
", start match on arg: " << *X << endl;
678 list<Rule>::const_iterator r;
679 for (r = A->
rules(s).begin(); r != A->
rules(s).end(); r++) {
682 Subst::const_iterator assoc;
683 for (assoc = subst[r->r].begin(); assoc != subst[r->r].end(); assoc++) {
689 cerr <<
"state " << s <<
", rule #" << r->r <<
": " <<
690 *assoc->id <<
" := " << *Z1 <<
" *** failed *** old value: " <<
698 cerr <<
"state " << s <<
", rule #" << r->r <<
": " <<
699 *assoc->id <<
" := " << *Z1 << endl;
709 for (r = A->
rules(s).begin(); r != A->
rules(s).end(); r++)
714 cerr <<
"state " << s <<
", complete match yields rhs #" << r->r <<
715 ": " << *A->
rhs[r->r] << endl;
721 cerr <<
"state " << s <<
", *** match failed ***" << endl;
726 cerr <<
"state " << s <<
", successful incomplete match" << endl;
static void merge_trans_var(list< Trans > &trans, State *state)
static State * make_var_state(int n, State *state)
static bool isBoxPatternOp(Tree box, Node &n, Tree &t1, Tree &t2)
bool isBoxSeq(Tree t, Tree &x, Tree &y)
Class Node = (type x (int + double + Sym + void*))
Tree pushValueDef(Tree id, Tree def, Tree lenv)
Push a new layer and add a single definition.
static void merge_trans(list< Trans > &trans1, list< Trans > &trans2)
bool isBoxSplit(Tree t, Tree &x, Tree &y)
static Tree subtree(Tree X, int i, const Path &p)
static State * make_state(State *state, int r, Tree x, Path &p)
bool searchIdDef(Tree id, Tree &def, Tree lenv)
Search the environment (until first barrier) for the definition of a symbol ID and return it...
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
static void add_subst(vector< Subst > &subst, Automaton *A, int s)
State(const State &state)
Assoc(Tree _id, const Path &_p)
const Node & node() const
return the content of the tree
bool is_op_trans(Node &_n) const
interval operator<(const interval &, const interval &)
bool isBoxRec(Tree t, Tree &x, Tree &y)
Interface of the block diagram evaluator.
static void merge_trans_op(list< Trans > &trans, const Node &op, int arity, State *state)
static bool isCons(Tree x, Tree &h, Tree &t)
Tree simplifyPattern(Tree value)
Simplify a block-diagram pattern by computing its numerical sub-expressions.
Trans & operator=(const Trans &trans)
const list< Trans > & trans(int s)
string subst(const string &model, const vector< string > &args)
Text substitution.
bool isBoxPar(Tree t, Tree &x, Tree &y)
static void merge_trans_cst(list< Trans > &trans, Tree x, State *state)
static int apply_pattern_matcher_internal(Automaton *A, int s, Tree X, vector< Subst > &subst)
ostream & operator<<(ostream &file, const boxpp &bpp)
Tree closure(Tree abstr, Tree genv, Tree vis, Tree lenv)
Rule(int _r, Tree _id, const Path &_p)
bool isBoxPatternVar(Tree s, Tree &id)
interval operator==(const interval &, const interval &)
const list< Rule > & rules(int s)
static void merge_state(State *state1, State *state2)
bool is_var_trans() const
bool isBoxMerge(Tree t, Tree &x, Tree &y)
static void merge_rules(list< Rule > &rules1, list< Rule > &rules2)
int apply_pattern_matcher(Automaton *A, int s, Tree X, Tree &C, vector< Tree > &E)
Automaton * make_pattern_matcher(Tree R)
bool is_cst_trans(Tree &_x) const
void print(Tree t, FILE *out)