Sea Σ un conjunto finito no vacío de símbolos, llamado alfabeto . Entonces Σ * es el conjunto infinito contable de palabras finitas que se pueden formar concatenando cero o más símbolos de Σ. Cualquier subconjunto bien definido L ⊆ Σ * es un lenguaje .
Apliquemos esto a XML. Su alfabeto es el juego de caracteres Unicode U , que no está vacío y es finito. No cada concatenación de cero o más caracteres Unicode es un documento XML bien formado, por ejemplo, la cadena
<tag> soup &; not <//good>
Claramente no lo es. El subconjunto XML ⊂ U * que forma documentos XML bien formados es decidible (o "recursivo"). Existe una máquina (algoritmo o programa de computadora) que toma como entrada cualquier palabra w ∈ U * y después de una cantidad de tiempo finita, genera 1 si w ∈ XML y 0 en caso contrario. Tal algoritmo es una subrutina de cualquier software de procesamiento XML. No todos los idiomas son decidibles. Por ejemplo, el conjunto de programas C válidos que terminan en un tiempo finito no lo es (esto se conoce como el problema de detención) Cuando uno diseña un nuevo lenguaje, una decisión importante es si debe ser lo más poderoso posible o si la expresividad se restringiría mejor a favor de la capacidad de decisión.
Algunos idiomas se pueden definir por medio de una gramática que se dice que produce el idioma. Una gramática consiste en
- un conjunto finito de literales (también llamados símbolos terminales ),
- un conjunto finito disjunto de variables de la gramática (también llamados símbolos no terminales ),
- un símbolo de inicio distinguido , tomado del conjunto de variables y
- Un conjunto finito de reglas (llamadas producciones ) que permiten ciertos tipos de reemplazos.
Cualquier palabra que consista exclusivamente en literales y se pueda derivar comenzando con el símbolo de inicio y luego aplicando las reglas dadas pertenece al lenguaje producido por la gramática.
Por ejemplo, la siguiente gramática (en notación bastante informal) le permite derivar exactamente los enteros en notación decimal.
- Los literales de la gramática son los dígitos
1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, y 0
.
- Las variables son los símbolos S y D .
- S es el símbolo inicial.
- Cualquier ocurrencia de la variable S puede ser reemplazada
- con el literal
0
o
- por cualquiera de los literales distintos
0
seguido por la variable D .
- Cualquier ocurrencia de la variable D puede ser reemplazada
- por cualquiera de los literales seguidos por otra instancia de la variable D o
- por la cuerda vacía.
Así es como derivamos 42
:
S - (aplica la regla 4, segunda variante) → 4
D - (aplica la regla 5, primera variante) → 42
D - (aplica la regla 5, segunda variante) → 42
.
Dependiendo de cuán elaboradas sean las reglas que permita en su gramática, se requieren máquinas sofisticadas para demostrar que la gramática puede producir una palabra determinada. El ejemplo dado anteriormente es una gramática regular , que es la más simple y menos poderosa. La próxima clase poderosa de gramáticas se llama libre de contexto . Estas gramáticas también son muy simples de verificar. XML (a menos que esté pasando por alto alguna característica oscura que no conozco) puede describirse mediante una gramática libre de contexto. La clasificación de las gramáticas forma la jerarquía Chomsky de las gramáticas (y, por lo tanto, los idiomas). Cada lenguaje que puede ser descrito por una gramática es al menos semi-decidible(o "recursivamente enumerable"). Es decir, existe una máquina que, dada una palabra que realmente pertenece al lenguaje, obtiene una prueba de que puede ser producida por la gramática en un tiempo finito y nunca generará una prueba incorrecta. Tal máquina se llama un verificador . Tenga en cuenta que la máquina nunca puede detenerse cuando se le da una palabra que en realidad no pertenece al idioma. Claramente, queremos que nuestros lenguajes de programación sean descritos por gramáticas menos poderosas para el beneficio de poder rechazar programas inválidos dentro de un tiempo finito.
Los esquemas son una adición a XML que permiten refinar el conjunto de documentos bien formados. Un documento bien formado que sigue un cierto esquema se llama válido de acuerdo con ese esquema. Por ejemplo, la cadena
<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>
es un documento XML bien formado pero no es un documento XHTML válido. Existen esquemas para XHTML , SVG , XSLT y lo que no. La validación del esquema también puede realizarse mediante un algoritmo que se garantiza que se detiene después de una cantidad finita de pasos para cada entrada. Tal programa se llama un validador o un analizador de validación. Los esquemas se definen mediante los llamados lenguajes de definición de scema , que son una forma de definir formalmente las gramáticas. XSD es el lenguaje oficial de definición de esquemas para XML y, en sí mismo, está basado en XML. RELAX NG es una alternativa más elegante, mucho más simple y un poco menos potente al XSD.
Como puede definir sus propios esquemas, XML se denomina lenguaje extensible , que es el origen de la "X" en "XML".
Puede definir un conjunto de reglas que le dan a los documentos XML una interpretación como descripciones de programas de computadora. XSLT, mencionado anteriormente, es un ejemplo de dicho lenguaje de programación construido con XML. En términos más generales, puede serializar el árbol de sintaxis abstracta de casi cualquier lenguaje de programación de forma bastante natural en XML, si esto es lo que desea.