[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