Ignore:
Timestamp:
Feb 8, 2018, 2:11:29 PM (20 months ago)
Author:
cameron
Message:

Revised canonical form for nullable expressions; extended star-normal xfrm

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_alt.h

    r5835 r5866  
    7171
    7272    bool nullable = false;
    73     RE * emptySeq = nullptr;
     73    RE * nullableSeq = nullptr;
    7474    for (auto i = begin; i != end; ++i) {
    7575        if (CC * cc = llvm::dyn_cast<CC>(*i)) {
     
    8282                if (CC * cc = llvm::dyn_cast<CC>(a)) {
    8383                    combineCC(cc);
    84                 } else if (isEmptySeq(a)) {
     84                } else if (isEmptySeq(a) && !nullable) {
    8585                    nullable = true;
    86                     emptySeq = a;
     86                    nullableSeq = a;
    8787                } else {
    8888                    newAlt->push_back(a);
     
    9191        } else if (const Rep * rep = llvm::dyn_cast<Rep>(*i)) {
    9292            if (rep->getLB() == 0) {
    93                 nullable = true;
    94                 newAlt->push_back(makeRep(rep->getRE(), 1, rep->getUB()));
     93                if (nullable) {
     94                    // Already have a nullable case.
     95                    newAlt->push_back(makeRep(rep->getRE(), 1, rep->getUB()));
     96                }
     97                else {
     98                    // This will be the nullable case.
     99                    nullableSeq = *i;
     100                    nullable = true;
     101                }
    95102            } else {
    96103                newAlt->push_back(*i);
    97104            }
    98105        } else if (isEmptySeq(*i)) {
    99             nullable = true;
    100             emptySeq = *i;
     106            if (!nullable) {
     107                nullable = true;
     108                nullableSeq = *i;
     109            }
    101110        } else {
    102111            newAlt->push_back(*i);
     
    105114    newAlt->insert(newAlt->end(), CCs.begin(), CCs.end());
    106115    if (nullable) {
    107         if (emptySeq == nullptr) {
    108             emptySeq = makeSeq();
     116        if (nullableSeq == nullptr) {
     117            nullableSeq = makeSeq();
    109118        }
    110         newAlt->push_back(emptySeq);
     119        newAlt->push_back(nullableSeq);
    111120    }
    112121    return newAlt->size() == 1 ? newAlt->front() : newAlt;
Note: See TracChangeset for help on using the changeset viewer.