Gramtica Independiente del Contexto(GIC) para abreviar gramtica: Describe de forma natural la estructura jerrquica de muchas construcciones de los lenguajes de programacin. (GIC), determina el comportamiento del programa Ejemplo: una proposicin if-else en C tiene la siguiente forma if (expresin) proposicin else proposicin Empleando la variable expr para denotar expresin, y la variable prop, para una proposicin, esta regla de estructuracin se expresa prop if (expr) prop else prop Dicha regla se denomina produccin. En una produccin, los elementos lxicos, como palabra clave if y los parntesis, se llaman componentes lxico. Las variables expr y prop representan secuencias de componentes lxicos y se llaman no terminales. Una gramtica independiente del contexto tiene cuatro componentes: 1. Un conjunto de componentes lxicos denominados smbolos terminales. 2. Un conjunto de no terminales 3. Un conjunto de producciones, en el que cada produccin consta de un no terminal, llamado lado izquierdo de la produccin, una flecha y una secuencia de componentes lxicos y no terminales, o ambos, llamado lado derecho de la produccin. 4. La denominacin de uno de los no terminales como smbolo inicial
De una gramtica se derivan cadenas empezando con el smbolo inicial y remplazando repetidamente un no terminal por el lado derecho de una produccin para ese no terminal. Las cadenas de componentes lxicos derivadas del smbolo inicial forman el lenguaje que define la gramtica Ambigedad: Decimos que es ambigua cuando produce ms de un rbol sintctico para una determinada sentencia. Una gramtica ambigua produce problemas al analizador sintctico, que es interesante tratar de construir gramticas no ambiguas. Algunos mtodos para convertir ambiguas a no ambiguas a*b*c
Vamos a especificar la precedencia y asociatividad de los operadores para convertir de ambiguas a no ambiguas a*(b*c)
Que pasa al tener esta expresin 9+5*2 Hay 2 maneras interpretaciones posibles de esta expresin: (9+5)*2 o 9+(5*2) La asociatividad de + y * no resuelve esta ambigedad. Por esta razn se necesita conocer la precedencia relativa de los operadores cuando est presente ms de una clase de operadores. Se dice que * tiene mayor precedencia que + En aritmtica la multiplicacin y divisin tienen mayor precedencia que la adiccin y resta Por tanto la solucin de esta ambigedad es 9+(5*2) , Y este caso? 1+1+1? A esto se le llama agrupaciones arbitraria del mismo operador, la solucin es adoptar una convencin de agrupacin por ejemplo de izquierda entonces quedara de esta forma (1+1) + 1
2.2 Definiciones dirigidas por la sintaxis
2.4 Anlisis Sintctico El anlisis sintctico es el proceso de determinar si una cadena de componentes lxicos puede ser generada por una gramtica. Funciones Comprobar que la secuencia de componentes lxicos cumple las reglas de la gramtica Generar el rbol sintctico
Manejo de errores Si un compilador tuviera que procesar slo programas correctos, su diseo e implantacin se simplificaran mucho. Pero los programadores a menudo escriben programas incorrectos, y un buen compilador debera ayudar al programador a identificar y localizar errores. Los errores en la programacin pueden ser de los siguientes tipos: Lxicos, producidos al escribir mal un identificador, una palabra clave o un operador. Sintcticos, por una expresin aritmtica o parntesis no equilibrados. Semnticos, como un operador aplicado a un operando incompatible. Lgicos, puede ser una llamada infinitamente recursiva
El manejo de errores de sintaxis es el ms complicado desde el punto de vista de la creacin de compiladores. Nos interesa que cuando el compilador encuentre un error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador sintctico debe tener como objetivos: Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localizacin. Recuperarse del error, para poder seguir examinando la entrada. No ralentizar significativamente la compilacin.
Tipo de Gramtica que acepta un analizador sintctico La gramtica que acepta el analizador sintctico es una gramtica de contexto libre: Gramtica: G (N, T, P, S) N = No terminales. T = Terminales. P = Reglas de Produccin. S = Axioma Inicial. Ejemplo: Se considera la gramtica que reconoce las operaciones aritmticas. E E + T | T T T * F | F F ID | NUM | ( E )
En el que: N = {E, T, F} estn a la izquierda de la regla. T = {ID, NUM, ( ,) ,+ ,*} P = Son las siete reglas de produccin. S = Axioma inicial. Podra ser cualquiera, en este caso es E.
Derivaciones: La idea central es que se considera una produccin como una regla de reescritura, donde el no terminal de la izquierda es sustituido por la cadena del lado derecho de la produccin.
Derivacin por la izquierda: Derivacin donde solo el no terminal de ms a la izquierda de cualquier forma de frase se sustituye en cada paso. Derivacin por la derecha o Derivacin cannica: Derivacin donde el no terminal ms a la derecha se sustituye en cada paso. Ejemplo sea: E E + E | E - E | E * E | E / E | E ^ E | id Constryase una derivacin por la izquierda y por la derecha para la siguiente frase: a * c + b ( id1 * id2 + id3)
Tipos de Anlisis De la forma de construir el rbol sintctico se desprenden dos tipos o clases de analizadores sintcticos. Pueden ser descendente o ascendente Descendentes: Parten del axioma inicial, y van efectuando derivaciones a izquierda hasta obtener la secuencia de derivaciones que reconoce a la sentencia. Pueden ser: Con retroceso. Con recursin. LL(1) Es del tipo LL1 porque empezamos a derivando por la izquierda, y los carcteres son leidos de izquierda a derecha, el 1 por que se lee 1 solo elemento de entrada. Ascendentes: Parten de la sentencia de entrada, y van aplicando reglas de produccin hacia atrs (desde el consecuente hasta el antecedente), hasta llegar al axioma inicial. Pueden ser: Con retroceso. LR(1)
2.5 Anlisis Lxico
El anlisis lxico es el proceso de convertir un flujo de caracteres de entrada en un flujo de palabras o elementos. Los elementos son grupos de caracteres con significancia.
Funcin del Principal Generar una lista ordenada de tokens, a partir de los caracteres de entrada. Esos tokens son usados por el Anlisis Sintctico para construir el rbol sintctico.
Tokens: Cdigo de componente Lxico
Definiciones
I. Tokens: Smbolos terminales de una gramtica Identificadores, palabras reservadas, operadores,... Varios signos pueden forman el mismo token
II. Atributos:
Informacin adicional que tiene el token, de utilidad para el anlisis sintctico y semntico.
III. Componentes lxicos (tokens):
Unidad mnima de informacin que significa algo a la hora de compilar; concepto de palabra; las fases de un lenguaje constan de cadenas de componentes lxicos.
IV. Lexema:
Una secuencia de caracteres de entrada que comprenden un solo componente lxico se llama lexema; cadena de caracteres que extrae el componente abstracto del componente lxico.
V. Patrn:
Descripcin de la forma que han de tomarlos lexemas para ajustarse a un componente lxico.
Ejemplo
Componentes Lxicos Lexemas Patrones
/
Tipo de Datos
int, INT, InT float long char int,INT,(i/I),(n/N),(t/T) float long char