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

Last change on this file since 5037 was 5037, checked in by nmedfort, 3 years ago

UnicodeSet? bug fix and compile warning clean-up.

File size: 4.1 KB
RevLine 
[3850]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
[4187]9//Regular Expressions
[4255]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>
[4298]20#include <re/re_intersect.h>
[4405]21#include <re/re_assertion.h>
[4829]22#include <re/re_grapheme_boundary.hpp>
[3850]23
[4194]24using namespace re;
[4187]25
26const std::string Printer_RE::PrintRE(const RE * re)
[3850]27{
28    std::string retVal = "";
29
[4182]30    if (re == nullptr) {
[4255]31        retVal = "<NULL>";
[4182]32    }
[4194]33    else if (const Alt* re_alt = dyn_cast<const Alt>(re))
[3850]34    {
35        retVal += "(Alt[";
[4187]36        bool comma = false;
37        for (const RE * re : *re_alt) {
38            if (comma) {
39                retVal += ',';
40            }
41            retVal += PrintRE(re);
42            comma = true;
[3850]43        }
44        retVal += "])";
45    }
[4194]46    else if (const CC* re_cc = dyn_cast<const CC>(re))
[3850]47    {
[4187]48        retVal = "CC \"";
[4337]49        retVal += re_cc->canonicalName(UnicodeClass);
[3850]50        retVal += "\" ";
51
[4614]52        for (const auto & i : *re_cc) {
[3850]53            retVal += "[";
[4614]54            retVal += std::to_string(lo_codepoint(i)) + ",";
55            retVal += std::to_string(hi_codepoint(i));
[3850]56            retVal += "]";
57        }
58    }
[4194]59    else if (const Name* re_name = dyn_cast<const Name>(re))
[3914]60    {
[4187]61        retVal = "Name \"";
[3914]62        retVal += re_name->getName();
63        retVal += "\" ";
64    }
[4405]65    else if (const Assertion * a = dyn_cast<const Assertion>(re)) {
66        retVal = (a->getSense() == Assertion::Sense::Positive) ? "" : "Negative";
67        retVal += (a->getKind() == Assertion::Kind::Lookahead) ? "Lookahead" : "Lookbehind";
68        retVal += "Assertion(";
69        retVal += PrintRE(a->getAsserted());
70        retVal += ") ";
71    }
[4255]72    else if (const Diff* diff = dyn_cast<const Diff>(re))
73    {
74        retVal = "Diff (";
75        retVal += PrintRE(diff->getLH());
76        retVal += " , ";
77        retVal += PrintRE(diff->getRH());
78        retVal += ") ";
79    }
[4298]80    else if (const Intersect* x = dyn_cast<const Intersect>(re))
81    {
82        retVal = "Intersect (";
83        retVal += PrintRE(x->getLH());
84        retVal += " , ";
85        retVal += PrintRE(x->getRH());
86        retVal += ") ";
87    }
[4841]88    else if (const GraphemeBoundary * g = dyn_cast<GraphemeBoundary>(re)) {
[4829]89        retVal = "Grapheme";
90        switch (g->getType()) {
91            case GraphemeBoundary::Type::ClusterBoundary:
92                retVal += "Cluster"; break;
93            case GraphemeBoundary::Type::LineBreakBoundary:
94                retVal += "LineBreak"; break;
95            case GraphemeBoundary::Type::SentenceBoundary:
96                retVal += "Sentence"; break;
97            case GraphemeBoundary::Type::WordBoundary:
98                retVal += "Word"; break;
99        }
100        retVal += "Boundary(";
[4841]101        if (g->getExpression()) {
102            retVal += PrintRE(g->getExpression());
103        }
104        retVal += ")";
[4829]105    }
[4194]106    else if (isa<const End>(re))
[3850]107    {
[4187]108        retVal = "End";
[3850]109    }
[4194]110    else if (const Rep* re_rep = dyn_cast<const Rep>(re))
[3850]111    {
[4187]112        retVal = "Rep(";
113        retVal.append(PrintRE(re_rep->getRE()));
114        retVal.append(",");
115        retVal.append(std::to_string(re_rep->getLB()));
116        retVal.append(",");
117        if (re_rep->getUB() == Rep::UNBOUNDED_REP) {
118            retVal.append("Unbounded");
119        }
120        else {
[4405]121            retVal.append(std::to_string(re_rep->getUB()));
[4187]122        }
123        retVal.append(")");
[3850]124    }
[4194]125    else if (const Seq* re_seq = dyn_cast<const Seq>(re))
[3850]126    {
[4187]127        retVal = "(Seq[";
128        bool comma = false;
129        for (const RE * re : *re_seq) {
130            if (comma) {
131                retVal.append(",");
132            }
133            retVal.append(PrintRE(re));
134            comma = true;
[3850]135        }
[4187]136        retVal.append("])");
[3850]137    }
[4194]138    else if (isa<const Start>(re))
[3850]139    {
[4187]140        retVal = "Start";
[3850]141    }
[4245]142    else if (isa<const Any>(re))
143    {
144        retVal = "Any";
145    }
[3850]146    else
147    {
[4255]148        retVal = "???";
[3850]149    }
[5037]150    return retVal;
[3850]151}
Note: See TracBrowser for help on using the repository browser.