Changeset 5752 for icGREP


Ignore:
Timestamp:
Dec 2, 2017, 1:30:48 PM (14 months ago)
Author:
cameron
Message:

Allow unescaped ) as a literal left paren when there are no pending groups

Location:
icGREP/icgrep-devel
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/QA/greptest.xml

    r5737 r5752  
    521521<grepcase regexp="[^]-]" datafile="special_characters" grepcount="14"/>
    522522<grepcase regexp="[.]" datafile="special_characters" grepcount="7"/>
     523<grepcase regexp=")" datafile="special_characters" grepcount="1"/>
    523524
    524525<grepcase regexp="^((([2][5][0-5]|([2][0-4]|[1][0-9]|[0-9])?[0-9])[.]){3})([2][5][0-5]|([2][0-4]|[1][0-9]|[0-9])?[0-9])$" datafile="ips" grepcount="60"/>
  • icGREP/icgrep-devel/icgrep/re/re_parser.cpp

    r5737 r5752  
    6161    parser->fByteMode = ByteMode;
    6262    parser->fModeFlagSet = initialFlags;
     63    parser->mGroupsOpen = 0;
    6364    parser->fNested = false;
    6465    parser->fGraphemeBoundaryPending = false;
     
    7576, fModeFlagSet(0)
    7677, fNested(false)
     78, mGroupsOpen(0)
    7779, fGraphemeBoundaryPending(false)
    7880, fSupportNonCaptureGroup(false)
     
    107109        ++mCursor; // advance past the alternation character '|'
    108110    }
    109     if (alt.empty()) {
    110         ParseFailure("No regular expression found!");
    111     }
    112111    return makeAlt(alt.begin(), alt.end());
    113112}
     
    115114RE * RE_Parser::parse_seq() {
    116115    std::vector<RE *> seq;
    117     if (!mCursor.more() || (*mCursor == '|') || (*mCursor == ')')) return makeSeq();
     116    if (!mCursor.more() || (*mCursor == '|') || ((mGroupsOpen > 0) && (*mCursor == ')'))) return makeSeq();
    118117    for (;;) {
    119118        RE * re = parse_next_item();
     
    155154                }
    156155                return makeEnd();
    157             case '|': case ')':
    158                 break;
     156            case '|':
     157                break;
     158            case ')':
     159                if (mGroupsOpen > 0) break;
     160                if (LEGACY_UNESCAPED_RBRAK_RBRACE_ALLOWED) {
     161                    return createCC(parse_literal_codepoint());
     162                }
     163                ParseFailure("Use  \\) for literal ).");
    159164            case '*': case '+': case '?': case '{':
    160165                ParseFailure("Need something to repeat before *, +, ? or {.");
     
    198203// after the (
    199204RE * RE_Parser::parse_group() {
    200     const ModeFlagSet modeFlagSet = fModeFlagSet;
     205    const ModeFlagSet savedModeFlagSet = fModeFlagSet;
     206    mGroupsOpen++;
    201207    RE * group_expr = nullptr;
    202208    if (*mCursor == '?' && fSupportNonCaptureGroup) {
     
    267273                    ++mCursor;
    268274                    group_expr = parse_alt();
    269                     fModeFlagSet = modeFlagSet;
     275                    fModeFlagSet = savedModeFlagSet;
    270276                    break;
    271277                } else {  // if *_cursor == ')'
     
    288294        ParseFailure("Closing parenthesis required.");
    289295    }
     296    mGroupsOpen--;
    290297    ++mCursor;
    291298    return group_expr;
     
    469476        case 'q':
    470477            if (*++mCursor != '{') {
    471                 ParseFailure("Malformed grapheme-boundary property expression");
     478                ParseFailure("Malformed grapheme cluster expression");
    472479            }
    473480            ++mCursor;
    474481            ParseFailure("Literal grapheme cluster expressions not yet supported.");
    475482            if (*mCursor != '}') {
    476                 ParseFailure("Malformed grapheme-boundary property expression");
     483                ParseFailure("Malformed grapheme cluster expression");
    477484            }
    478485            ++mCursor;
  • icGREP/icgrep-devel/icgrep/re/re_parser.h

    r5737 r5752  
    180180    ModeFlagSet                 fModeFlagSet;
    181181    bool                        fNested;
     182    unsigned                    mGroupsOpen;
    182183    bool                        fGraphemeBoundaryPending;
    183184    bool                        fSupportNonCaptureGroup;
Note: See TracChangeset for help on using the changeset viewer.