diff options
Diffstat (limited to 'pattern.c')
| -rw-r--r-- | pattern.c | 35 |
1 files changed, 18 insertions, 17 deletions
@@ -475,6 +475,24 @@ static pat_t *_bp_simplepattern(const char *str, const char *end, bool inside_st } // Capture case '@': { + if (matchchar(&str, ':', false, end)) { // Tagged capture @:Foo=pat + const char *name = str; + str = after_name(name, end); + if (str <= name) + parse_err(start, str, "There should be an identifier after this '@:'"); + size_t namelen = (size_t)(str - name); + pat_t *p = NULL; + if (matchchar(&str, '=', false, end)) { + p = bp_simplepattern(str, end); + if (p) str = p->end; + } + pat_t *tagged = new_pat(BP_TAGGED, start, str, p ? p->min_matchlen : 0, p ? p->max_matchlen : 0); + tagged->args.capture.capture_pat = p; + tagged->args.capture.name = name; + tagged->args.capture.namelen = namelen; + return tagged; + } + const char *name = NULL; size_t namelen = 0; const char *a = after_name(str, end); @@ -513,23 +531,6 @@ static pat_t *_bp_simplepattern(const char *str, const char *end, bool inside_st return new_pat(BP_END_OF_FILE, start, ++str, 0, 0); return new_pat(BP_END_OF_LINE, start, str, 0, 0); } - // Tagged pattern :Tag:pat... - case ':': { - const char *name = str; - str = after_name(name, end); - if (str == name) - parse_err(start, str, "There should be an identifier after this ':'"); - size_t namelen = (size_t)(str - name); - (void)matchchar(&str, ':', false, end); // Optional second colon for :Tag:foo instead of :Tag(foo) - - pat_t *p = bp_simplepattern(str, end); - if (p) str = p->end; - pat_t *tagged = new_pat(BP_TAGGED, start, str, p ? p->min_matchlen : 0, p ? p->max_matchlen : 0); - tagged->args.capture.capture_pat = p; - tagged->args.capture.name = start; - tagged->args.capture.namelen = namelen; - return tagged; - } default: { pat_t *def = _bp_definition(start, end); if (def) return def; |
