Пусть Σ - непустое конечное множество символов, называемое алфавитом . Тогда Σ * - счетное бесконечное множество конечных слов, которое может быть образовано путем конкатенации нуля или более символов из Σ. Любое четко определенное подмножество L ⊆ Σ * является языком .
Давайте применим это к XML. Его алфавит - это набор символов Unicode U , который не является пустым и конечным. Не каждая конкатенация из нуля или более символов Юникода является правильно сформированным XML-документом, например, строкой
<tag> soup &; not <//good>
явно нет. Подмножество XML ⊂ U *, которое формирует правильно сформированные XML- документы, разрешимо (или «рекурсивно»). Существует машина (алгоритм или компьютерная программа), которая принимает в качестве входных данных любое слово w ∈ U * и по истечении конечного промежутка времени выводит либо 1, если w ∈ XML, и 0 в противном случае. Такой алгоритм является подпрограммой любого программного обеспечения для обработки XML. Не все языки разрешимы. Например, набор допустимых программ на C, которые заканчиваются за конечное время, не является (это известно как проблема остановки). Когда кто-то разрабатывает новый язык, важно принять решение о том, должен ли он быть настолько мощным, насколько это возможно, или лучше ограничить выразительность в пользу решимости.
Некоторые языки могут быть определены с помощью грамматики, которая, как говорят, производит язык. Грамматика состоит из
- конечный набор литералов (также называемых терминальными символами ),
- непересекающийся конечный набор переменных грамматики (также называемый нетерминальными символами),
- выделенный начальный символ , взятый из набора переменных и
- конечный набор правил (так называемых постановок ), которые допускают определенные виды замен.
Любое слово, которое состоит исключительно из литералов и может быть получено, начиная с начального символа и затем применяя данные правила, относится к языку, созданному грамматикой.
Например, следующая грамматика (в довольно неформальной нотации) позволяет вывести именно целые числа в десятичной нотации.
- Литералы грамматики являются цифры
1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, и 0
.
- Переменные являются символами S и D .
- S является начальным символом.
- Любое вхождение переменной S может быть заменено
- с буквальным
0
или
- любой из других литералов , чем с
0
последующей переменной D .
- Любое вхождение переменной D может быть заменено
- любым из литералов, за которыми следует другой экземпляр переменной D или
- по пустой строке.
Вот как мы получаем 42
:
S - (применить правило 4, 2- й вариант) → 4
D - (применить правило 5, 1- й вариант) → 42
D - (применить правило 5, 2- й вариант) → 42
.
В зависимости от того, насколько сложные правила вы допускаете в своей грамматике, требуются различные сложные машины, чтобы доказать, что данное слово действительно может быть создано грамматикой. Приведенный выше пример представляет собой обычную грамматику, которая является самой простой и наименее мощной. Следующий мощный класс грамматик называется контекстно-свободным . Эти грамматики также очень просто проверить. XML (если я не пропускаю какую-то непонятную функцию, о которой я не знаю) может быть описан с помощью контекстно-свободной грамматики. Классификация грамматик образует Хомскую иерархию грамматик (и, следовательно, языков). Каждый язык, который может быть описан грамматикой, по крайней мере, полуразрешим(или «рекурсивно перечислимый»). То есть существует машина, которая, учитывая слово, которое на самом деле принадлежит языку, получает доказательство того, что оно может быть создано грамматикой в течение конечного времени, и никогда не выдаст неверного доказательства. Такая машина называется верификатором . Обратите внимание, что машина может никогда не остановиться, если ей дается слово, которое на самом деле не принадлежит языку. Ясно, что мы хотим, чтобы наши языки программирования описывались менее мощными грамматиками, чтобы иметь возможность отклонять недопустимые программы в течение ограниченного времени.
Схемы - это дополнение к XML, позволяющее уточнить набор правильно оформленных документов. Правильно оформленный документ, который следует определенной схеме, называется действительным в соответствии с этой схемой. Например, строка
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
является правильно сформированным документом XML, но не является действительным документом XHTML. Существуют схемы для XHTML , SVG , XSLT и чего-либо еще. Проверка схемы также может быть выполнена с помощью алгоритма, который гарантированно останавливается после конечного количества шагов для каждого входа. Такая программа называется валидатором или валидирующим парсером. Схемы определяются так называемыми языками определения скем , которые являются способом формального определения грамматик. XSD является официальным языком определения схемы для XML и сам по себе основан на XML. RELAX NG - более элегантная, намного более простая и немного менее мощная альтернатива XSD.
Поскольку вы можете определять свои собственные схемы, XML называется расширяемым языком, который является источником «X» в «XML».
Вы можете определить набор правил, который дает XML-документам интерпретацию как описания компьютерных программ. XSLT, упомянутый ранее, является примером такого языка программирования, построенного на XML. В более общем смысле вы можете сериализовать абстрактное синтаксическое дерево практически любого языка программирования совершенно естественным образом в XML, если это то, что вам нужно.