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

Last change on this file since 5130 was 5091, checked in by xuedongx, 3 years ago

delete GCB as a separate type.

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