aboutsummaryrefslogtreecommitdiff
path: root/pattern.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2022-05-14 22:43:13 -0400
committerBruce Hill <bruce@bruce-hill.com>2022-05-14 22:43:13 -0400
commit23c64e386c7ea1d0054c37f945a6467dccdf2980 (patch)
treeda7b8d914f999f19188a1cda15d0cf43b5d8570a /pattern.c
parent5fd2f6b8c594c6cbc1313efbcc28b53c15ba85d5 (diff)
Changed how tags work, changed Lua API for handling match captures
Diffstat (limited to 'pattern.c')
-rw-r--r--pattern.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/pattern.c b/pattern.c
index 83f2b29..9620c5d 100644
--- a/pattern.c
+++ b/pattern.c
@@ -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;