Ignore:
Timestamp:
Jul 4, 2016, 8:54:48 PM (3 years ago)
Author:
cameron
Message:

Initial support for capture groups/back references; back reference simply repeats regexp

File:
1 edited

Legend:

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

    r4841 r5080  
    3535        return isByteLength(e->getLH()) && isByteLength(e->getRH());
    3636    } else if (const Name * n = dyn_cast<Name>(re)) {
    37         return (n->getType() == Name::Type::Byte);
     37        if (n->getType() == Name::Type::Byte) {
     38            return true;
     39        }
     40        else if (n->getType() == Name::Type::Capture || n->getType() == Name::Type::Reference) {
     41            return isByteLength(n->getDefinition());
     42        }
     43        return false;
    3844    }
    3945    return false; // otherwise
     
    6268    } else if (const Name * n = dyn_cast<Name>(re)) {
    6369        // Eventually names might be set up for not unit length items.
    64         return (n->getType() == Name::Type::Unicode || n->getType() == Name::Type::UnicodeProperty || n->getType() == Name::Type::Byte);
     70        if (n->getType() == Name::Type::Unicode || n->getType() == Name::Type::UnicodeProperty || n->getType() == Name::Type::Byte) {
     71            return true;
     72        }
     73        else if (n->getType() == Name::Type::Capture || n->getType() == Name::Type::Reference) {
     74            return isUnicodeUnitLength(n->getDefinition());
     75        }
     76        return false;
    6577    }
    6678    return false; // otherwise
     
    122134            case Name::Type::UnicodeProperty:
    123135                return std::make_pair(1, 1);
     136            case Name::Type::Capture:
     137            case Name::Type::Reference:
     138                return getUnicodeUnitLengthRange(n->getDefinition());
    124139            case Name::Type::Unknown:
    125140                return std::make_pair(0, std::numeric_limits<int>::max());
     
    165180        return 1;
    166181    }
    167     else if (isa<Name>(re)) {
    168         return 1;
     182    else if (const Name * n = dyn_cast<Name>(re)) {
     183    // Eventually names might be set up for not unit length items.
     184        switch (n->getType()) {
     185            case Name::Type::Byte:
     186            case Name::Type::Unicode:
     187            case Name::Type::UnicodeProperty:
     188                return 1;
     189            case Name::Type::Capture:
     190            case Name::Type::Reference:
     191                return minMatchLength(n->getDefinition());
     192            case Name::Type::Unknown:
     193                return 0;
     194        }
    169195    }
    170196    return 0; // otherwise
Note: See TracChangeset for help on using the changeset viewer.