Seja um conjunto finito não vazio de símbolos, chamado alfabeto . Então Σ * é o conjunto infinito contável de palavras finitas que podem ser formadas concatenando zero ou mais símbolos de Σ. Qualquer subconjunto bem definido L ⊆ Σ * é um idioma .
Vamos aplicar isso ao XML. Seu alfabeto é o conjunto de caracteres Unicode U , que não é vazio e é finito. Nem toda concatenação de zero ou mais caracteres Unicode é um documento XML bem formado, por exemplo, a sequência
<tag> soup &; not <//good>
não é claramente. O subconjunto XML ⊂ U * que forma documentos XML bem formados é decidível (ou "recursivo"). Existe uma máquina (algoritmo ou programa de computador) que recebe como entrada qualquer palavra w ∈ U * e após um período finito de tempo, gera 1 se w ∈ XML e 0 caso contrário. Esse algoritmo é uma sub-rotina de qualquer software de processamento XML. Nem todos os idiomas são decidíveis. Por exemplo, o conjunto de programas C válidos que terminam em um período finito de tempo não é (isso é conhecido como o problema de interrupção) Quando se projeta um novo idioma, uma decisão importante a ser tomada é se deve ser o mais poderoso possível ou se a expressividade seria melhor restringida em favor da decidibilidade.
Alguns idiomas podem ser definidos por meio de uma gramática que se diz produzir o idioma. Uma gramática consiste em
- um conjunto finito de literais (também chamados de símbolos terminais ),
- um conjunto finito separado de variáveis da gramática (também chamado de símbolos não terminais ),
- um símbolo inicial distinto , retirado do conjunto de variáveis e
- um conjunto finito de regras (chamadas produções ) que permitem certos tipos de substituições.
Qualquer palavra que consiste exclusivamente em literais e pode ser derivada começando com o símbolo inicial e aplicando as regras especificadas pertence ao idioma produzido pela gramática.
Por exemplo, a seguinte gramática (em notação bastante informal) permite derivar exatamente os números inteiros em notação decimal.
- Os literais da gramática são os dígitos
1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, e 0
.
- As variáveis são os símbolos S e D .
- S é o símbolo inicial.
- Qualquer ocorrência da variável S pode ser substituída
- com o literal
0
ou
- por qualquer dos outros literais que
0
seguido pela variável D .
- Qualquer ocorrência da variável D pode ser substituída
- por qualquer um dos literais seguido por outra instância da variável D ou
- pela string vazia.
Aqui está como derivamos 42
:
S - (aplicar regra 4, 2 nd variante) → 4
D - (aplicar regra 5, 1 r variante) → 42
D - (aplicar regra 5, 2 nd variante) → 42
.
Dependendo de como as regras elaboradas são permitidas em sua gramática, são necessárias máquinas sofisticadas para provar que uma determinada palavra pode realmente ser produzida pela gramática. O exemplo dado acima é uma gramática regular , que é a mais simples e menos poderosa. A próxima classe poderosa de gramáticas é chamada sem contexto . Essas gramáticas também são muito simples de verificar. XML (a menos que eu esteja ignorando algum recurso obscuro do qual não conheço) pode ser descrito por uma gramática livre de contexto. A classificação das gramáticas forma a hierarquia de Chomsky das gramáticas (e, portanto, das línguas). Todo idioma que pode ser descrito por uma gramática é pelo menos semi-decidível(ou "recursivamente enumerável"). Ou seja, existe uma máquina que, dada uma palavra que realmente pertence ao idioma, obtém uma prova de que ela pode ser produzida pela gramática dentro de um tempo finito e nunca produz uma prova errada. Essa máquina é chamada de verificador . Observe que a máquina nunca pode parar quando recebe uma palavra que realmente não pertence ao idioma. Claramente, queremos que nossas linguagens de programação sejam descritas por gramáticas menos poderosas, para o benefício de poder rejeitar programas inválidos dentro de um tempo finito.
Esquemas são uma adição ao XML que permite refinar o conjunto de documentos bem formados. Um documento bem formado que segue um determinado esquema é chamado válido de acordo com esse esquema. Por exemplo, a sequência
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
é um documento XML bem formado, mas não é um documento XHTML válido. Existem esquemas para XHTML , SVG , XSLT e outros. A validação de esquema também pode ser feita por um algoritmo que é garantido para parar após uma quantidade finita de etapas para cada entrada. Esse programa é chamado de validador ou analisador de validação. Esquemas são definidos pelas chamadas linguagens de definição de scema , que são uma maneira de definir formalmente gramáticas. XSD é a linguagem oficial de definição de esquema para XML e é, ela própria, baseada em XML. O RELAX NG é uma alternativa mais elegante, muito mais simples e um pouco menos poderosa ao XSD.
Como você pode definir seus próprios esquemas, o XML é chamado de linguagem extensível , que é a origem do "X" em "XML".
Você pode definir um conjunto de regras que fornece aos documentos XML uma interpretação como descrições de programas de computador. O XSLT, mencionado anteriormente, é um exemplo dessa linguagem de programação criada com XML. Em geral, você pode serializar a árvore de sintaxe abstrata de quase qualquer linguagem de programação naturalmente para XML, se é isso que você deseja.