Sei sulla pagina 1di 9

Unidad 2 Compiladores de una pasada

2.2 Definicin de la Sintaxis


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

Palabras
Reservadas

while
for
if

Letra(letra/numero)*


Identificadores

x
aux
max

while
for
if

Potrebbero piacerti anche