Está en la página 1de 11

5 SINTAXIS ............................................................................................................................................................................

5.1 ESTRUCTURA LÉXICA DE LOS LP ................................................................................................................................................. 2


5.2 GRAMÁTICAS LIBRE DE CONTEXTO Y BNF .................................................................................................................................... 3
5.2.1 Reglas BNF como ecuaciones ........................................................................................................................................ 4
5.3 ÁRBOLES DE ANÁLISIS SINTÁCTICO Y ÁRBOLES DE SINTAXIS ABSTRACTA............................................................................................... 4
5.4 AMBIGÜEDAD, ASOCIATIVIDAD Y PRECEDENCIA ............................................................................................................................. 5
5.5 EBNF Y DIAGRAMAS SINTÁCTICOS ............................................................................................................................................. 7
5.6 TÉCNICAS Y HERRAMIENTAS DE ANÁLISIS SINTÁCTICO ..................................................................................................................... 8
5.7 LÉXICO COMPARADO CON LA SINTAXIS Y CON LA SEMÁNTICA ......................................................................................................... 11
5 Sintaxis
 La sintaxis es la estructura de un lenguaje.
 Uno de los más grandes adelantos en los LP es el desarrollo de un sistema formal para describir la sintaxis.
 En los años 50 Noam Chomsky desarrolló la idea de gramáticas libres de contexto y John Backus, con contribuciones de
Peter Naur, desarrolló un sistema notacional para la descripción de gramáticas y se utilizó por primera vez para describir la
sintaxis de Algol60.
 Estas formas Backus Naur (BNF), se han utilizado de manera subsecuente en la definición de muchos LP (Java, Ada, …).
 Estas BNF se representan con variaciones menores textuales en tres formas básicas:
o BNF original.
o EBNF (BNF extendido).
o Diagramas sintácticos.

5.1 Estructura léxica de los LP


 La estructura léxica de un lenguaje de programación es la estructura de sus palabras o tokens.
 La estructura léxica puede estudiarse por separado de la estructura sintáctica, pero está relacionada íntimamente.
 La fase de análisis léxico de un traductor reúne en forma de tokens secuencias de caracteres del programa de entrada,
los cuales posteriormente se procesan mediante una fase de análisis sintáctico, lo que determina la estructura sintáctica.
 Los tokens se clasifican en varias clases:
o Palabras reservadas (reserved words) o palabras clave:

if, while

o Literales o constantes:

42 (lit. numérico) o "hello" (lit. de cadena)

o Símbolos especiales:

";" o "<=" o "+"

o Identificadores:

x24 o monthly_balance

 Se llaman palabras reservadas porque un identificador no puede tener la misma cadena de caracteres que una palabra
reservada.
 A veces existe confusión en un lenguaje entre las palabras reservadas y los identificadores predefinidos (aquellos a los
cuales se les ha dado una interpretación inicial para todos los programas en el lenguaje, pero pueden ser capaces de redefinición,
como pueden ser integer o boolean).
 En algunos lenguajes los identificadores tienen un tamaño máximo fijo, en tanto que en la mayoría de los lenguajes los
identificadores pueden tener una longitud arbitraria.
 Los identificadores de longitud variable pueden presentar problemas con las palabras reservadas, esto es, el identificador
doif puede verse como un simple identificador o como dos palabras reservadas do e if. Por ello, se utiliza el principio de la
subcadena de mayor longitud o principio de trozo máximo.
 Este principio es una regla estándar en la determinación de tokens, en cada punto se reúne en un solo token la cadena
más larga posible de caracteres, requiriendo que ciertos tokens vengan separados por delimitadores de tokens o
espacios en blanco.
 Esto significa que doif sería tratado como un único token y por tanto un identificador.
 El formato de un programa puede afectar la forma en la que se recogen los tokens:
o Formato fijo:
 Los tokens deben aparecer en localizaciones preespecificadas sobre la página (FORTRAN).

o Formato libre (la mayoría de lenguajes modernos):

2 Longinos Recuero Bustos (http://longinox.blogspot.com)


 Este formato no tiene efecto sobre la estructura de un programa, aparte de satisfacer el principio de la
subcadena de mayor longitud.
 Los tokens a menudo se describen en el idioma inglés, pero también pueden describirse formalmente mediante
expresiones regulares, que son descripciones de patrones de caracteres, descritos normalmente por tres operaciones
básicas:
o Concatenación:
 Poner en secuencia los elementos sin una operación explícita.
o Repetición:
 Se indica mediante el uso de un “*“ después del elemento a repetir.
 Indica cero o más repeticiones.
o Elección o selección:
 Se indica mediante el uso de una “|” entre los elementos de los cuales debe efectuarse una selección.
 Pueden incluirse paréntesis para permitir el agrupamiento de operaciones.

(a|b)*c

 A menudo, la notación de expresiones regulares se amplía mediante operaciones adicionales y caracteres especiales
como:
o [ - ]  Indican rango de caracteres.
o +  Indica una o más repeticiones.
o ?  Indica un elemento opcional, es decir, que la expresión a la que sigue, aparece como mucho una vez:

ob?curo  obscuro

 oscuro

o Los espacios no deben tenerse en cuenta.

[0-9]+(\.[0-9]+)?

5.2 Gramáticas libre de contexto y BNF


 Comenzamos con un ejemplo (una gramática para oraciones simples en inglés):

(1) oración  frase-sustantiva frase-verbal


(2) frase-sustantiva  artículo sustantivo
(3) artículo  a | the
(4) sustantivo  girl | dog
(5) frase-verbal  verbo frase-sustantiva
(6) verbo  sees | pets

 Una gramática libre de contexto consiste en un conjunto de reglas gramaticales, cada una de las cuales están formadas
de:
o Un lado izquierdo que es un solo nombre de estructura y a continuación el meta símbolo  (a veces se
reemplaza por “:=”).
o Un lado derecho formado por una secuencia de elementos que pueden ser símbolos u otros nombres de
estructuras.
 Las cursivas sirven para distinguir los nombres de las estructuras de las palabras reales, es decir, de los tokens que
pudieran aparecer en el lenguaje (sees).
 La barra vertical | es también un metasímbolo y significa “o”.
 Algunas veces un metasímbolo es un símbolo real en un lenguaje, en cuyo caso, es recomendable entrecomillar el
símbolo para distinguirlo del metasímbolo, o de lo contrario, el metasímbolo puede escribirse en un tipo de letra diferente.
 Algunas notaciones también se apoyan en metasímbolos (<, >), en cuyo caso también se reemplaza la flecha por el
metasímbolo (::=):

3 Longinos Recuero Bustos (http://longinox.blogspot.com)


<oración> ::= <frase-sustantiva> <frase-verbal>”.”

 Para indicar que una oración debe estar seguida por algún tipo de marcador final, se hace mediante el signo $:

entrada  oración $

 Los nombres de las estructuras se conocen como no terminales.


 A las palabras o símbolos de token se les denomina terminales.
 Las reglas gramaticales también son llamadas producciones.
 Las producciones se presentan en la forma de Backus-Naur si están dadas utilizando únicamente los metasímbolos “”
y “|” (y paréntesis algunas veces).
 Las reglas BNF son el conjunto de reglas utilizadas para expresar una gramática libre del contexto.
 Existe un no terminal denominado símbolo inicial. Este no terminal representa toda la estructura que se está definiendo y
es el símbolo a través del cual se inician todas las derivaciones.
 Una gramática libre de contexto define un lenguaje denominado lenguaje de la gramática.
 Este lenguaje es el conjunto de todas las cadenas de terminales para las cuales existe una derivación que empieza en el
símbolo inicial y acaba con la cadena de terminales.
 En general estos lenguajes son no finitos.
 En estas gramáticas no necesariamente suele haber tantas producciones como no terminales pero no siempre es así.
 Se dice que son libres del contexto porque los lados izquierdos de las reglas están compuestos por un solo no terminal.
 Esto significa que cada no terminal puede ser reemplazado por cualquier opción del lado derecho independientemente de
dónde pudiera aparecer el no terminal.
 Para darle sensibilidad de contexto habría que dar la posibilidad de que aparecieran cadenas de contexto en el lado
izquierdo.
 Se tomará como problema semántico y no sintáctico todo aquello que no pueda ser expresado con una gramática libre
de contexto.
 Cualquier frase válida de acuerdo con la gramática anterior puede construirse de la siguiente manera:
o Iniciamos con el símbolo oración (símbolo inicial) y seguimos reemplazando los lados izquierdos con los lados
derechos de las reglas anteriores. A este proceso se le denomina derivación.

5.2.1 Reglas BNF como ecuaciones


 Las reglas gramaticales se pueden expresar en forma de ecuaciones de conjunto.
 Ej.: Dada una regla gramatical como:

expr  expr + expr | número

Se puede expresar de la siguiente manera:

E=E+E N

 Las soluciones a ecuaciones recursivas aparecen frecuentemente en las descripciones formales en los lenguajes de
programación donde se conocen como puntos fijos mínimos.

5.3 Árboles de análisis sintáctico y árboles de sintaxis abstracta


 La sintaxis establece una estructura pero no un significado. Pero el significado de una oración ( o un programa) tiene que
estar relacionado con su sintaxis.
 El proceso de asignar la semántica de una construcción a su estructura sintáctica se conoce como semántica dirigida por
la sintaxis. Por lo que se deberá construir la sintaxis de manera que refleje lo mejor posible su semántica.
 Una forma de expresar la estructura sintáctica de un programa que determina su semántica es a través de lo que se
denomina árbol de análisis sintáctico o árbol de análisis gramatical.
 Este describe de manera gráfica el proceso de reemplazo dentro de una derivación.

4 Longinos Recuero Bustos (http://longinox.blogspot.com)


 Un árbol de análisis gramatical (sintáctico) está identificado mediante no terminales en los nodos interiores y por
terminales en las hojas y su estructura está totalmente determinado por las reglas gramaticales del lenguaje y por una
derivación de una secuencia particular de terminales.
 No todas las terminales y no terminales pudieran ser necesarios para determinar totalmente la estructura sintáctica de
una expresión o de una oración.
 En estos casos los árboles suelen estar condensados y se conocen como árboles de sintaxis abstracta o árboles
sintácticos puesto que abstraen la estructura esencial del árbol de análisis sintáctico, como puede observarse en el
siguiente ejemplo, para la expresión 3 + 4 * 5:

expresión  expresión + expresión | expresión * expresión | (expresión) | número


número  número dígito | dígito
dígito 0|1|2|3|4|5|6|7|8|9

Árbol de análisis sintáctico Árbol de sintaxis abstracta

Expresión +

Expresión + Expresión 3 *

Número Expresión * Expresión 4 5

Dígito Número Número

Dígito Dígito
3

4 5

 Para el programador los árboles de sintaxis abstractas no son importantes (algunas veces la sintaxis ordinaria se distingue de
la sintaxis abstracta por el nombre de sintaxis concreta).
 No ocurre así con los diseñadores del lenguaje y para los autores de traductores, ya que es la sintaxis abstracta y no la
concreta la que expresa la estructura esencial del lenguaje.

5.4 Ambigüedad, asociatividad y precedencia


 Dos derivaciones diferentes pueden conducir al mismo árbol de análisis sintáctico:

Número  número digito Número  número


Número => número digito
digito Núm
 número 4  número
=> número digito
digito
digito
digito
 número digito 4  digito
=> digito digito
digito
digito
digito
 número 3 4 => 2digito
2 digito
digito
digito
 digito 3 4 => 23 digito
2 3 digito
234 => 2 3 4 234 =>

 Sin embargo, diferentes derivaciones también pueden conducir a diferentes árboles de análisis gramaticales:

5 Longinos Recuero Bustos (http://longinox.blogspot.com)


exp exp

exp + exp exp * exp

3 exp * exp exp + exp 5

4 5 3 4
3+4*5 3+4*5

 Una gramática para la cual sean posibles dos árboles diferentes para un mismo análisis sintáctico se dice que es
ambigua.
 Ciertas derivaciones construidas en un orden especial corresponden al mismo árbol de análisis sintáctico.
 Una derivación que tienes esta propiedad es la derivación por la izquierda, que consiste en tomar como reemplazo el no
terminal restante más a la izquierda.
 Una forma de determinar si una gramática es ambigua es buscar dos derivaciones por la izquierda distintas de una
misma cadena.
 Una gramática para que sea útil no puede ser ambigua, por lo que si lo fuera habría que aplicarle alguna regla para
eliminar dicha ambigüedad.
 Para eliminar dicha ambigüedad se debe revisar la gramática o incluir nuevas reglas que eliminen la ambigüedad.
 La forma más habitual de revisar este tipo de gramáticas es escribiendo una nueva regla gramatical (llamada un
“término”) que establece una “cascada de precedencia”.
 Por ejemplo, la siguiente gramática es ambigua:

expresión  expresión + expresión | expresión * expresión | (expresión) | número


número  número dígito | dígito
dígito 0|1|2|3|4|5|6|7|8|9

 Las ambigüedades se producen en:


o expresión + expresión:
 8–4–2= 2
 8–4–2= 6
o expresión * expresión, visto en el ejemplo de 3 + 4 * 5.

 Para eliminar dicha ambigüedad modificamos la regla expresión por:


o expresión  expresión + término | término (recursiva por la izquierda) o,
o expresión  término + expresión | término (recursiva por la derecha)

Y definimos término como:


o término  término * término | (expresión) | número

 De esta forma eliminamos la ambigüedad de la gramática quedando finalmente como sigue:

expresión  expresión + término | término


término  término * factor | factor
factor  (expresión) | número
número  número dígito | dígito
dígito 0|1|2|3|4|5|6|7|8|9

 Algunas veces el proceso de volver a escribir una gramática para eliminar ambigüedad hace que sea extremadamente
compleja, y en estos casos preferimos enunciar una regla de no ambigüedad.
6 Longinos Recuero Bustos (http://longinox.blogspot.com)
5.5 EBNF y diagramas sintácticos
 EBNF (Backus-Naur extendida) surge para dotar al BNF de una notación especial para el tipo de reglas gramaticales que
expresan con mayor claridad la naturaleza repetitiva de su estructura:

expresión  expresión + término | término


 expresión + término + término
 expresión + término + término + término

 término + término + … + término

 En esta notación las llaves “{ }” representan “cero o más repeticiones de”:

número  dígito { dígito }

expr  término { + término }

 En este tipo de notación las llaves se han convertido en nuevos metasímbolos.


 Esta notación oculta su asociatividad por la izquierda la cual es generada por la recursividad por la izquierda.
 Las reglas recursivas por la derecha no se pueden representar mediante llaves por lo tanto, a través de EBNF no se
podrán representar directamente los árboles sintácticos o los árboles de análisis sintáctico, por lo cual, utilizaremos
siempre la notación BNF para escribir árboles de análisis sintáctico.
 Para indicar que una estructura tiene una parte opcional utilizaremos los corchetes “[ ]”.
 También los operadores asociativos por la derecha (binarios) pueden describirse utilizando estos nuevos metasímbolos:

expr  término @ expr | expr expr  término [ @ expr ]

donde @ es un operador asociativo por la derecha.


 Como ejemplo de uso, rescribiremos la gramática de ejemplo empleada en el apartado 4.4:

expresión  expresión { + término }


término  factor { * factor }
factor  (expresión) | número
número  número dígito | dígito
dígito 0|1|2|3|4|5|6|7|8|9

 Una representación gráfica a veces es útil para una regla gramatical es el diagrama sintáctico, el cual refleja la
secuencia de terminales y no terminales que se encuentran en el lado derecho de la regla.
 Estos diagramas:
o Utilizan círculos u óvalos para representar los terminales y rectángulos para representar los no terminales,
conectándolos entre sí mediante líneas y flechas con el fin de indicar la secuencia apropiada.
o Pueden condesar varias reglas gramaticales en un solo diagrama.
o Se escriben siempre partiendo de una notación EBNF, y nunca de una BNF.
o Son atractivos visualmente pero ocupan mucho espacio por lo que actualmente son poco utilizados a favor de
las notaciones EBNF y BNF.

7 Longinos Recuero Bustos (http://longinox.blogspot.com)


5.6 Técnicas y herramientas de análisis sintáctico
 Una gramática escrita en forma BNF, EBNF o diagrama sintáctico describe las cadenas de tokens que sintácticamente
son correctas en el lenguaje de programación. Por lo que de manera implícita quedan reflejadas las acciones que debe
realizar el analizador sintáctico para analizar de forma correcta una cadena de tokens.
 La forma más simple de un analizador sintáctico es un reconocedor, un programa que acepta o rechaza cadenas
dependiendo de si son o no aceptadas en el lenguaje.
 Según las distintas maneras en las que un analizador sintáctico interpreta una gramática en cualquiera de sus formas
tenemos distintos métodos de análisis:
o Analizadores sintácticos de abajo arriba:
 Intenta hacer coincidir una entrada con los lados derechos de las reglas gramaticales. Cuando se
encuentra con una coincidencia, el lado derecho es sustituido (reducido) por el no terminal de la
izquierda.
 Su denominación (abajo arriba) viene dada por el hecho de que construyen derivaciones y árboles
sintácticos de las hojas hacia la raíz (también llamados de desplazamiento-reducción).
o Analizadores sintácticos de arriba abajo:
 Los no terminales se expanden para coincidir con los tokens de entrada y construyen directamente una
derivación.

 El analizador de abajo arriba es más poderoso que el otro, por lo que es más utilizado generalmente por los
generadores de analizadores sintácticos (o compiladores de compiladores).
 Un generador ampliamente utilizado es el YACC o su versión libre Bison.
 Otro método más antiguo de general analizadores a partir de su gramática que resulta muy efectivo, es el análisis
sintáctico por descenso recursivo:

8 Longinos Recuero Bustos (http://longinox.blogspot.com)


o Básicamente opera convirtiendo los no terminales en procedimientos mutuamente recursivos, cuyas acciones
están basadas en los lados derechos de los BNF.
o En estos procedimientos los lados derechos se interpretan de la siguiente manera:
 Los tokens se hacen coincidir con los tokens de entrada según se van construyendo.
 Los no terminales se interpretan como llamadas a los procedimientos de los no terminales.
o Un ejemplo de análisis sintáctico por descenso recursivo es:

void oración( void ) void Frase-sustantiva( void ) void artículo( void )


{ { {
Frase-sustantiva(); artículo(); if( token == “a” ) coincidencia( “a” );
Frase-verbal(); sustantivo(); else if(token == “the”) coincidencia(“the”);
} } else error();
}

 Por otro lado, si tenemos una regla como:

expresión  expresión + término | término

se producen dos errores graves con el análisis por descenso recursivo:


o El primer error es para el procedimiento que representa a expresión + término, el cual produciría una llamada
recursiva antes de encontrar el signo +, por lo que entraría en un bucle infinito:

void Expresión( void )


{
Expresión() + Término();
}

o El segundo error es que no hay forma de determinar que opción tomar, si expresión + término o término, por lo
tato para seguir manteniendo la asociatividad por la izquierda y eliminar la recursividad, utilizamos la notación
EBNF en la que las llaves representan la eliminación de la recursión por la izquierda:

void Expresión( void )


{
Término();

expresión  término { + término } while( token == “+” )


{
Coincidencia( “+” );
Término();
}
}

 En el caso de la recursividad por la derecha no se presenta el problema señalado anteriormente para el análisis recursivo
descendente, sin embargo se da la situación de que el código para una regla de recursión por la derecha:

expr  término @ expr | término

se escribe en formato EBNF y se realiza una factorización por la izquierda:

9 Longinos Recuero Bustos (http://longinox.blogspot.com)


void Expresión( void )
{
Término();

expresión  término [ @ expr ] if( token == “@” )


{
Coincidencia( “@” );
Expresión();
}
}

 Por lo tanto en situaciones de recursión por la izquierda y en la factorización por la izquierda, las reglas EBNF o los
diagramas sintácticos corresponden con el código de un analizador sintáctico por descenso recursivo, siendo esta una de
las razones de amplia utilización.
 Un analizador sintáctico que basa su acción únicamente en el token disponible en el flujo de entrada, se conoce como
analizador sintáctico predictivo.
 Este uso de un solo token para dirigir la acción del analizador sintáctico se conoce con el nombre preanálisis de un
solo símbolo.
 Estos analizadores requieren que las gramáticas a analizar cumplan ciertas condiciones:
o La primera condición que requiere es la capacidad de escoger entre varias alternativas en una regla gramatical:

A | | |…|

Para decidir cual elegir, los tokens que inician cada tienen que ser distintos:

Primero( ) Primero( ) = para toda

donde Primero es la función que devuelve el conjunto de tokens que pueden presentarse al principio de cada .

o La segunda condición se presenta con las reglas gramaticales que contienen estructuras opcionales:

expr  término [ @ expr ]

Si @ se presenta como token en la entrada, pudiera ser el comienzo de una parte opcional, o pudiera ser un
token que aparece después de la expresión completa, por lo que para que esto no se de se tiene que cumplir:
Primero( ) Siguiente( ) =

donde Siguiente es el conjunto de tokens que pueden seguir a .

 El proceso de convertir reglas en gramaticales en un analizador sintáctico puede automatizarse, es decir puede
construirse un programa que traduzca un programa en un analizador sintáctico.
 Estos generadores de analizadores sintácticos, es decir, “compiladores de compiladores”, toman como entrada una
versión de las reglas BNF o EBNF y dan como salida un programa de analizador sintáctico en algún lenguaje.
 Dar una gramática a un generador del analizador sintáctico dará como resultado un reconocedor y para que un
analizador construya un árbol sintáctico o que lleve a cabo otras operaciones, debemos proporcionarles operaciones o
acciones a llevar a cabo asociadas a cada regla gramatical, esto es, un esquema dirigido por la sintaxis.
 Uno de estos generadores más conocidos es el YACC.

10 Longinos Recuero Bustos (http://longinox.blogspot.com)


5.7 Léxico comparado con la sintaxis y con la semántica
 Según el DRAE:
o Gramática:
 1. f. Ciencia que estudia los elementos de una lengua y sus combinaciones.
o Sintaxis:
 2. f. Inform. Conjunto de reglas que definen las secuencias correctas de los elementos de un lenguaje

de programación.
o Léxico:
 3. m. Vocabulario, conjunto de las palabras de un idioma, o de las que pertenecen al uso de una región,

a una actividad determinada, a un campo semántico dado, etc.


o Semántica:
 1. adj. Perteneciente o relativo a la significación de las palabras.

 Una gramática libre de contexto típicamente incluye una descripción de los tokens de un lenguaje al incluir en las reglas
gramaticales las cadenas de caracteres que forman los tokens.
 Algunas clases típicas de tokens, como las literales o constantes y los identificadores no son por sí mismos secuencias
fijas de caracteres, sino que se elaboran a partir de un conjunto fijo de caracteres, como los dígitos del 0 al 9.
 Estas clases de tokens pueden tener su estructura definida por la gramática, sin embargo, es posible e incluso deseable
utilizar un analizador léxico para reconocer estas estructuras, pues puede hacerlo mediante una operación repetitiva
simple.
 Los límites entre la sintaxis y el léxico no están claramente definidos, ya que si utilizamos la notación BNF, EBNF o
diagramas sintácticos, se pueden incluir las estructuras léxicas como parte de la descripción del lenguaje.
 Se ha definido la sintaxis como todo lo que se puede definir mediante una gramática libre de contexto, y semántica como
todo lo demás que no se puede definir así.
 Algunos autores incluyen como sintaxis, la declaración de variables antes de que sean utilizadas y la regla de que no se
pueden declarar identificadores dentro de un procedimiento. Estas son reglas sensibles al contexto y por lo tanto un
analizador sintáctico debería tener información sobre el contexto.
 Otro conflicto es cuando un leguaje requiere que ciertas cadenas sean identificadores predefinidos y no palabras
reservadas.
 La diferencia de ambos es que las palabras reservadas son cadenas fijas de caracteres, que son tokens ellas mismas y
que no pueden utilizarse como identificadores, mientras que identificadores predefinidos son cadenas fijas de caracteres
a las que se les ha dado un significado predefinido en el lenguaje, pero este significado puede ser redefinido.
 Por estas razones, el analizador sintáctico debería tener información del contexto sobre los identificadores disponibles a
fin de eliminar ambigüedades.

11 Longinos Recuero Bustos (http://longinox.blogspot.com)

También podría gustarte

  • 8 Control I - Expresiones y Enunciados
    8 Control I - Expresiones y Enunciados
    Documento13 páginas
    8 Control I - Expresiones y Enunciados
    Jesús López Barba
    Aún no hay calificaciones
  • 9 Control II - Procedimientos y Ambientes
    9 Control II - Procedimientos y Ambientes
    Documento10 páginas
    9 Control II - Procedimientos y Ambientes
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 18
    Capitulo 18
    Documento28 páginas
    Capitulo 18
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 16
    Capitulo 16
    Documento22 páginas
    Capitulo 16
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 14
    Capitulo 14
    Documento23 páginas
    Capitulo 14
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 25
    Capitulo 25
    Documento56 páginas
    Capitulo 25
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 13
    Capitulo 13
    Documento24 páginas
    Capitulo 13
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 22
    Capitulo 22
    Documento52 páginas
    Capitulo 22
    Jesús López Barba
    Aún no hay calificaciones
  • Capitulo 09
    Capitulo 09
    Documento23 páginas
    Capitulo 09
    Jesús López Barba
    Aún no hay calificaciones