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" )