source: icGREP/icgrep-devel/icgrep/re/re_star_normal.cpp

Last change on this file was 5866, checked in by cameron, 4 months ago

Revised canonical form for nullable expressions; extended star-normal xfrm

File size: 2.4 KB
Line 
1#include "re_star_normal.h"
2#include <re/re_name.h>
3#include <re/re_any.h>
4#include <re/re_start.h>
5#include <re/re_end.h>
6#include <re/re_alt.h>
7#include <re/re_cc.h>
8#include <re/re_seq.h>
9#include <re/re_rep.h>
10#include <re/re_diff.h>
11#include <re/re_intersect.h>
12#include <re/re_assertion.h>
13#include <re/re_analysis.h>
14#include <re/re_nullable.h>
15
16using namespace llvm;
17
18namespace re {
19
20RE * RE_Star_Normal::star_rule(RE * re) {
21    if (Seq * seq = dyn_cast<Seq>(re)) {
22        if (RE_Nullable::isNullable(re)) {
23            std::vector<RE *> list;
24            list.reserve(seq->size());
25            for (RE * r : *seq) {
26                if (Rep * rep = dyn_cast<Rep>(r)) {
27                    if (rep->getLB() == 0) {
28                        list.push_back(rep->getRE());
29                    }
30                } else if (!isEmptySeq(r)) {
31                    list.push_back(r);
32                }
33            }
34            return makeAlt(list.begin(), list.end());
35        }
36    }
37    return re;
38}
39
40RE * RE_Star_Normal::star_normal(RE * re) {
41    if (Alt * alt = dyn_cast<Alt>(re)) {
42        std::vector<RE *> list;
43        list.reserve(alt->size());
44        for (RE * re : *alt) {
45            list.push_back(star_normal(re));
46        }
47        re = makeAlt(list.begin(), list.end());
48    } else if (Seq * seq = dyn_cast<Seq>(re)) {
49        std::vector<RE *> list;
50        list.reserve(seq->size());
51        for (RE * re : *seq) {
52            list.push_back(star_normal(re));
53        }
54        re = makeSeq(list.begin(), list.end());
55    } else if (Assertion * a = dyn_cast<Assertion>(re)) {
56        re = makeAssertion(star_normal(a->getAsserted()), a->getKind(), a->getSense());
57    } else if (Rep * rep = dyn_cast<Rep>(re)) {
58        RE * expr = star_normal(rep->getRE());
59        if (rep->getLB() == 0 && rep->getUB() == Rep::UNBOUNDED_REP) {
60            re = makeRep(star_rule(expr), 0, rep->getUB());
61        } else {
62            re = makeRep(expr, rep->getLB(), rep->getUB());
63        }
64    } else if (Diff * diff = dyn_cast<Diff>(re)) {
65        re = makeDiff(star_normal(diff->getLH()), star_normal(diff->getRH()));
66    } else if (Intersect * e = dyn_cast<Intersect>(re)) {
67        re = makeIntersect(star_normal(e->getLH()), star_normal(e->getRH()));
68    } else if (Name * name = dyn_cast<Name>(re)) {
69        if (name->getDefinition()) {
70            name->setDefinition(star_normal(name->getDefinition()));
71        }
72    }
73    return re;
74}
75
76}
Note: See TracBrowser for help on using the repository browser.