diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-05-22 20:03:13 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-05-22 20:03:13 -0700 |
commit | 42afde14b0e59de2e0f938806323dad9e2e5ed06 (patch) | |
tree | 3d00929c93994345382cc10dae674704cd5ef11a | |
parent | a580c45de5a825165f46d95206d9ac3c2c52fcd6 (diff) | |
download | txr-42afde14b0e59de2e0f938806323dad9e2e5ed06.tar.gz txr-42afde14b0e59de2e0f938806323dad9e2e5ed06.tar.bz2 txr-42afde14b0e59de2e0f938806323dad9e2e5ed06.zip |
txr: support variable in postive match.
In the @{var mod} syntax in the pattern language, allow mod to
be a variable which contains a regex or integer, not just an
integer or regex literal.
* match.c (h_var): Check for modifier being a variable, and
resolve it.
* parser.y (modifiers): Allow a SYMTOK phrase.
* txr.1: Documented.
-rw-r--r-- | match.c | 5 | ||||
-rw-r--r-- | parser.y | 1 | ||||
-rw-r--r-- | txr.1 | 21 |
3 files changed, 27 insertions, 0 deletions
@@ -596,6 +596,11 @@ static val h_var(match_line_ctx *c) sym, nao); } + if (bindable(modifier)) { + val mpair = tx_lookup_var_ubc(modifier, c->bindings, elem); + modifier = cdr(mpair); + } + if (pair) { /* If the variable already has a binding, we replace it with its value, and treat it as a string match. @@ -788,6 +788,7 @@ modifiers : NUMBER { $$ = cons($1, nil); } rlc($$, $1); } | compound { $$ = rlc(cons(expand_meta($1, nil), nil), $1); } + | SYMTOK { $$ = cons(symhlpr($1, nil), nil); } ; o_var : SYMTOK { val expr = symhlpr($1, nil); @@ -2179,6 +2179,7 @@ enclosed with the variable in braces: .mets >> @{ bident <> / regex /} .mets >> @{ bident >> ( fun >> [args ...])} .mets >> @{ bident << number } +.mets >> @{ bident << bident } .cble These specify a variable binding that is driven by a positive match derived @@ -2227,6 +2228,26 @@ This syntax is processed without consideration of what other syntax follows. A positive match may be directly followed by an unbound variable. +The +.cblk +.mets >> @{ bident << bident } +.cble +syntax allows the +.meta number +or +.meta regex +modifier to come from a variable. The variable must be bound and contain +a non-negative integer or regular expression. +For example, +.code "@{x y}" +behaves like +.code "@{x 3}" +if +.code y +is bound to the integer 3. It is an error if +.code y +is unbound. + .coSS Special Symbols @ nil and @ t Just like in the Common Lisp language, the names |