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

Last change on this file was 5430, checked in by cameron, 5 months ago

RE print representation of captures must included the capture definition for uniqueness

File size: 3.7 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include "printer_re.h"
8
9//Regular Expressions
10#include <re/re_re.h>
11#include <re/re_alt.h>
12#include <re/re_any.h>
13#include <re/re_cc.h>
14#include <re/re_name.h>
15#include <re/re_end.h>
16#include <re/re_rep.h>
17#include <re/re_seq.h>
18#include <re/re_start.h>
19#include <re/re_diff.h>
20#include <re/re_intersect.h>
21#include <re/re_assertion.h>
22
23using namespace re;
24using namespace llvm;
25
26const std::string Printer_RE::PrintRE(const RE * re) {
27    std::string retVal = "";
28
29    if (re == nullptr) {
30        retVal = "<NULL>";
31    } else if (const Alt* re_alt = dyn_cast<const Alt>(re)) {
32        retVal += "(Alt[";
33        bool comma = false;
34        for (const RE * re : *re_alt) {
35            if (comma) {
36                retVal += ',';
37            }
38            retVal += PrintRE(re);
39            comma = true;
40        }
41        retVal += "])";
42    } else if (const CC* re_cc = dyn_cast<const CC>(re)) {
43        retVal = "CC \"";
44        retVal += re_cc->canonicalName(UnicodeClass);
45        retVal += "\" ";
46
47        for (const auto & i : *re_cc) {
48            retVal += "[";
49            retVal += std::to_string(lo_codepoint(i)) + ",";
50            retVal += std::to_string(hi_codepoint(i));
51            retVal += "]";
52        }
53    } else if (const Name* re_name = dyn_cast<const Name>(re)) {
54        retVal = "Name \"";
55        retVal += re_name->getName();
56        retVal += "\" ";
57        if (re_name->getType() == Name::Type::Capture) {
58            retVal += "=(" + PrintRE(re_name->getDefinition()) + ")";
59        }
60    } else if (const Assertion * a = dyn_cast<const Assertion>(re)) {
61        retVal = (a->getSense() == Assertion::Sense::Positive) ? "" : "Negative";
62        switch (a->getKind()) {
63            case Assertion::Kind::Lookahead:
64                retVal += "Lookahead";
65                break;
66            case Assertion::Kind::Lookbehind:
67                retVal += "Lookbehind";
68                break;
69            case Assertion::Kind::Boundary:
70                retVal += "Boundary";
71                break;
72        }
73        retVal += "Assertion(";
74        retVal += PrintRE(a->getAsserted());
75        retVal += ") ";
76    } else if (const Diff* diff = dyn_cast<const Diff>(re)) {
77        retVal = "Diff (";
78        retVal += PrintRE(diff->getLH());
79        retVal += " , ";
80        retVal += PrintRE(diff->getRH());
81        retVal += ") ";
82    } else if (const Intersect* x = dyn_cast<const Intersect>(re)) {
83        retVal = "Intersect (";
84        retVal += PrintRE(x->getLH());
85        retVal += " , ";
86        retVal += PrintRE(x->getRH());
87        retVal += ") ";
88    } else if (isa<const End>(re)) {
89        retVal = "End";
90    } else if (const Rep* re_rep = dyn_cast<const Rep>(re)) {
91        retVal = "Rep(";
92        retVal.append(PrintRE(re_rep->getRE()));
93        retVal.append(",");
94        retVal.append(std::to_string(re_rep->getLB()));
95        retVal.append(",");
96        if (re_rep->getUB() == Rep::UNBOUNDED_REP) {
97            retVal.append("Unbounded");
98        }
99        else {
100            retVal.append(std::to_string(re_rep->getUB()));
101        }
102        retVal.append(")");
103    } else if (const Seq* re_seq = dyn_cast<const Seq>(re)) {
104        retVal = "(Seq[";
105        bool comma = false;
106        for (const RE * re : *re_seq) {
107            if (comma) {
108                retVal.append(",");
109            }
110            retVal.append(PrintRE(re));
111            comma = true;
112        }
113        retVal.append("])");
114    } else if (isa<const Start>(re)) {
115        retVal = "Start";
116    } else if (isa<const Any>(re)) {
117        retVal = "Any";
118    } else {
119        retVal = "???";
120    }
121    return retVal;
122}
Note: See TracBrowser for help on using the repository browser.