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

Last change on this file since 6219 was 6219, checked in by cameron, 6 months ago

Update lz4 grep; don't print definitions of names except when needed

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