From 2988080c3277bddfa2a2c4ec7768e748e2d8c20b Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 14 May 2022 15:18:54 -0400 Subject: Added :tag --- bp.1 | 9 ++++++--- bp.1.md | 8 +++++--- match.c | 2 ++ pattern.c | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/bp.1 b/bp.1 index 2c53ca6..635f7fd 100644 --- a/bp.1 +++ b/bp.1 @@ -355,10 +355,13 @@ not contain the word \f[B]\[lq]IGNORE\[rq]\f[R]) \f[I]name\f[R]\f[B]:\f[R] \f[I]pat\f[R] Define \f[I]name\f[R] to mean \f[I]pat\f[R] (pattern definition) .TP +\f[B]:\f[R]\f[I]name\f[R] \f[I]pat\f[R] +Match \f[I]pat\f[R] and tag it with the given name as metadata. +.TP \f[I]name\f[R]\f[B]::\f[R] \f[I]pat\f[R] -Define \f[I]name\f[R] to be a special tagged pattern \f[I]pat\f[R]. -This is the same as a regular definition, except that a piece of -metadata is attached to it associating it with the specified name. +Syntactic sugar for \f[I]name\f[R]\f[B]::\f[R] \f[B]:\f[R]\f[I]name\f[R] +\f[I]pat\f[R] (define a pattern that also attaches a metadata tag of the +same name) .TP \f[B]#\f[R] \f[I]comment\f[R] A line comment diff --git a/bp.1.md b/bp.1.md index 9473d24..986f94a 100644 --- a/bp.1.md +++ b/bp.1.md @@ -291,10 +291,12 @@ contain the word **"IGNORE"**) *name*`:` *pat* : Define *name* to mean *pat* (pattern definition) +`:`*name* *pat* +: Match *pat* and tag it with the given name as metadata. + *name*`::` *pat* -: Define *name* to be a special tagged pattern *pat*. This is the same as a -regular definition, except that a piece of metadata is attached to it -associating it with the specified name. +: Syntactic sugar for *name*`::` `:`*name* *pat* (define a pattern that also +attaches a metadata tag of the same name) `#` *comment* : A line comment diff --git a/match.c b/match.c index a9f78ec..86ae2bd 100644 --- a/match.c +++ b/match.c @@ -539,6 +539,8 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat) return after ? new_match(pat, str, str, MATCHES(after)) : NULL; } case BP_CAPTURE: case BP_TAGGED: { + if (!pat->args.pat) + return new_match(pat, str, str, NULL); match_t *p = match(ctx, str, pat->args.pat); return p ? new_match(pat, str, p->end, MATCHES(p)) : NULL; } diff --git a/pattern.c b/pattern.c index edd007d..c9eefb2 100644 --- a/pattern.c +++ b/pattern.c @@ -513,6 +513,22 @@ 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); + + 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; -- cgit v1.2.3