Primero, un poco de historia: En XML existe la posibilidad de que una parte de un documento XML haga referencia a otra parte del documento (es decir, una referencia cruzada). A continuación se muestra un ejemplo. El elemento BookSigning hace referencia a un elemento Book:
<Library>
<BookCatalogue>
...
<Book isbn="0-440-34319-4">
<Title>Illusions</Title>
<Author>Richard Bach</Author>
</Book>
...
</BookCatalogue>
<BookSignings>
...
<BookSigning isbn\_ref="0-440-34319-4" />
...
</BookSignings>
</Library>
Eso es, isbn_ref
señala isbn
. El valor de isbn_ref
y isbn
partido.
Si no hay ninguna coincidencia isbn
entonces el isbn_ref
es colgando y el XML no es válido.
Quiero saber si las referencias cruzadas en XML pueden expresarse mediante una gramática libre de contexto (CFG). O bien, ¿el uso de referencias cruzadas hace que XML sea sensible al contexto?
Tratar con la sintaxis XML es demasiado complicado, así que me gustaría abstraer el problema a algo más manejable. Creo que las referencias cruzadas en XML son análogas a esto: Dejemos que x
representan cualquier elemento XML y a
representan un extremo de una referencia cruzada. Podríamos tener un documento XML sin referencias cruzadas, que corresponde a una secuencia de x's
:
xxxxxxxxxxxxx
Supongamos que el documento XML tiene una referencia cruzada, entonces tiene un a
y en algún otro lugar del documento debe haber exactamente otro a
. Así que entre los x's
debe haber cero a's
o exactamente dos a's
:
xxxxxxaxxxxxxaxxxx
Escribí una CFG para ese lenguaje:
S -> X | A
X -> xX | empty
A -> XaB | BaX
B -> XaX
Por lo tanto, si tengo una abstracción correcta de las referencias cruzadas en XML, entonces he demostrado que las referencias cruzadas en XML son libres de contexto. El problema es que no estoy convencido de que mi abstracción represente fielmente las referencias cruzadas en XML. ¿Tengo una abstracción correcta? ¿Las referencias cruzadas son libres de contexto?