Changeset 4306 for icGREP


Ignore:
Timestamp:
Nov 17, 2014, 9:53:57 PM (5 years ago)
Author:
cameron
Message:

Modify repetition parsing for non-greedy and possessive qualifiers

Location:
icGREP/icgrep-devel
Files:
3 edited

Legend:

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

    r4305 r4306  
    379379<grepcase regexp="=[a-z]{7,}" datafile="bounded_charclass" grepcount="20"/>
    380380<grepcase regexp="=[a-z]{5,15};" datafile="bounded_charclass" grepcount="11"/>
    381 <grepcase regexp="[wxy]{2}{3}{2}" datafile="bounded_charclass" grepcount="3"/>
     381<grepcase regexp="(([wxy]{2}){3}){2}" datafile="bounded_charclass" grepcount="3"/>
    382382<grepcase regexp="=([a-z][c-z])*;" datafile="bounded_charclass" grepcount="12"/>
    383383<grepcase regexp="[\u0061-\u007A]{6}" datafile="bounded_charclass" grepcount="21"/>
  • icGREP/icgrep-devel/icgrep/re/re_parser.cpp

    r4305 r4306  
    118118
    119119RE * RE_Parser::extend_item(RE * re) {
     120    int lower_bound, upper_bound;
    120121    if (_cursor == _end) {
    121122        return re;
     
    123124    switch (*_cursor) {
    124125        case '*':
    125             ++_cursor; // skip past the '*'
    126             re = makeRep(re, 0, Rep::UNBOUNDED_REP);
     126            lower_bound = 0;
     127            upper_bound = Rep::UNBOUNDED_REP;
    127128            break;
    128129        case '?':
    129             ++_cursor; // skip past the '?'
    130             re = makeRep(re, 0, 1);
     130            lower_bound = 0;
     131            upper_bound = 1;
    131132            break;
    132133        case '+':
    133             ++_cursor; // skip past the '+'
    134             re = makeRep(re, 1, Rep::UNBOUNDED_REP);
     134            lower_bound = 1;
     135            upper_bound = Rep::UNBOUNDED_REP;
    135136            break;
    136137        case '{':
    137             re = parse_range_bound(re);
     138            parse_range_bound(lower_bound, upper_bound);
    138139            break;
    139140        default:
    140141            return re;
    141142    }
    142     // this only occurs if we encountered one of the non-default cases above.
    143     return extend_item(re);
    144 }
    145 
    146 inline RE * RE_Parser::parse_range_bound(RE * re) {
     143    ++_cursor;
     144    if (*_cursor == '?') {
     145        // Non-greedy qualifier
     146        ++_cursor;
     147        //return makeNonGreedyRep(re, lower_bound, upper_bound);
     148        // Greedy vs. non-greedy makes no difference for icgrep.
     149        return makeRep(re, lower_bound, upper_bound);
     150    }
     151    else if (*_cursor == '+') {
     152        // Possessive qualifier
     153        ++_cursor;
     154        //return makePossessiveRep(re, lower_bound, upper_bound);
     155        throw ParseFailure("Possessive repetition is not supported in icgrep 1.0");
     156    }
     157    else {
     158        // Normal repetition operator.
     159        return makeRep(re, lower_bound, upper_bound);
     160    }
     161}
     162
     163inline void RE_Parser::parse_range_bound(int & lower_bound, int & upper_bound) {
    147164    ++_cursor;
    148165    throw_incomplete_expression_error_if_end_of_stream();
    149166    RE * rep = nullptr;
    150     unsigned lower_bound;
    151167    if (*_cursor == ',') {
    152168        ++_cursor;
     
    158174    throw_incomplete_expression_error_if_end_of_stream();
    159175    if (*_cursor == '}') {
    160         rep = makeRep(re, lower_bound, lower_bound);
     176        upper_bound = lower_bound;
    161177    }
    162178    else if (*_cursor != ',') {
     
    167183        throw_incomplete_expression_error_if_end_of_stream();
    168184        if (*_cursor == '}') {
    169             rep = makeRep(re, lower_bound, Rep::UNBOUNDED_REP);
     185            upper_bound = Rep::UNBOUNDED_REP;
    170186        }
    171187        else {
    172             const unsigned upper_bound = parse_int();
     188            upper_bound = parse_int();
    173189            if (*_cursor != '}') {
    174190                throw BadUpperBound();
    175191            }
    176             rep = makeRep(re, lower_bound, upper_bound);
    177         }
    178     }
    179     ++_cursor;
    180     return rep;
     192        }
     193    }
    181194}
    182195
  • icGREP/icgrep-devel/icgrep/re/re_parser.h

    r4305 r4306  
    4040    RE * extend_item(RE * re);
    4141
    42     RE * parse_range_bound(RE * re);
     42    void parse_range_bound(int & lower_bound, int & upper_bound);
    4343
    4444    RE * parse_literal();
Note: See TracChangeset for help on using the changeset viewer.