Нехай Σ - не порожній, кінцевий набір символів, який називається алфавітом . Тоді Σ * - лічильний нескінченний набір кінцевих слів, який може бути утворений шляхом об'єднання нуля або більше символів з Σ. Будь-яка чітко визначена підмножина L ⊆ Σ * - це мова .
Давайте застосуємо це до XML. Його алфавітом є набір символів Unicode U , який не порожній і кінцевий. Не кожна конкатенація нуля або більше символів Unicode - це добре сформований 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, якщо це те, що ви хочете.