Changeset 4830


Ignore:
Timestamp:
Oct 12, 2015, 10:19:25 AM (2 years ago)
Author:
cameron
Message:

\b{g} syntax, etc.

File:
1 edited

Legend:

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

    r4829 r4830  
    272272                std::tie(lb, ub) = parse_range_bound();
    273273                break;
    274             case '\\':
    275                 re = parseGraphemeBoundary(re);
    276274            default:
    277275                return re;
     
    295293        return makeRep(re, lb, ub);
    296294    }
    297 }
    298 
    299 RE * RE_Parser::parseGraphemeBoundary(RE * re) {
    300     if (mCursor.remaining() > 3) {
    301         Cursor cursor(mCursor);
    302         bool complement = false;
    303         ++cursor;
    304         if (*cursor == 'b') {
    305             complement = false;
    306         } else if (*cursor == 'B') {
    307             complement = true;
    308         } else {
    309             return re;
    310         }
    311         // since /b and /B also denote word break, which could also be extended with a range,
    312         // we'll quietly abort if we cannot find a valid grapheme boundary identifier
    313         if (*++cursor == '{') {
    314             GraphemeBoundary::Type type = GraphemeBoundary::Type::ClusterBoundary;
    315             switch (*++cursor) {
    316                 case 'g': type = GraphemeBoundary::Type::ClusterBoundary; break;
    317                 case 'w': type = GraphemeBoundary::Type::WordBoundary; break;
    318                 case 'l': type = GraphemeBoundary::Type::LineBreakBoundary; break;
    319                 case 's': type = GraphemeBoundary::Type::SentenceBoundary; break;
    320                 default: return re;
    321             }
    322             if (*++cursor == '}') {
    323                 mCursor = ++cursor;
    324                 re = makeGraphemeBoundary(re, type);
    325             }
    326         }
    327     }
    328     return re;
    329295}
    330296
     
    379345
    380346inline RE * RE_Parser::parse_escaped() {
    381     if (isSetEscapeChar(*mCursor))
    382       return parseEscapedSet();
    383     else
    384       return createCC(parse_escaped_codepoint());
    385 }
    386 
     347    if (isSetEscapeChar(*mCursor)) {
     348        return parseEscapedSet();
     349    }
     350    else {
     351        return createCC(parse_escaped_codepoint());
     352    }
     353}
     354   
     355inline RE * makeGraphemeClusterBoundary() {
     356    throw ParseFailure("makeGraphemeClusterBoundary() not yet supported.");
     357}
     358   
     359   
    387360RE * RE_Parser::parseEscapedSet() {
    388361    bool complemented = false;
    389362    RE * re = nullptr;
    390363    switch (*mCursor) {
     364        case 'B': complemented = true;
    391365        case 'b':
    392366            ++mCursor;
    393             return makeWordBoundary();
    394         case 'B':
    395             ++mCursor;
    396             return makeWordNonBoundary();
     367            if (!mCursor.more() || *mCursor != '{') {
     368                return complemented ? makeWordNonBoundary() : makeWordBoundary();
     369            }
     370            else {
     371                ++mCursor;
     372                switch (*mCursor) {
     373                    case 'g': re = makeGraphemeClusterBoundary();
     374                    case 'w': throw ParseFailure("\\b{w} not yet supported.");
     375                    case 'l': throw ParseFailure("\\b{l} not yet supported.");
     376                    case 's': throw ParseFailure("\\b{s} not yet supported.");
     377                    default: throw ParseFailure("Unrecognized boundary assertion");
     378                }
     379                ++mCursor;
     380                if (*mCursor != '}') {
     381                    throw ParseFailure("Malformed boundary assertion");
     382                }
     383                ++mCursor;
     384                return complemented ? makeComplement(re) : re;
     385            }
    397386        case 'd':
    398387            ++mCursor;
     
    420409            }
    421410            ++mCursor;
    422             re = parsePropertyExpression();
     411            throw ParseFailure("Literal grapheme cluster expressions not yet supported.");
    423412            if (*mCursor != '}') {
    424413                throw ParseFailure("Malformed grapheme-boundary property expression");
    425414            }
    426415            ++mCursor;
    427             re = makeGraphemeBoundary(re, GraphemeBoundary::Type::ClusterBoundary);
    428416            return complemented ? makeComplement(re) : re;
    429417        case 'P':
     
    442430        case 'X':
    443431            // \X is equivalent to ".+?\b{g}"; proceed the minimal number of characters (but at least one)
    444             // to get to the next extended grapheme cluster boundary. Nullable transforms this to ".\b{g}".
    445             ++mCursor;
    446             return makeGraphemeBoundary(makeAny(), GraphemeBoundary::Type::ClusterBoundary);
     432            // to get to the next extended grapheme cluster boundary.
     433            ++mCursor;
     434            return makeSeq({makeRep(makeAny(),1,Rep::UNBOUNDED_REP), makeGraphemeClusterBoundary()});
    447435        case 'N':
    448436            if (*++mCursor != '{') {
     
    978966}
    979967
     968           
     969                       
     970                           
    980971RE * RE_Parser::makeWordBoundary() {
    981972    Name * wordC = makeWordSet();
Note: See TracChangeset for help on using the changeset viewer.