/* * Copyright (c) 2014 International Characters. * This software is licensed to the public under the Open Software License 3.0. * icgrep is a trademark of International Characters. */ #include "printer_re.h" //Regular Expressions #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace re; using namespace llvm; const std::string Printer_RE::PrintRE(const RE * re) { std::string retVal = ""; if (re == nullptr) { retVal = ""; } else if (const Alt* re_alt = dyn_cast(re)) { retVal += "(Alt["; bool comma = false; for (const RE * re : *re_alt) { if (comma) { retVal += ','; } retVal += PrintRE(re); comma = true; } retVal += "])"; } else if (const CC* re_cc = dyn_cast(re)) { retVal = "CC \""; retVal += re_cc->canonicalName(CC_type::UnicodeClass); retVal += "\" "; for (const auto & i : *re_cc) { retVal += "["; retVal += std::to_string(lo_codepoint(i)); if (hi_codepoint(i) != lo_codepoint(i)) retVal += "-" + std::to_string(hi_codepoint(i)); retVal += "]"; } retVal += "/" + re_cc->getAlphabet()->getName(); } else if (const Name* re_name = dyn_cast(re)) { retVal = "Name \""; if (re_name->hasNamespace()) { retVal += re_name->getNamespace(); retVal += ":"; } retVal += re_name->getName(); retVal += "\" "; //if (re_name->getType() == Name::Type::Capture) { retVal += "=(" + PrintRE(re_name->getDefinition()) + ")"; //} } else if (const Range* rg = dyn_cast(re)) { retVal = "Range ("; retVal += PrintRE(rg->getLo()); retVal += " , "; retVal += PrintRE(rg->getHi()); retVal += ") "; } else if (const Assertion * a = dyn_cast(re)) { retVal = (a->getSense() == Assertion::Sense::Positive) ? "" : "Negative"; switch (a->getKind()) { case Assertion::Kind::Lookahead: retVal += "Lookahead"; break; case Assertion::Kind::Lookbehind: retVal += "Lookbehind"; break; case Assertion::Kind::Boundary: retVal += "Boundary"; break; } retVal += "Assertion("; retVal += PrintRE(a->getAsserted()); retVal += ") "; } else if (const Diff* diff = dyn_cast(re)) { retVal = "Diff ("; retVal += PrintRE(diff->getLH()); retVal += " , "; retVal += PrintRE(diff->getRH()); retVal += ") "; } else if (const Intersect* x = dyn_cast(re)) { retVal = "Intersect ("; retVal += PrintRE(x->getLH()); retVal += " , "; retVal += PrintRE(x->getRH()); retVal += ") "; } else if (isa(re)) { retVal = "End"; } else if (const Rep* re_rep = dyn_cast(re)) { retVal = "Rep("; retVal.append(PrintRE(re_rep->getRE())); retVal.append(","); retVal.append(std::to_string(re_rep->getLB())); retVal.append(","); if (re_rep->getUB() == Rep::UNBOUNDED_REP) { retVal.append("Unbounded"); } else { retVal.append(std::to_string(re_rep->getUB())); } retVal.append(")"); } else if (const Seq* re_seq = dyn_cast(re)) { retVal = "(Seq["; bool comma = false; for (const RE * re : *re_seq) { if (comma) { retVal.append(","); } retVal.append(PrintRE(re)); comma = true; } retVal.append("])"); } else if (const Group * g = dyn_cast(re)) { retVal = "Group("; if (g->getMode() == Group::Mode::GraphemeMode) { retVal.append((g->getSense() == Group::Sense::On) ? "+g:" : "-g:"); } else if (g->getMode() == Group::Mode::CaseInsensitiveMode) { retVal.append((g->getSense() == Group::Sense::On) ? "+i:" : "-i:"); } retVal.append(PrintRE(g->getRE())); retVal.append(")"); } else if (isa(re)) { retVal = "Start"; } else if (isa(re)) { retVal = "Any"; } else { retVal = "???"; } return retVal; }