From 206e1fa68fb921d0fd8c9d31ec59a9b7d0fc2a5d Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 30 Apr 2022 15:23:02 -0400 Subject: Added tagged definitions: `foo:: blah` --- pattern.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'pattern.c') diff --git a/pattern.c b/pattern.c index 78cf6e6..d0e364f 100644 --- a/pattern.c +++ b/pattern.c @@ -210,6 +210,7 @@ static pat_t *_bp_definition(const char *start, const char *end) const char *str = after_name(start, end); size_t namelen = (size_t)(str - start); if (!matchchar(&str, ':', false, end)) return NULL; + bool is_tagged = matchchar(&str, ':', false, end); pat_t *def = bp_pattern_nl(str, end, false); if (!def) parse_err(str, end, "Could not parse this definition."); str = def->end; @@ -217,6 +218,13 @@ static pat_t *_bp_definition(const char *start, const char *end) pat_t *ret = new_pat(BP_DEFINITIONS, start, str, 0, -1); ret->args.def.name = start; ret->args.def.namelen = namelen; + if (is_tagged) { // `id:: foo` means define a rule named `id` that gives captures an `id` tag + pat_t *capture = new_pat(BP_TAGGED, def->start, def->end, def->min_matchlen, def->max_matchlen); + capture->args.capture.capture_pat = def; + capture->args.capture.name = start; + capture->args.capture.namelen = namelen; + def = capture; + } ret->args.def.meaning = def; ret->args.def.next_def = _bp_definition(after_spaces(str, true, end), end); if (ret->args.def.next_def) @@ -679,7 +687,7 @@ void delete_pat(pat_t **at_pat, bool recursive) case BP_REPLACE: delete_pat(&pat->args.replace.pat, true); break; - case BP_CAPTURE: + case BP_CAPTURE: case BP_TAGGED: delete_pat(&pat->args.capture.capture_pat, true); break; case BP_NOT: case BP_AFTER: case BP_BEFORE: -- cgit v1.2.3