Ignore:
Timestamp:
Dec 16, 2017, 9:06:44 AM (20 months ago)
Author:
cameron
Message:

Restructuring step/tidy-up for re_passes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_multiplex.cpp

    r5781 r5784  
    2323namespace re {
    2424 
    25 static inline CC * extractCC(RE * re) {
    26     if (isa<CC>(re)) {
    27         return cast<CC>(re);
    28     } else if (isa<Name>(re)) {
    29         return extractCC(cast<Name>(re)->getDefinition());
    30     }
    31     return nullptr;
    32 }
    33 
    3425RE * multiplex(RE * const re,
    3526               const std::vector<const CC *> & UnicodeSets,
     
    6354                    }
    6455                } else {
    65                     throw std::runtime_error("All non-unicode-property Name objects should have been defined prior to Unicode property resolution.");
     56                    UndefinedNameError(name);
    6657                }
    6758                return memoizer.memoize(name);
     
    7465            }
    7566        } else if (Alt * alt = dyn_cast<Alt>(re)) {
    76             CC * unionCC = nullptr;
    77             std::stringstream name;
    78             for (auto ai = alt->begin(); ai != alt->end(); ) {
    79                 RE * re = multiplex(*ai);
    80                 if (CC * cc = extractCC(re)) {
    81                     if (unionCC == nullptr) {
    82                         unionCC = cc;
    83                     } else {
    84                         unionCC = makeCC(unionCC, cc);
    85                         name << '+';
    86                     }
    87                     if (LLVM_LIKELY(isa<Name>(re))) {
    88                         Name * n = cast<Name>(re);
    89                         if (n->hasNamespace()) {
    90                             name << n->getNamespace() << ':';
    91                         }
    92                         name << n->getName();
    93                     } else if (isa<CC>(re)) {
    94                         name << cast<CC>(re)->canonicalName(CC_type::UnicodeClass);
    95                     }
    96                     ai = alt->erase(ai);
    97                 } else {
    98                     *ai++ = re;
    99                 }
    100             }
    101             if (unionCC) {
    102                 alt->push_back(multiplex(makeName(name.str(), unionCC)));
    103             }
    104             if (alt->size() == 1) {
    105                 return alt->front();
     67            for (auto ai = alt->begin(); ai != alt->end(); ++ai) {
     68                *ai = multiplex(*ai);
    10669            }
    10770        } else if (Rep * rep = dyn_cast<Rep>(re)) {
Note: See TracChangeset for help on using the changeset viewer.