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

Last change on this file since 4415 was 4405, checked in by cameron, 4 years ago

AST support for Lookahead/Lookbehind? assertions

File size: 3.4 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;
24
25const std::string Printer_RE::PrintRE(const RE * re)
26{
27    std::string retVal = "";
28
29    if (re == nullptr) {
30        retVal = "<NULL>";
31    }
32    else if (const Alt* re_alt = dyn_cast<const Alt>(re))
33    {
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    }
45    else if (const CC* re_cc = dyn_cast<const CC>(re))
46    {
47        retVal = "CC \"";
48        retVal += re_cc->canonicalName(UnicodeClass);
49        retVal += "\" ";
50
51        for (const CharSetItem & item : *re_cc)
52        {
53            retVal += "[";
54            retVal += std::to_string(item.lo_codepoint) + ",";
55            retVal += std::to_string(item.hi_codepoint);
56            retVal += "]";
57        }
58    }
59    else if (const Name* re_name = dyn_cast<const Name>(re))
60    {
61        retVal = "Name \"";
62        retVal += re_name->getName();
63        retVal += "\" ";
64    }
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    }
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    }
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    }
88    else if (isa<const End>(re))
89    {
90        retVal = "End";
91    }
92    else if (const Rep* re_rep = dyn_cast<const Rep>(re))
93    {
94        retVal = "Rep(";
95        retVal.append(PrintRE(re_rep->getRE()));
96        retVal.append(",");
97        retVal.append(std::to_string(re_rep->getLB()));
98        retVal.append(",");
99        if (re_rep->getUB() == Rep::UNBOUNDED_REP) {
100            retVal.append("Unbounded");
101        }
102        else {
103            retVal.append(std::to_string(re_rep->getUB()));
104        }
105        retVal.append(")");
106    }
107    else if (const Seq* re_seq = dyn_cast<const Seq>(re))
108    {
109        retVal = "(Seq[";
110        bool comma = false;
111        for (const RE * re : *re_seq) {
112            if (comma) {
113                retVal.append(",");
114            }
115            retVal.append(PrintRE(re));
116            comma = true;
117        }
118        retVal.append("])");
119    }
120    else if (isa<const Start>(re))
121    {
122        retVal = "Start";
123    }
124    else if (isa<const Any>(re))
125    {
126        retVal = "Any";
127    }
128    else
129    {
130        retVal = "???";
131    }
132    return std::move(retVal);
133}
Note: See TracBrowser for help on using the repository browser.