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

Last change on this file since 5781 was 5781, checked in by cameron, 19 months ago

Small fixes

File size: 4.6 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_range.h>
20#include <re/re_diff.h>
21#include <re/re_intersect.h>
22#include <re/re_assertion.h>
23#include <re/re_group.h>
24
25using namespace re;
26using namespace llvm;
27
28const std::string Printer_RE::PrintRE(const RE * re) {
29    std::string retVal = "";
30
31    if (re == nullptr) {
32        retVal = "<NULL>";
33    } else if (const Alt* re_alt = dyn_cast<const Alt>(re)) {
34        retVal += "(Alt[";
35        bool comma = false;
36        for (const RE * re : *re_alt) {
37            if (comma) {
38                retVal += ',';
39            }
40            retVal += PrintRE(re);
41            comma = true;
42        }
43        retVal += "])";
44    } else if (const CC* re_cc = dyn_cast<const CC>(re)) {
45        retVal = "CC \"";
46        retVal += re_cc->canonicalName(CC_type::UnicodeClass);
47        retVal += "\" ";
48
49        for (const auto & i : *re_cc) {
50            retVal += "[";
51            retVal += std::to_string(lo_codepoint(i));
52            if (hi_codepoint(i) != lo_codepoint(i))
53                retVal += "-" + std::to_string(hi_codepoint(i));
54            retVal += "]";
55        }
56    } else if (const Name* re_name = dyn_cast<const Name>(re)) {
57        retVal = "Name \"";
58        if (re_name->hasNamespace()) {
59            retVal += re_name->getNamespace();
60            retVal += ":";
61        }
62        retVal += re_name->getName();
63        retVal += "\" ";
64            retVal += "=(" + PrintRE(re_name->getDefinition()) + ")";
65    } else if (const Range* rg = dyn_cast<const Range>(re)) {
66        retVal = "Range (";
67        retVal += PrintRE(rg->getLo());
68        retVal += " , ";
69        retVal += PrintRE(rg->getHi());
70        retVal += ") ";
71    } else if (const Assertion * a = dyn_cast<const Assertion>(re)) {
72        retVal = (a->getSense() == Assertion::Sense::Positive) ? "" : "Negative";
73        switch (a->getKind()) {
74            case Assertion::Kind::Lookahead:
75                retVal += "Lookahead";
76                break;
77            case Assertion::Kind::Lookbehind:
78                retVal += "Lookbehind";
79                break;
80            case Assertion::Kind::Boundary:
81                retVal += "Boundary";
82                break;
83        }
84        retVal += "Assertion(";
85        retVal += PrintRE(a->getAsserted());
86        retVal += ") ";
87    } else if (const Diff* diff = dyn_cast<const Diff>(re)) {
88        retVal = "Diff (";
89        retVal += PrintRE(diff->getLH());
90        retVal += " , ";
91        retVal += PrintRE(diff->getRH());
92        retVal += ") ";
93    } else if (const Intersect* x = dyn_cast<const Intersect>(re)) {
94        retVal = "Intersect (";
95        retVal += PrintRE(x->getLH());
96        retVal += " , ";
97        retVal += PrintRE(x->getRH());
98        retVal += ") ";
99    } else if (isa<const End>(re)) {
100        retVal = "End";
101    } else if (const Rep* re_rep = dyn_cast<const Rep>(re)) {
102        retVal = "Rep(";
103        retVal.append(PrintRE(re_rep->getRE()));
104        retVal.append(",");
105        retVal.append(std::to_string(re_rep->getLB()));
106        retVal.append(",");
107        if (re_rep->getUB() == Rep::UNBOUNDED_REP) {
108            retVal.append("Unbounded");
109        }
110        else {
111            retVal.append(std::to_string(re_rep->getUB()));
112        }
113        retVal.append(")");
114    } else if (const Seq* re_seq = dyn_cast<const Seq>(re)) {
115        retVal = "(Seq[";
116        bool comma = false;
117        for (const RE * re : *re_seq) {
118            if (comma) {
119                retVal.append(",");
120            }
121            retVal.append(PrintRE(re));
122            comma = true;
123        }
124        retVal.append("])");
125    } else if (const Group * g = dyn_cast<const Group>(re)) {
126        retVal = "Group(";
127        if (g->getMode() == Group::Mode::GraphemeMode) {
128            retVal.append((g->getSense() == Group::Sense::On) ? "+g:" : "-g:");
129        }
130        else if (g->getMode() == Group::Mode::CaseInsensitiveMode) {
131            retVal.append((g->getSense() == Group::Sense::On) ? "+i:" : "-i:");
132        }
133        retVal.append(PrintRE(g->getRE()));
134        retVal.append(")");
135    } else if (isa<const Start>(re)) {
136        retVal = "Start";
137    } else if (isa<const Any>(re)) {
138        retVal = "Any";
139    } else {
140        retVal = "???";
141    }
142    return retVal;
143}
Note: See TracBrowser for help on using the repository browser.