From ef72683bf0d5980f82d85ee0b29392755adcf1ca Mon Sep 17 00:00:00 2001
From: Kaz Kylheku <kaz@kylheku.com>
Date: Fri, 15 Jan 2016 20:21:48 -0800
Subject: New :mandatory keyword in until/last clauses.

* match.c (mandatory_k): New keyword variable.
(h_coll, v_gather, v_collect): Implement :mandatory logic.
(syms_init): Initialize mandatory_k.

* parser.l (grammar): The UNTIL and LAST tokens must be
matched similarly to collect, without consuming the
closing parenthesis, allowing a list of items to be parsed
between the symbol and the closure, in the NESTED state.

* parser.y (gather_clause, collect_clause, elem,
repeat_parts_opt, rep_parts_opt): Adjust to new until/last
syntax. In the matching productions, the abstract syntax
changes to incorporate the options. In the output productions,
we throw an error if options are present.

* txr.1: Documented :mandatory for collect, coll and gather.
---
 txr.1 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 1 deletion(-)

(limited to 'txr.1')

diff --git a/txr.1 b/txr.1
index 30017711..9b1da3e3 100644
--- a/txr.1
+++ b/txr.1
@@ -4451,6 +4451,34 @@ clause has visibility to bindings established in the
 previous clauses in that same iteration, even though those bindings
 end up thrown away.
 
+For consistency, the
+.code :mandatory
+keyword is supported in the
+.cod3 until / last
+clause of
+.codn gather .
+The semantics of using
+.code :mandatory
+in this situation is tricky. In particular, if it is in effect, and the
+.code gather
+terminates successfully by collecting all required matches, it will
+trigger a failure. On the other hand, if the
+.code until
+or
+.code last
+clause activates before all required matches are gathered, a failure
+also occurs, whether or not the clause is
+.codn :mandatory .
+
+Meaningful use of
+.code :mandatory
+requires that the gather be open-ended; it must allow some (or all) variables
+not to be required. The presence of the option means that for the gather
+to succeed, all required variables must be gathered first, but then termination
+must be achieved via the
+.cod3 until / last
+clause before all gather clauses are satisfied.
+
 .coNP Keyword parameters in @ gather
 The
 .code gather
@@ -4998,6 +5026,39 @@ directive used in
 .code @(output)
 clauses; that is a different directive.
 
+.coNP Mandatory @ until and @ last
+
+The
+.cod3 until / last
+clause supports the option keyword
+.codn :mandatory ,
+exemplified by the following:
+
+.cblk
+  @(collect)
+  ...
+  @(last :mandatory)
+  ...
+  @(end)
+.cble
+
+This means that the collect
+.B must
+be terminated by a match for the
+.cod3 until / last
+clause, or else by an explicit
+.codn @(accept) .
+
+Specifically, the collect cannot terminate due to simply running out of data,
+or exceeding a limit on the number of matches that may be collected. In
+those situations, if an
+.code until
+or
+.code last
+clause is present with
+.codn :mandatory ,
+the collect is deemed to have failed.
+
 .dir coll
 
 The
@@ -5056,7 +5117,9 @@ and any bindings from that iteration are discarded.
 Like collect, coll also supports an
 .cod3 until / last
 clause, which propagates variable
-bindings and advances the position.
+bindings and advances the position. The
+.code :mandatory
+keyword is supported.
 
 .code coll
 clauses nest, and variables bound within a coll are available to clauses
-- 
cgit v1.2.3