ISO 8879:1986 was amended in 1997 by ISO 8879 TC2 ("WebSGML"). The text of that technical corrigendum contains obvious errors, such as trailing commas in productions; below is a list of what I believe are all of the errors in the formal syntax (this does not include prose errors). Uncorrected text is copyright © 1997, International Organization for Standardization.
These changes are apparently being incorporated into a draft corrigendum.
[2] [3] [145.1] [196] [196.3] [196.4] [196.5] [198] [198.2]
The corrigendum says:
SGML subdocument entity =
(
s*,
SGML declaration )?,
prolog,
document instance set,
Ee
The text of the corrigendum obviously refers to production 3, which is called "SGML subdocument entity" in ISO 8879:1986; this is clearly just a typographical error in the production number:
SGML subdocument entity =
(
s*,
SGML declaration )?,
prolog,
document instance set,
Ee
data specification =
"DATA",
ps+,
notation name,
data attribute specification?,
The trailing comma is an obvious error. The presumedly correct production is:
data specification =
"DATA",
ps+,
notation name,
data attribute specification?
markup minimization features =
"MINIMIZE",
ps+,
"DATATAG",
ps+,
(
"NO" |
"YES" ),
ps+,
"OMITTAG",
ps+,
(
"NO" |
"YES" ),
ps+,
"RANK",
ps+,
(
"NO" |
"YES" ),
ps+,
(
"SHORTTAG",
ps+,
(
"NO" |
"YES" |
(
start-tag options,
end-tag options,
attribute options ) ) ),
(
ps+,
empty element ending rules,
ps+,
implicit definitions )?
There needs to be ps+,
in between start-tag options
, end-tag options
, and attribute options
. For
clarity and for parallelism with that between empty element ending rules
and
implicit definitions
,
I would put them in this production:
markup minimization features =
"MINIMIZE",
ps+,
"DATATAG",
ps+,
(
"NO" |
"YES" ),
ps+,
"OMITTAG",
ps+,
(
"NO" |
"YES" ),
ps+,
"RANK",
ps+,
(
"NO" |
"YES" ),
ps+,
(
"SHORTTAG",
ps+,
(
"NO" |
"YES" |
(
start-tag options,
ps+,
end-tag options,
ps+,
attribute options ) ) ),
(
ps+,
empty element ending rules,
ps+,
implicit definitions )?
attribute options =
"ATTRIB",
ps+,
"DEFAULT",
ps+,
(
"NO" |
"YES" ),
ps+,
"OMITNAME",
(
"NO" |
"YES" ),
ps+,
"VALUE",
ps+,
(
"NO" |
"YES" )
No space is permitted between OMITNAME
and the
following YES
or NO
. There is obviously a
missing ps+,
in between.
attribute options =
"ATTRIB",
ps+,
"DEFAULT",
ps+,
(
"NO" |
"YES" ),
ps+,
"OMITNAME",
ps+,
(
"NO" |
"YES" ),
ps+,
"VALUE",
ps+,
(
"NO" |
"YES" )
empty element ending rules =
"EMPTYNRM",
ps+,
(
"NO" |
"YES" ),
ps+,
The trailing comma is obviously an error. However, since production [196] provides ps
between empty element ending rules
and
implicit definitions
,
there is no need for the ending ps
nor for the preceding comma:
empty element ending rules =
"EMPTYNRM",
ps+,
(
"NO" |
"YES" )
implicit definitions =
"IMPLYDEF",
ps+,
"ATTLIST",
ps+,
(
"NO" |
"YES" ),
ps+,
"DOCTYPE",
ps+,
(
"NO" |
"YES" ),
"ELEMENT",
ps+,
(
"NO" |
"YES" ),
ps+,
"ENTITY",
ps+,
(
"NO" |
"YES" ),
ps+,
"NOTATION",
ps+,
(
"NO" |
"YES" ),
ps+,
Again, the trailing comma is obviously an error; and again, neither
the entire ps
construction nor the preceding comma is necessary. In addition, there
is no space between the YES
or NO
after
DOCTYPE
and the following ELEMENT
; a
ps
is necessary.
implicit definitions =
"IMPLYDEF",
ps+,
"ATTLIST",
ps+,
(
"NO" |
"YES" ),
ps+,
"DOCTYPE",
ps+,
(
"NO" |
"YES" ),
ps+,
"ELEMENT",
ps+,
(
"NO" |
"YES" ),
ps+,
"ENTITY",
ps+,
(
"NO" |
"YES" ),
ps+,
"NOTATION",
ps+,
(
"NO" |
"YES" )
other features =
"OTHER",
ps+,
"CONCUR",
ps+,
(
"NO" |
"YES" ),
ps+,
"SUBDOC",
ps+,
(
"NO" |
"YES" ),
ps+,
"FORMAL",
ps+,
(
"NO" |
"YES" ),
(
urn feature,
keeprsre feature,
validity feature,
entities feature )?
The text of this production in ISO 8879 TC 2 blew away
the number
parameter to
both CONCUR
and SUBDOC
. I believe this was
unintentional and the production should be:
other features =
"OTHER",
ps+,
"CONCUR",
ps+,
(
"NO" |
(
"YES",
ps+,
number ) ),
ps+,
"SUBDOC",
ps+,
(
"NO" |
(
"YES",
ps+,
number ) ),
ps+,
"FORMAL",
ps+,
(
"NO" |
"YES" ),
(
urn feature,
keeprsre feature,
validity feature,
entities feature )?
keeprsre feature =
ps+,
"KEEPRSRE",
ps+,
(
"YES" |
"NO" )
NO
is given first in every other YES
or
NO
production. For consistency, this one should match,
but Charles Goldfarb (the editor) has indicated that, since this is a
cosmetic change, it will wait until a revision of the Standard.
keeprsre feature =
ps+,
"KEEPRSRE",
ps+,
(
"NO" |
"YES" )