<постановка_задачи>
В задачу лабораторной работы входит разработка на языке C++
анализатора текста, являющего фрагментом XML-документа.
Структура текста задается грамматикой в расширенной форме
Бэкуса-Наура (EBNF).
Программа-анализотор должна:
1) проверить синтаксис, с выдачей сообщений об ошибках
(с указанием строки и позиции);
2) преобразовать текст во внутренюю структуру данных - дерево.
Узлу дерева должны иметь тип и значение
Тип узла должен быть таким
enum TXmlDNodeType = {
XMLDNODE_ELEMENT, // элемент
XMLDNODE_ATTRIBUTE, // атрибут
XMLDNODE_TEXT, // текст
XMLDNODE_CDATA_SECTION, // секция CDATA
XMLDNODE_ENTITY_REFERENCE, // ссылка на сущность
XMLDNODE_ENTITY, // сущность
XMLDNODE_PROCESSING_INSTRUCTION,// инструкция обработки
XMLDNODE_COMMENT, // комментарий
XMLDNODE_DOCUMENT, // корневой элемент
XMLDNODE_DOCUMENT_TYPE, // тип документа
XMLDNODE_DOCUMENT_FRAGMENT, // фрагмент документа
XMLDNODE_NOTATION // нотация
};
Узлы типа 'тип документа','инструкция обработки', 'нотация', 'сущность'
являются структурными, остаьные 8 - содержательными

Корректность построения должна подтвержаться сообщениями функций
добавления узлов дерева и процедурой вывода дерева в текстовый
формат (в XML-документ).
Наименования функций желательно согласовать с моделью обработки
XML-документов DOM ([1] гл.15)
Классы для реализации программы разработать самостоятельно.
Это могут быть классы Анализатор, Документ, Узел, Атрибут и т.п.

Грамматика XML-докумета на EBNF:
document ::= prolog element Misc*
prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
Misc ::= Comment | PI | S
]]>
element - элемент; в документе все элементы вложены в один корневой элемент
XMLDecl - объявление XML-документа (1-я строка этого файла)
doctypedecl - объявление типа XML-документа (в файле нет)
PI - инструкция обработки (в файле нет)
Comment - комментарий (2-я строка файла)

Напоминание. Метасимволы EBNF:
? - символ (группа символов) может быть опущена
+ - повторение 1 или более раз
* - повторение 0 или более раз
[^xy] - любой символ кроме 'x' и 'y'
X - Y - множество X без Y

Символы , общие для всех грамматик в вариантах
Letter любая буква
Digit любая цифра
S ::= (#x20|#x9|#xD|#xA)+ пробельные символы
Char ::= #x9|#xD|#xA | #x20-#xFF любой символ
NameChar ::= Letter|Digit|'.'|'-'|'_'|':'
Name ::= (Letter|'_'|':') (NameChar)* XML-имя
Nmtoken ::= (NameChar)+


Символы меньше и амерсанд являются специальными в XML-документа,
поэтому они заменяются сущностими < и &

Первый вариант описывается полность, в остальных формулируется
задача и дается грамматика



<лаба вариант = "1">
<задача>
Реализовать:
анализатор начального тега элемента XML-документа с атрибутами.
Грамматика на EBNF:
STag ::= '<' Name (S Attribute)* S? '>'
Attribute ::= Name Eq AttValue
Eq ::= S? '=' S?
AttValue ::= '"'[^<&]*'"'
]]>

<указания>
<язык> C++
Полная грамматика [1] стр.369 или [2] стр.249-253
Тестом для программы может служить 3-я строка данного файла

Функции классов построения дерева
e1.hasAttributes() есть ли атрибуты?
la = e1.getAttributes() список атрибутов элемента e1
la.item(i).getNodeName() имя i-го атрибута
la.item(i).getNodeValuse() значение i-го атрибута



<литература>
1. Гарольд Э.,Минс С. XML.Справочник.-Пер.с англ.-СПб:Символ-Плюс.-576с.,ил.
2. И.Шапошников И.В. Справочник Web-мастера. XML.- СПб:БХВ-Петербург,2001
3.



<лаба вариант = "2">

анализатор XML-документов с упрощенной структурой.

Грамматика на EBNF:
document ::= element
element ::= STag content ETag
ETag ::= '<' Name '>'
ETag ::= ''
content ::= CharData? (element | CharData?)*
CharData ::= [^<&]
]]>


<лаба вариант = "3">

анализатор XML-документа, содержащего только
комментарии и инструкции обработки (с пустым корневым элементом)
Грамматика на EBNF:
document ::= prolog element Misc*
prolog ::= Misc*
Misc ::= Comment | PI | S
element ::= ''
Comment ::= '<--' ((Char - '-') | ('-'(Char - '-')))* '-->'
PI ::= '' Char*)))? '?>'
]]>

<лаба вариант = "4">

анализатор XML-документа, содержащего только секции данных
Грамматика на EBNF:
document ::= element
element ::= STag content ETag
ETag ::= '<' Name '>'
ETag ::= ''
content ::= CharData? (CDSect | CharData?)*
CharData ::= [^<&]* - ([^<&]*']]>' [^<&]*)
CDSect ::= CDStart CData CDEnd
CDStart ::='<'![CDATA['
CData ::= (Char* - (Char* ']]>' Char*))
CDEnd ::= ']]>'
]]>

<лаба вариант = "5">

анализатор XML-объявления

Грамматика на EBNF:
document ::= prolog element
prolog ::= XMLDecl?
element ::= ''
XMLDecl ::= ''
VersionInfo ::= S 'version' Eq ("'" VersionNum "'"|'"' VersionNum '"')
VersionNum ::= '1.0'
EncodingDecl ::= S 'encoding' Eq ("'" EncName "'"|'"' EncName '"')
SDDecl ::= S 'standalone' Eq (("'" yes "'"|"' "no "'")|('"' yes '"'|'"' no '"'))
EncName := [A-Za-z] ([A-Za-z0-9._] | '-')*
]]>

<лаба вариант = "6">

Анализатор объявления типа документа с фиксированным набором
элементов

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | PEReference | S)* ']' S?)? '>' ...
markupdecl ::= elementdecl
elementdecl ::= '' ...
contentspec ::= Mixed
Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
|'(' S? '#PCDATA' S? ')' ...
PEReference ::= '%' Name ';'

Например,

]>
]]>

<лаба вариант = "7">

Анализатор объявления типа документа с набором элементов,
которые могут быть пустыми или с любым содержимым

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | PEReference | S)* ']' S?)? '>' ...
markupdecl ::= elementdecl
elementdecl ::= '' ...
contentspec ::= 'EMPTY' | 'ANY'
PEReference ::= '%' Name ';'

Например,

]>
]]>


<лаба вариант = "8">

Анализатор объявления типа документа с фиксированными атрибутами
общего типа

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= AttlistDecl
AttlistDecl ::= ''
AttDef ::= S Name S AttType S DefaultDecl
AttType ::= StringType
StringType ::= 'CDATA'
DefaultDecl ::= '#REQUIRED'|'#IMPLIED' | (('#FIXED' S)? AttValue)
]]>

<лаба вариант = "9">

Анализатор объявления типа документа с фиксированными атрибутами,
значениями которых могут быть имена или списки имен

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''

doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= AttlistDecl
AttlistDecl ::= ''
AttDef ::= S Name S AttType S DefaultDecl
AttType ::= TokenizedType
TokenizedType ::= 'NMTOKEN'|'NMTOKENS'
DefaultDecl ::= '#REQUIRED'|'#IMPLIED' | (('#FIXED' S)? AttValue)
]]>

<лаба вариант = "9">

Анализатор объявления типа документа с фиксированными атрибутами,
со значениям типа перечисления

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= AttlistDecl
AttlistDecl ::= ''
AttDef ::= S Name S AttType S DefaultDecl
AttType ::= EnumeratedType
Enumeration ::= '(' S? Nmtoken (S? '|' Nmtoken)* S? ')' ...
DefaultDecl ::= '#REQUIRED'|'#IMPLIED' | (('#FIXED' S)? AttValue)
]]>

<лаба вариант = "10">

Анализатор объявления типа документа с фиксированными атрибутами,
со значениями XML-имен, ссылками на атрибуты или идентификаторами
элементов

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= AttlistDecl
AttlistDecl ::= ''
AttDef ::= S Name S AttType S DefaultDecl
AttType ::= TokenizedType
TokenizedType ::= 'ID'|'IDREF'|'IDREFS'
DefaultDecl ::= '#REQUIRED'|'#IMPLIED' | (('#FIXED' S)? AttValue)
]]>


<лаба вариант = "11">

Анализатор объявления типа документа с фиксированными атрибутами,
со значениями имен сущностей

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= AttlistDecl
AttlistDecl ::= ''
AttDef ::= S Name S AttType S DefaultDecl
AttType ::= TokenizedType
TokenizedType ::= 'ENTITY'|'ENTITIES'
DefaultDecl ::= '#REQUIRED'|'#IMPLIED' | (('#FIXED' S)? AttValue)
]]>

<лаба вариант = "12">

Анализатор объявления типа документа с атрибутами-нотациями

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= NotationDecl
NotationDecl::= ''
ExternalID ::= 'SYSTEM' S SystemLiteral |
'PUBLIC' S PubidLiteral S SystemLiteral
PublicID ::= 'PUBLIC' S PubidLiteral
SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")
PubidLiteral ::= '"' PubidChar* '"' |"'" (PubidChar - "'")* "'"
PubidChar ::= #x20| #xD | #xA | [a-zA-Z0-9] | [- '()+,./:=!*#@$_%]
]]>

<лаба вариант = "13">

Анализатор объявления типа документа с вложенными элементами

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::== ' ('[' (markupdecl | S)* ']' S?)? '>'
markupdecl ::= elementdecl
elementdecl ::= '' ...
contentspec ::= children

children ::= (choice|seq) ('?'|'*'|'+')?
choice ::= '(' S? cp (S? '|' S? cp)* S? ')'
seq ::= '(' S? c ( S? ',' S? cp )* S? ')'
cp ::= (Name | choice | seq) ('?' | '*' | '+')?
]]>

<лаба вариант = "14">

Анализатор объявления типа документа, с объявлением сущностей

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::= ' ('[' (markupdecl | S)* ']' S? )? '>' ...
markupdecl ::= EntityDecl

EntityDecl ::= GEDecl
GEDecl ::= ''
EntityDef ::= EntityValue
EntityValue ::= '"'([^<&"]| PEReference| Reference)* '"'|
"'"([^<&"]| PEReference| Reference)* "'"
PEReference ::= '%' Name ';'
Reference ::= EntityRef | CharRef
EntityRef ::= '&' Name ';'
CharRef ::= '&#'[0-9]+ ';'
]]>


<лаба вариант = "15">

Анализатор объявления типа документа, с объявлением внешниx
неанализируемых сущностей

Грамматика на EBNF:
document ::= prolog element
prolog ::= doctypedecl?
element ::= ''
doctypedecl ::= ' ('[' (markupdecl | S)* ']' S? )? '>' ...
markupdecl ::= EntityDecl

EntityDecl ::= GEDecl
GEDecl ::= ''
EntityDef ::= ExternalID NDataDecl?
ExternalID ::= 'SYSTEM' S SystemLiteral
NDataDecl ::= S 'NDATA' S Name
]]>








Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.