Somewhere in your DTD, you are missing some token such as a tag close
(">") an entity end (though if this is SGML, the missing semi colon is
really less important than it is in XML where it is required). Other
possible things missing are a tag open (the allowing something to run together.
Unfortunately, the line number where the error is located in the DTD is
often the last line in the DTD. The reason for this is the parser tries
to find the appropriate missing value and when the DTD ends without it,
the parser reports the error to the last line encountered (the end of the
So the best answer I can give you is to go through your DTD line by line.
If you can find a good ASCII text editor that supports regular expressions
you can make the search somewhat easier. For example, in Codewright (but
NOT Notepad++ for some reason), this string will find all element, entity
and comment declarations in your DTD.
Now as you search through, look for any elements, attlists, entities or
comments that are grouped with another. For example,
<attlist foo=" id=" id=" #required=">
is missing the MDC for the element, the above search would match only by
going to the MDC for the ATTLIST. So if the highlighted search as both
the ELEMENT and ATTLIST then you have found your problem.
You can expand this for ENTITIES as well.
Will find all the general ENTITIES and
all the parameter ENTITIES.
Other errors are going to be a bit more difficult to find.
P.S. For Notepad users, the test DTD I used failed with the
because it cannot find the new line (\n) value for some reason. I tried
it with the \r and got the same result, but it did find tabs \t, so at
least some portion of the special characters work. Notepad++ also failed
when it encountered a case like this.
It found the "%text ("%alert;" but did not find any of the other entities
in the declaration. But I am still learning Notepad++ and use Codewright
for my ASCII editor 99% of the time.