Разбор DTD: имя ссылки на объект параметра, включая ссылку на другой объект параметра - это правильно сформировано? - PullRequest
3 голосов
/ 24 ноября 2011

Я пишу анализатор DTD, и я немного не уверен, как расширить параметры сущностей.Например, допустим ли этот отрывок DTD?

<!ENTITY % xx '&#37;zz;'>
<!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
<!ENTITY % abcd '%xx;'>
<!ENTITY % ef 'c'>
<!ENTITY % gh '%ab%ef;d;'>
%gh;

Более конкретно, мне интересно знать, будет ли сущность gh расширяться правильно.На мой взгляд,% ef;должен сначала расшириться до 'c', а затем вновь сформированный эталонный PE% abcd;должен расшириться до% xx;и т. д.

Большинство анализаторов, которые я видел, идентифицируют% ab как ссылку на PE и дают сбой, поскольку этот PE не определен.Но я не нашел абсолютно никаких ссылок в стандарте, спрашивающем парсер, чтобы он работал таким образом.Единственная ссылка, которую я нашел, была Включена в литерал в отличие от Включена как PE , где говорится, что заменяющий текст должен быть увеличен на одну начальную и одну после 0x20 - но не в литерале.

Есть указатели?Спасибо.

1 Ответ

2 голосов
/ 25 ноября 2011

Первые строки примера кода этого вопроса взяты из этого примера в рекомендации W3C XML, поэтому те, кто не знаком с довольно запутанной логикой побегов DTD, должны увидеть объяснение, чтотам написано.

Точнее, мне любопытно узнать, будет ли сущность gh расширяться правильно.

Нет, не будет.Причиной этого является то, что ваше определение для параметра сущности gh имеет неправильный синтаксис.Синтаксис для определения сущности параметра: ( ref )

PEDecl   ::=    '<!ENTITY' S '%' S Name S PEDef S? '>'
PEDef    ::=    EntityValue | ExternalID

, а синтаксис для значений сущности: ( ref )

EntityValue   ::=       '"' ([^%&"] | PEReference | Reference)* '"'
                        |  "'" ([^%&'] | PEReference | Reference)* "'"

«PEReference» - это ссылка на объект параметра (%Name;), а «Reference» - это либо ссылка на общий объект (&Name;), либо ссылка на символ (&#123; или &#x7B).( ref )

Здесь [^%&"] и [^%&'] означают, что значение объекта не может содержать символ %, если оно не обозначает начало производства имени (объекта-параметра).А поскольку % не является допустимым символом имени, но появляется перед символом окончания производства имени ;, последовательность символов %ab% вызовет ошибку.Я бы сказал, что это должно сработать, если первый знак % будет заменен ссылкой на символ, поэтому замена сущности %ef; выполняется до того, как %ab... будет рассматриваться как ссылка на имя сущности параметра.

...