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

Last change on this file since 4329 was 4329, checked in by cameron, 5 years ago

Improved names

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