Changeset 5736 for icGREP


Ignore:
Timestamp:
Nov 15, 2017, 4:11:48 PM (14 months ago)
Author:
cameron
Message:

Bug fixes for empty sequences

Location:
icGREP/icgrep-devel/icgrep/re
Files:
3 edited

Legend:

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

    r5649 r5736  
    6363    if (LLVM_UNLIKELY(std::distance(begin, end) == 0)) {
    6464        return makeAlt();
    65     } else if (std::distance(begin, end) == 1) {
    66         return *begin;
    6765    } else {
    6866        Alt * alt = makeAlt();
  • icGREP/icgrep-devel/icgrep/re/re_analysis.cpp

    r5727 r5736  
    323323        return true;
    324324    } else if (const Seq * seq = dyn_cast<Seq>(re)) {
     325        if (seq->empty()) return false;
    325326        for (const RE * re : *seq) {
    326327            if (!isTypeForLocal(re)) {
  • icGREP/icgrep-devel/icgrep/re/re_local.cpp

    r5706 r5736  
    121121        }
    122122    } else if (Seq * seq = dyn_cast<Seq>(re)) {
    123         RE * re_first = *(seq->begin());
    124         RE * re_follow = makeSeq(seq->begin() + 1, seq->end());
    125         auto e1 = final(re_first);
    126         auto e2 = first(re_follow);
    127         if (e1 && e2) {
    128             auto e = follow_map.find(e1);
    129             if (e != follow_map.end()) {
    130                 e->second = makeCC(e->second, e2);
    131             } else {
    132                 follow_map.emplace(e1, e2);
    133             }
    134         }
    135         follow(re_first, follow_map);
    136         follow(re_follow, follow_map);
     123        if (seq->size() > 0) {
     124            RE * re_first = *(seq->begin());
     125            RE * re_follow = makeSeq(seq->begin() + 1, seq->end());
     126            auto e1 = final(re_first);
     127            auto e2 = first(re_follow);
     128            if (e1 && e2) {
     129                auto e = follow_map.find(e1);
     130                if (e != follow_map.end()) {
     131                    e->second = makeCC(e->second, e2);
     132                } else {
     133                    follow_map.emplace(e1, e2);
     134                }
     135            }
     136            follow(re_first, follow_map);
     137            follow(re_follow, follow_map);
     138        }
    137139    } else if (Alt * alt = dyn_cast<Alt>(re)) {
    138140        for (auto ai = alt->begin(); ai != alt->end(); ++ai) {
Note: See TracChangeset for help on using the changeset viewer.