Changeset 4796


Ignore:
Timestamp:
Sep 26, 2015, 1:25:30 PM (2 years ago)
Author:
cameron
Message:

Parsing of name property expressions

Location:
icGREP/icgrep-devel/icgrep/re
Files:
2 edited

Legend:

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

    r4673 r4796  
    3535    RE_Parser parser(regular_expression);
    3636    parser.fModeFlagSet = initialFlags;
     37    parser.fNested = false;
    3738    RE * re = parser.parse_RE();
    3839    if (re == nullptr) {
     
    4647    , _end(regular_expression.end())
    4748    , fModeFlagSet(0)
     49    , fNested(false)
    4850    {
    4951       
     
    7880RE * RE_Parser::parse_RE() {
    7981    RE * r = parse_alt();
    80     if (_cursor != _end) {
    81         throw ParseFailure("Unrecognized junk remaining at end of regexp");
    82     }
    8382    return r;
    8483}
     
    130129            case '*': case '+': case '?': case '{':
    131130                throw NothingToRepeat();
    132             case ']': case '}':
     131            case ']':
    133132                if (LEGACY_UNESCAPED_RBRAK_RBRACE_ALLOWED) {
    134133                    return build_CC(parse_utf8_codepoint());
    135134                }
    136                 else throw ParseFailure("Use  \\] or \\} for literal ] or }.");
     135                else throw ParseFailure("Use  \\] for literal ].");
     136            case '}':
     137                if (fNested) {
     138                    return nullptr;  //  a recursive invocation for a regexp in \N{...}
     139                }
     140                else if (LEGACY_UNESCAPED_RBRAK_RBRACE_ALLOWED) {
     141                    return build_CC(parse_utf8_codepoint());
     142                }
     143                else throw ParseFailure("Use \\} for literal }.");
    137144            case '[':
    138145                _cursor++;
     
    359366#define bit40(x) (1ULL << ((x) - 0x40))
    360367const uint64_t setEscapeCharacters = bit40('b') | bit40('p') | bit40('d') | bit40('w') | bit40('s') |
    361                                      bit40('B') | bit40('P') | bit40('D') | bit40('W') | bit40('S');
     368                                     bit40('B') | bit40('P') | bit40('D') | bit40('W') | bit40('S') | bit40('N');
    362369
    363370inline bool isSetEscapeChar(char c) {
     
    411418            ++_cursor;
    412419            return complemented ? makeComplement(s) : s;
     420        case 'N':
     421            ++_cursor;
     422            if (_cursor == _end || *_cursor != '{') throw ParseFailure("Malformed \\N expression");
     423            ++_cursor;
     424            s = parseNamePatternExpression();
     425            if (_cursor == _end || *_cursor != '}') throw ParseFailure("Malformed \\N expression");
     426            ++_cursor;
     427            return s;
    413428        default:
    414429            throw ParseFailure("Internal error");
     
    522537    return property;
    523538}
     539
     540CC * RE_Parser::parseNamePatternExpression(){
     541   
     542    re::ModeFlagSet outerFlags = fModeFlagSet;
     543    fModeFlagSet = 1;
     544   
     545    bool outerNested = fNested;
     546    fNested = true;
     547   
     548    RE * nameRE = parse_RE();
     549   
     550    // Reset outer parsing state.
     551    fModeFlagSet = outerFlags;
     552    fNested = outerNested;
     553
     554   
     555    // Embed the nameRE in ";.*$nameRE" to skip the codepoint field of Uname.txt
     556    RE * embedded = makeSeq({re::makeCC(0x3B), re::makeRep(re::makeAny(), 0, Rep::UNBOUNDED_REP), nameRE});
     557   
     558   
     559    throw ParseFailure("\\N{...} character name expression recognized but not yet supported.");
     560
     561   
     562}
     563
    524564
    525565CharsetOperatorKind RE_Parser::getCharsetOperator() {
     
    828868            ++_cursor;
    829869            return parse_hex_codepoint(8,8);  // ICU compatibility
    830         case 'N':
    831             ++_cursor;
    832             throw ParseFailure("\\N{...} character name syntax not yet supported.");
    833 
    834870        default:
    835871            // Escaped letters should be reserved for special functions.
  • icGREP/icgrep-devel/icgrep/re/re_parser.h

    r4673 r4796  
    7777
    7878    Name * parsePropertyExpression();
    79        
     79   
     80    CC * parseNamePatternExpression();
     81   
    8082    RE * makeComplement(RE * s);
    8183    RE * makeWordBoundary();
     
    117119    const cursor_t              _end;
    118120    ModeFlagSet                 fModeFlagSet;
     121    bool                        fNested;
    119122    NameMap                     mNameMap;
    120123};
Note: See TracChangeset for help on using the changeset viewer.