[A68-RECUTILS][COMMITTED] Detect descriptors in records sets while parsing

Jose E. Marchesi jemarch@gnu.org
Wed Apr 9 20:37:24 GMT 2025


---
 src/rec-mset.a68   |  6 ++++++
 src/rec-parser.a68 | 10 +++++++---
 src/rec-record.a68 | 20 +++-----------------
 src/rec-rset.a68   | 19 +++++++++++++++----
 4 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/src/rec-mset.a68 b/src/rec-mset.a68
index 8f3e090..37ead6b 100644
--- a/src/rec-mset.a68
+++ b/src/rec-mset.a68
@@ -27,6 +27,12 @@ MODE REC_MSET = STRUCT (REF REC_MSET_ELM head, tail,
 
 REF REC_MSET_ELM rec no mset elm = NIL;
 
+# Each element stored in a record set is characterized by its
+  position, which is an integer. The position of the first element is
+  one.  #
+
+INT rec mset no pos = 0;
+
 # Create a new, empty mset.  #
 
 PROC rec mset new = (PROC(REC_MSET_DATA)BOOL gate) REC_MSET:
diff --git a/src/rec-parser.a68 b/src/rec-parser.a68
index 0bcf803..1bb11b6 100644
--- a/src/rec-parser.a68
+++ b/src/rec-parser.a68
@@ -216,6 +216,7 @@ PROC rec parse rset = (REF REC_PARSER parser,
                        REF REF REC_RSET rset) BOOL:
 BEGIN BOOL res := TRUE;
       REF REC_RSET new rset := rec rset new;
+      INT num records := 0, elem pos := 0;
 
       # Parse comments and records, appending the in the mset of the
         record descriptor. #
@@ -232,6 +233,7 @@ BEGIN BOOL res := TRUE;
               THEN puts (error OF parser); res := FALSE;
                    error
               FI;
+              elem pos +:= 1;
               rec mset append (mset OF new rset, comment)
          ELSE # Try a record.  #
               REF REC_RECORD record;
@@ -240,17 +242,19 @@ BEGIN BOOL res := TRUE;
               THEN res := FALSE;
                    error
               FI;
+              elem pos +:= 1;
+              num records +:= 1;
               rec mset append (mset OF new rset, record);
               # This may be the record's descriptor.  #
-              IF descriptor OF new rset :=: rec no record
-              THEN descriptor OF new rset := record FI
+              IF rec record is descriptor (record)
+              THEN descriptor pos OF new rset := elem pos FI
          FI;
       next: ~
       OD;
 done:
       # The rset shall feature at least one record, which
         would be the record descriptor.  #
-      IF descriptor OF new rset :=: rec no record
+      IF num records = 0
       THEN error OF parser := "expected record";
            res := FALSE;
            error
diff --git a/src/rec-record.a68 b/src/rec-record.a68
index 880be4d..c32f0c0 100644
--- a/src/rec-record.a68
+++ b/src/rec-record.a68
@@ -117,24 +117,10 @@ done:
          COMMENT
 END;
 
-# Get the number of fields with the given name in the given record.  #
+# Determine whether a given record is a descriptor.  #
 
-PROC rec record get num fields by name = (REC_RECORD record,
-                                          STRING field name) INT:
-BEGIN SKIP
-COMMENT
-   INT num fields := 0;
-      REF REC_ELEM elem := elems OF record;
-
-      WHILE elem :/=: rec no elem
-      DO CASE data OF elem
-         IN (REC_FIELD fld): (name OF fld = field name | num fields +:= 1)
-         ESAC;
-         elem := next OF elem
-      OD;
-      num fields
-COMMENT
-END;
+PROC rec record is descriptor = (REC_RECORD record) BOOL:
+   rec record num fields by name (record, "%rec") > 0;
 
 # Determine the number of fields with the given name that exist in
   the given record.  #
diff --git a/src/rec-rset.a68 b/src/rec-rset.a68
index 53b81f7..0867b9c 100644
--- a/src/rec-rset.a68
+++ b/src/rec-rset.a68
@@ -17,20 +17,31 @@
   <http://www.gnu.org/licenses/>.
 #
 
-# String table for the contained field names.
-  A reference to the string table is installed in the REC_FIELD.
+# The REC_RSET structure holds the data associated with some record
+  set.
+
+  "mset" is an ordered multi-set of comments and records.  It may
+  contain at least one record.
+
+  "min size" and "max size" are size constraints installed in the
+  record set.
+
+  "descriptor pos" refers to the position in the mset where the
+  descriptor of the record set, which is a record, can be found.  If
+  the record set doesn't have a record descriptor then this is "rec
+  mset no pos".
 #
 
 MODE REC_RSET = STRUCT (REC_MSET mset,
                         INT min size, max size,
-                        REF REC_RECORD descriptor);
+                        INT descriptor pos);
 
 # Nihils.  #
 
 REF REC_RSET rec no rset = NIL;
 
 PROC rec rset new = REF REC_RSET:
-   HEAP REC_RSET := (rec mset new (rec rset gate), 0, 0, NIL);
+   HEAP REC_RSET := (rec mset new (rec rset gate), 0, 0, rec mset no pos);
 
 # Determine whether the given data item can be inserted in the mset of
   a record set.  #
-- 
2.30.2



More information about the Algol68 mailing list