Changeset 5683 for icGREP/icgrep-devel


Ignore:
Timestamp:
Oct 9, 2017, 5:27:34 PM (20 months ago)
Author:
cameron
Message:

Support for \p{property=@identity@}

Location:
icGREP/icgrep-devel/icgrep
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/UCD/PropertyObjects.cpp

    r5682 r5683  
    5252    return GetCodepointSet(property_enum_val);
    5353}
     54   
     55const UnicodeSet PropertyObject::GetReflexiveSet() {
     56    return UnicodeSet();
     57}
     58
    5459
    5560class PropertyValueAccumulator : public grep::MatchAccumulator {
     
    337342}
    338343   
     344const UnicodeSet StringPropertyObject::GetReflexiveSet() {
     345    return mSelfCodepointSet;
     346}
     347
    339348const UnicodeSet StringOverridePropertyObject::GetCodepointSet(const std::string & value_spec) {
    340349    // First step: get the codepoints from the base object and then remove any overridden ones.
     
    365374}
    366375
     376const UnicodeSet StringOverridePropertyObject::GetReflexiveSet() {
     377    return mBaseObject.GetReflexiveSet() - mOverriddenSet;
     378}
     379
    367380
    368381const std::string & ObsoletePropertyObject::GetPropertyValueGrepString() {
  • icGREP/icgrep-devel/icgrep/UCD/PropertyObjects.h

    r5679 r5683  
    4343    virtual const UnicodeSet GetCodepointSet(const std::string & prop_value_string);
    4444    virtual const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern);
     45    virtual const UnicodeSet GetReflexiveSet();
    4546
    4647    virtual const std::string & GetPropertyValueGrepString();
     
    209210    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
    210211    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
    211 
     212    const UnicodeSet GetReflexiveSet() override;
     213   
    212214private:
    213215    UnicodeSet mNullCodepointSet;  // codepoints for which the property value is the null string.
     
    239241    const UnicodeSet GetCodepointSet(const std::string & value_spec) override;
    240242    const UnicodeSet GetCodepointSetMatchingPattern(re::RE * pattern) override;
    241 
     243    const UnicodeSet GetReflexiveSet() override;
     244   
    242245private:
    243246    PropertyObject & mBaseObject;  // the base object that provides default values for this property unless overridden.
  • icGREP/icgrep-devel/icgrep/UCD/resolve_properties.cpp

    r5679 r5683  
    141141                UnicodePropertyExpressionError("Expected a property name, but '" + name->getNamespace() + "' found instead");
    142142            }
    143             auto theprop = propit->second;
     143            auto propObj = property_object_table[propit->second];
    144144            if ((value.length() > 0) && (value[0] == '/')) {
    145145                // resolve a regular expression
    146146                re::RE * propValueRe = RE_Parser::parse(value.substr(1), re::DEFAULT_MODE, re::PCRE);
    147                 return property_object_table[theprop]->GetCodepointSetMatchingPattern(propValueRe);
     147                return propObj->GetCodepointSetMatchingPattern(propValueRe);
     148            }
     149            if ((value.length() > 0) && (value[0] == '@')) {
     150                // resolve a @property@ or @identity@ expression.
     151                std::string otherProp = canonicalize_value_name(value.substr(1));
     152                if (otherProp == "identity") {
     153                    return propObj->GetReflexiveSet();
     154                }
     155                auto propit = alias_map.find(prop);
     156                if (propit == alias_map.end()) {
     157                    UnicodePropertyExpressionError("Expected a property name, but '" + value.substr(1) + "' found instead");
     158                }
     159                auto propObj2 = property_object_table[propit->second];
     160                if (isa<BinaryPropertyObject>(propObj) && isa<BinaryPropertyObject>(propObj2)) {
     161                    return ~(cast<BinaryPropertyObject>(propObj)->GetCodepointSet(UCD::Binary_ns::Y) ^
     162                             cast<BinaryPropertyObject>(propObj2)->GetCodepointSet(UCD::Binary_ns::Y));
     163                }
     164                else {
     165                    UnicodePropertyExpressionError("unsupported");
     166                }
    148167            }
    149168            else {
    150                 return property_object_table[theprop]->GetCodepointSet(value);
     169                return propObj->GetCodepointSet(value);
    151170            }
    152171        }
  • icGREP/icgrep-devel/icgrep/re/re_parser.cpp

    r5679 r5683  
    642642        mCursor++;
    643643        auto val_start = mCursor.pos();
    644         if (*val_start != '/') {
     644        if (*val_start == '/') {
     645            // property-value is another regex
     646            auto previous = val_start;
     647            auto current = (++mCursor).pos();
     648            val_start = current;
     649           
     650            while (true) {
     651                if (*current == '/' && *previous != '\\') {
     652                    break;
     653                }
     654               
     655                if (!mCursor.more()) {
     656                    ParseFailure("Malformed property expression");
     657                }
     658               
     659                previous = current;
     660                current = (++mCursor).pos();
     661            }
     662            ++mCursor;
     663            //return parseRegexPropertyValue(canonicalize(start, prop_end), std::string(val_start, current));
     664            return createName(canonicalize(start, prop_end), std::string(val_start-1, current));
     665        }
     666        if (*val_start == '@') {
     667            // property-value is @property@ or @identity@
     668            auto previous = val_start;
     669            auto current = (++mCursor).pos();
     670            val_start = current;
     671           
     672            while (true) {
     673                if (*current == '@' && *previous != '\\') {
     674                    break;
     675                }
     676               
     677                if (!mCursor.more()) {
     678                    ParseFailure("Malformed property expression");
     679                }
     680               
     681                previous = current;
     682                current = (++mCursor).pos();
     683            }
     684            ++mCursor;
     685            //return parseRegexPropertyValue(canonicalize(start, prop_end), std::string(val_start, current));
     686            return createName(canonicalize(start, prop_end), std::string(val_start-1, current));
     687        }
     688        else {
    645689            // property-value is normal string
    646690            while (mCursor.more()) {
     
    656700            }
    657701            return createName(canonicalize(start, prop_end), std::string(val_start, mCursor.pos()));
    658         } else {
    659             // property-value is another regex
    660             auto previous = val_start;
    661             auto current = (++mCursor).pos();
    662             val_start = current;
    663 
    664             while (true) {
    665                 if (*current == '/' && *previous != '\\') {
    666                     break;
    667                 }
    668 
    669                 if (!mCursor.more()) {
    670                     ParseFailure("Malformed property expression");
    671                 }
    672 
    673                 previous = current;
    674                 current = (++mCursor).pos();
    675             }
    676             ++mCursor;
    677             //return parseRegexPropertyValue(canonicalize(start, prop_end), std::string(val_start, current));
    678             return createName(canonicalize(start, prop_end), std::string(val_start-1, current));
    679702        }
    680703    }
Note: See TracChangeset for help on using the changeset viewer.