aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2022-05-14 15:18:54 -0400
committerBruce Hill <bruce@bruce-hill.com>2022-05-14 15:18:54 -0400
commit2988080c3277bddfa2a2c4ec7768e748e2d8c20b (patch)
tree53cf926f0a0ddeee977c9b443cf943e7f095f3db
parentd62fd1eb968cebe75acdbcc43ccd33b24d6f163d (diff)
Added :tag
-rw-r--r--bp.19
-rw-r--r--bp.1.md8
-rw-r--r--match.c2
-rw-r--r--pattern.c16
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;