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

Support for \p{property=@identity@}

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.