Ignore:
Timestamp:
Dec 16, 2017, 12:51:48 PM (15 months ago)
Author:
cameron
Message:

Decouple Unicode property support from re_compiler; initial support for (?-m) flag

File:
1 edited

Legend:

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

    r5781 r5786  
    3232
    3333struct NameResolver {
     34    RE * resolveUnicodeProperties(RE * re) {
     35        if (Name * name = dyn_cast<Name>(re)) {
     36            auto f = mMemoizer.find(name);
     37            if (f == mMemoizer.end()) {
     38                if (LLVM_LIKELY(name->getDefinition() != nullptr)) {
     39                    name->setDefinition(resolveUnicodeProperties(name->getDefinition()));
     40                } else if (LLVM_LIKELY(name->getType() == Name::Type::UnicodeProperty || name->getType() == Name::Type::ZeroWidth)) {
     41                    if (UCD::resolvePropertyDefinition(name)) {
     42                        name->setDefinition(resolveUnicodeProperties(name->getDefinition()));
     43                    } else {
     44                        name->setDefinition(makeCC(UCD::resolveUnicodeSet(name)));
     45                    }
     46                } else {
     47                    UndefinedNameError(name);
     48                }
     49            } else {
     50                return *f;
     51            }
     52        } else if (Seq * seq = dyn_cast<Seq>(re)) {
     53            for (auto si = seq->begin(); si != seq->end(); ++si) {
     54                *si = resolveUnicodeProperties(*si);
     55            }
     56        } else if (Alt * alt = dyn_cast<Alt>(re)) {
     57            for (auto ai = alt->begin(); ai != alt->end(); ++ai) {
     58                *ai = resolveUnicodeProperties(*ai);
     59            }
     60        } else if (Rep * rep = dyn_cast<Rep>(re)) {
     61            rep->setRE(resolveUnicodeProperties(rep->getRE()));
     62        } else if (Assertion * a = dyn_cast<Assertion>(re)) {
     63            a->setAsserted(resolveUnicodeProperties(a->getAsserted()));
     64        } else if (Range * rg = dyn_cast<Range>(re)) {
     65            rg->setLo(resolveUnicodeProperties(rg->getLo()));
     66            rg->setHi(resolveUnicodeProperties(rg->getHi()));
     67        } else if (Diff * diff = dyn_cast<Diff>(re)) {
     68            diff->setLH(resolveUnicodeProperties(diff->getLH()));
     69            diff->setRH(resolveUnicodeProperties(diff->getRH()));
     70        } else if (Intersect * ix = dyn_cast<Intersect>(re)) {
     71            ix->setLH(resolveUnicodeProperties(ix->getLH()));
     72            ix->setRH(resolveUnicodeProperties(ix->getRH()));
     73        } else if (Group * g = dyn_cast<Group>(re)) {
     74            g->setRE(resolveUnicodeProperties(g->getRE()));
     75        }
     76        return re;
     77    }
     78   
    3479    RE * resolve(RE * re) {
    3580        if (Name * name = dyn_cast<Name>(re)) {
     
    3883                if (LLVM_LIKELY(name->getDefinition() != nullptr)) {
    3984                    name->setDefinition(resolve(name->getDefinition()));
    40                 } else if (LLVM_LIKELY(name->getType() == Name::Type::UnicodeProperty || name->getType() == Name::Type::ZeroWidth)) {
    41                     if (UCD::resolvePropertyDefinition(name)) {
    42                         name->setDefinition(resolve(name->getDefinition()));
    43                     } else {
    44                         name->setDefinition(makeCC(UCD::resolveUnicodeSet(name)));
    45                     }
    4685                } else {
    47                     throw std::runtime_error("All non-unicode-property Name objects should have been defined prior to Unicode property resolution.");
     86                    UndefinedNameError(name);
    4887                }
    4988            } else {
     
    104143        return re;
    105144    }
    106 
     145   
    107146private:
    108147    Memoizer                mMemoizer;
    109148};
    110149   
    111 RE * resolveNames(RE * re) {
    112     NameResolver nameResolver;
    113     return nameResolver.resolve(re);   
     150    RE * resolveUnicodeProperties(RE * re) {
     151        NameResolver nameResolver;
     152        return nameResolver.resolveUnicodeProperties(re);
     153    }
     154   
     155    RE * resolveNames(RE * re) {
     156        NameResolver nameResolver;
     157        return nameResolver.resolve(re);
     158    }
     159   
    114160}
    115 
    116 }
Note: See TracChangeset for help on using the changeset viewer.