|
Персональные инструменты |
|||
|
SGML Declaration — различия между версиямиМатериал из CustisWiki
Текущая версия на 13:04, 27 марта 2009SGML декларация определяет самый нижний, лексический уровень SGML-документа:
СодержаниеПримерРассмотрим основные части SGML-декларации, на основе этого минимального примера. <!SGML "ISO 8879:1986" CHARSET BASESET "ISO 646-1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 9 UNUSED 9 2 9 11 2 UNUSED 13 1 13 14 18 UNUSED 32 95 32 127 1 UNUSED CAPACITY PUBLIC "ISO 8879-1986//CAPACITY Reference//EN" SCOPE DOCUMENT SYNTAX PUBLIC "ISO 8879-1986//SYNTAX Reference//EN" FEATURES MINIMIZE DATATAG NO OMITTAG NO RANK NO SHORTTAG NO LINK SIMPLE NO IMPLICIT NO EXPLICIT NO OTHER CONCUR NO SUBDOC NO FORMAL NO APPINFO NONE > Итак, сама SGML-декларация всегда кодируется в синтаксисе «Reference Concrete Syntax», т. е. состоит из набора ключевых слов, чисел и литералов, разделенных пробелами, символами табуляции и перевода строк и комментариями, которые начинаются и оканчиваются «--» (разделителем COM). Декларация начинается с заголовка содержащего литерал, указывающий версию стандарта. Правда сейчас версия стандарта всего одна (и маловероятно, что появится другая версия), поэтому, можно считать, что этот литерал должен всегда быть «ISO 8879:1986», что означает опубликованную в 1986, версию ISO стандарта № 8879. Далее рассмотрим остальные разделы. CHARSETОпределяет алфавит документов. Состоит из раздела «BASESET», определяющего базовый набор символов (алфавит), как правило это ASCII (т. е. ISO 646) и раздела «DESCSET» (described character set portion), определяющего правила отображения алфавита документа на базовый алфавит. DESCSET-правила просты, строчка «kk mm nn», означает, что диапазон символов с кодами в алфавите документа от kk до kk+mm-1 отображается на диапазон символов в базовом алфавите с кодами от nn до nn+mm-1. Третья колонка, кроме кода стартового символа в базовом алфавите, может содержать:
128 128 "High-order characters" CAPACITYОпределяет различные мощностные ограничения на свойства документа. Например, «ELEMCAP» ограничивает произведение числа различных SGML-элементов на свойство «NAMELEN» (см. #SYNTAX). Аналогичным образом, можно задать и другие ограничения: «ENTCAP», «ENTCHCAP», «ELEMCAP», «GRPCAP», «EXGRPCAP», «EXNMCAP», «ATTCAP», «ATTCHCAP», «AVGRPCAP», «NOTCAP», «NOTCHCAP», «IDCAP», «IDREFCAP», «MAPCAP», «LKSETCAP», «LKNMCAP». Можно использовать параметр «TOTALCAP», для ограничения сверху всех вышеупомянутых параметров. Можно использовать «Reference Capacity Set» CAPACITY PUBLIC "ISO 8879-1986//CAPACITY Reference//EN" который установит все ограничения в 35000. А можно и вовсе отключить эти ограничения: CAPACITY NONE -- Capacities are not restricted in XML -- SCOPEОпределяет, к чему будет применяться «concrete syntax», определяемый в следующем разделе (#SYNTAX) Тут всего два варианта:
SYNTAXОпределяет «concrete syntax». Стандартные синтаксисыМожно воспользоваться четыремя стандартными синтаксисами, определенными в стандарте SGML:
SYNTAX PUBLIC "ISO 8879-1986//SYNTAX Reference//EN"
SYNTAX PUBLIC "ISO 8879- 1986//SYNTAX Core//EN"
SYNTAX PUBLIC "ISO 8879- 1986//SYNTAX Multicode Basic//EN"
SYNTAX PUBLIC "ISO 8879- 1986//SYNTAX Multicode Core//EN" Далее, стандартный синтаксис можно донастраивать, например, строка SWITCHES 47 92 приведет к переносу смысла символа с кодом 47 («/») на символ с кодом 92 («\»). При этом (если использовался стандартный синтаксис) разделитель «ETAGO» (закрывающий тэг элемента) станет «\>» вместо «/>», а разделитель «NET» сменится с «/» на «\». Заметим, что это не простая трансляция одних символьных кодов в другие — значения строковых литералов, например, при этом не изменятся. Также это не «обмен», т. е. чтобы «обменять смыслы» двух символов, нужно соответственно повторить эту директиву, или продолжить: SWITCHES 47 92 92 47 Cледующий пример, обменяет «стандартные» для всех SGML/XML разметок символы «<" и ">» на «{» и «}». SYNTAX PUBLIC "ISO 8879-1986//SYNTAX Multicode Basic//EN" SWITCHES 60 123 123 60 62 125 125 62 Variant Concrete SyntaxМожно декларировать конкретный синтаксис, определив его «с нуля». Для этого, рассмотрим определение самого «The Reference Concrete Syntax»: SYNTAX SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 255 BASESET "ISO 646-1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 128 0 FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9 NAMING LCNMSTRT "" UCNMSTRT "" LCNMCHAR "-." UCNMCHAR "-." NAMECASE GENERAL YES ENTITY NO DELIM GENERAL SGMLREF SHORTREF SGMLREF NAMES SGMLREF QUANTITY SGMLREF SHUNCHARISO 8879 требует избегать («Clause 4.297») «shunned» («опасных») символов, «поскольку некоторые системы могут ошибочно трактовать такие символы как управляющие». В этом разделе, перечисляются коды таких символов. Дополнительно, можно использовать ключевое слово «CONTROLS» в разделе «SHUNCHAR», что означает, что любой символ в алфавите документа, чей код является кодом управляющего символа, является «shunned» символом (в дополнении к перечисленным вручную). Так что раздел «SHUNCHAR» из предыдущего примера можно эквивалентно переписать в виде: SHUNCHAR 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 255 или SHUNCHAR CONTROLS 255 Отсутствие «shunned» символов декларируется как: SHUNCHAR NONE The Syntax-Reference Character SetАлфавит конкретного синтаксиса, определяется аналогично алфавиту документа, через директивы BASESET и DESCSET. Вот пример «the syntax-reference character set» полностью эквивалентного ISO 646: BASESET "ISO 646-1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 128 0 FUNCTIONВ этом разделе определяются функциональные символы, имеющие особую важность, при разборе SGML-документа. Обязательно определить «RE», «RS», «SPACE», причем именно в этом порядке, далее можно определять дополнительные именованные символы, например «TAB»: FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9 причем для «дополнительных» именованных символов можно указывать их роль:
BACKSL MSSCHAR 92
MSO MSOCHAR 96 MSI MSICHAR 36
`<foo></foo>$
Коды символов в этот раздел можно вводить как численно (кроме трех упомянутых обязательных символов), так и с помощью механизма именованных ссылок, например: &#SPACE; NAMINGЭтот раздел определяет символы, которые могут использоваться в именовании (элементов, сущностей и т. п.). Например, этот блок объявляет, что имена могут быть алфавитно-цифровыми, начинаясь с буквы или цифры «7», могут содержать «.» и «-», причем имена, кроме имен entity, чувствительны к регистру. NAMING LCNMSTRT "7" UCNMSTRT "7" LCNMCHAR "-." UCNMCHAR "-." NAMECASE GENERAL YES ENTITY NO Вообще, по умолчанию, имена являются алфавитно-цифровыми, начинающимися с буквы, но можно также начинать имена с символов встречающихся в литералах параметров «LCNMSTRT» и «UCNMSTRT», и использовать в именах символы из литералов «LCNMCHAR» и «UCNMCHAR». Парность параметров с префиксами «LC» и «UC» объясняется тем, что таким способом для «дополнительных разрешенных» символов определяется, кто из них «lower case», а кто «upper case» соответственно. DELIMЕсли требуется использовать стандартные SGML-разделители, то достаточно сделать следующее: DELIM GENERAL SGMLREF Таким образом, будут определены следующие стандартные разделители: AND "&" COM "--" CRO "&#" DSC "]" DSO "[" DTGC "]" DTGO "[" ERO "&" ETAGO "</" GRPC ")" GRPO "(" LIT " LITA "" MDC ">" MDO "<!" MINUS "-" MSC "]]" NET "/" OPT "?" OR "|" PERO "%" PIC ">" PIO "<?" PLUS "+" REFC ";" REP "*" RNI "#" SEQ "," STAGO "<" TAGC ">" VI "="
DELIM GENERAL SGMLREF GRPO "{" GRPC "}"
SHORTREF NONE А стандартный набор, включаемый строкой SHORTREF SGMLREF включает следующие определения: SHORTREF NONE "&#SPACE;" "&#TAB;" "&#RE;" "&#RS;" "&#RS;&#RE;" "&#RS;B" "B&#RE;" "B&#RE;" "BB" " "#" "%" "" "(" ")" "*" "," "-" ":" ";" "=" "@" "+" "[" "]" "^" "_" "{" "|" "}" "~" "--" Дополнительные shortrefы определяются следующим образом: SHORTREF SGMLREF "\" "---" NAMESСтандартный набор зарезервированых имен ANY ATTLIST CDATA CONREF CURRENT DEFAULT DOCTYPE ELEMENT EMPTY ENDTAG ENTITIES ENTITY FIXED ID IDLINK IDREF IDREFS IGNORE IMPLIED INCLUDE INITIAL LINK LINKTYPE MS NAME NAMES NDATA MNTOKEN NMTOKENS MD NOTATION NUMBER NUMBERS NUTOKEN NUTOKENS O PCDATA PI POSTLINK PUBLIC RCDATA REQUIRED RESTORE SDATA SHORTREF SIMPLE STARTTAG SUBDOC SYSTEM TEMP USELINK USEMAP включается следующей строчкой NAMES SGMLREF Можно переопределять зарезервированные имена (новые имена должны быть алфавитно-цифровые, возможно содержащие «.» или «-»): NAMES SGMLREF DOCTYPE DTD ELEMENT EL PCDATA TEXT В этом примере, SGML-документы будут начинаться с «<!DTD», а не «<!DOCTYPE», декларации элементов — c «<!EL», а не «<!ELEMENT», а символьные данные — с «#TEXT», вместо «#PCDATA». QUANTITYВ этом разделе, схожим с #CAPACITY задаются (или переопределяются) численные величины-ограничения, на длины имен и литералов. QUANTITY SGMLREF NAMELEN 32 LITLEN 2048 В отличие от раздела #CAPACITY, если используется формула "QUANTITY SGMLREF", не требуется переопределять ни одну количественную величину. Если NAMELEN сделать меньшим 8, то необходимо переопределить все зарезервированные имена, чтобы уложиться в это ограничение. FEATURESВ этом разделе, должны быть перечислены все дополнительные SGML-свойства, причем обязательно в указанном порядке: FEATURES MINIMIZE DATATAG NO OMITTAG NO RANK NO SHORTTAG NO LINK SIMPLE NO IMPLICIT NO EXPLICIT NO OTHER CONCUR NO SUBDOC NO FORMAL NO Эти свойства делятся на три группы:
Для разрешения свойств
нужно заменить «NO» на «YES».
нужно заменить «NO» на «YES» и число, означающее число одновременно разрешенных активных простых ссылок, активных явных ссылок, активных конкурирующих или вложенных документов соответственно. APPINFOИнформация из этого раздела не используется при разборе, но передается приложению, получающему результат работы SGML-парсера. Соответственно, команда может быть либо APPINFO NONE либо задается какой-либо литерал: APPINFO "xyz" Внимание! Эта статья была создана путем автоматического реплицирования из внутренней базы знаний компании Заказные Информ Системы. Любые правки этой статьи могут быть перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion». |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||