Ignore:
Timestamp:
Nov 7, 2016, 3:54:09 PM (3 years ago)
Author:
xwa163
Message:
  1. Extend Regex Syntax, include: (a) RL2.6 of UTS#18, support regex in property value. e.g. \p{script=/.*hir.*/} (b) Support syntax of property expression when parsing boundary. e.g. \b{greek} (c) Extend property expression in non capture group. e.g. (?\p{upper}:\p{greek}\p{script=hira})
  2. Add related test cases
File:
1 edited

Legend:

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

    r5181 r5206  
    3333    }
    3434
    35     RE * RE_Parser_BRE::parse_alt() {
     35    RE * RE_Parser_BRE::parse_alt_with_intersect(RE *reToBeIntersected) {
    3636        std::vector<RE *> alt;
    3737        for (;;) {
    38             alt.push_back(parse_seq());
     38            alt.push_back(parse_seq_with_intersect(reToBeIntersected));
    3939
    4040            if (!isEscapedCharAhead('|')) {
     
    188188    }
    189189
    190     inline bool RE_Parser_BRE::isCharAhead(char c) {
    191         if (mCursor.remaining() < 2) {
    192             return false;
    193         }
    194         auto nextCursor = mCursor.pos() + 1;
    195         return *nextCursor == c;
    196     }
    197 
    198190    inline std::pair<int, int> RE_Parser_BRE::parse_range_bound() {
    199191        int lower_bound = 0, upper_bound = 0;
     
    297289        }
    298290        if (*mCursor == '=') {
     291            // We have a property-name = value expression
    299292            const auto prop_end = mCursor.pos();
    300293            mCursor++;
    301             const auto val_start = mCursor.pos();
    302             while (mCursor.more()) {
    303                 if (isEscapedCharAhead('}') || *mCursor == ':') {
    304                     break;
    305                 }
    306                 ++mCursor;
    307             }
    308             // We have a property-name = value expression
    309             return createName(canonicalize(start, prop_end), canonicalize(val_start, mCursor.pos()));
     294            auto val_start = mCursor.pos();
     295            if (*val_start != '\\' || !isCharAhead('/')) {
     296                // property-value is normal string
     297                while (mCursor.more()) {
     298                    if (isEscapedCharAhead('}') || *mCursor == ':') {
     299                        break;
     300                    }
     301                    ++mCursor;
     302                }
     303                return createName(canonicalize(start, prop_end), canonicalize(val_start, mCursor.pos()));
     304            } else {
     305                // property-value is another regex
     306                ++mCursor;
     307                auto previous = val_start;
     308                auto current = (++mCursor).pos();
     309                val_start = current;
     310
     311                while (true) {
     312                    if (*current == '/' && *previous == '\\') {
     313                        break;
     314                    }
     315
     316                    if (!mCursor.more()) {
     317                        ParseFailure("Malformed property expression");
     318                    }
     319
     320                    previous = current;
     321                    current = (++mCursor).pos();
     322                }
     323                ++mCursor;
     324                return parseRegexPropertyValue(canonicalize(start, prop_end), canonicalize(val_start, previous));
     325            }
    310326        }
    311327        return createName(canonicalize(start, mCursor.pos()));
Note: See TracChangeset for help on using the changeset viewer.