Sunteți pe pagina 1din 31

Compiladores

Anlisis Sintctico

Eliminacin de Recursividad
Eliminacin de Factorizacin
Indice
Resumen
Recordando Ambiguedad
Recursividad por la Izquierda
Eliminacin de la Factorizacin
Expresiones Regulares,
Gramticas y Lenguajes
Una expresin regular puede ser escrita usando:
Caracteres en el alfabeto
Operadores de expresiones regulares:
* | + ? ( )
Ejemplo:
(-| ) (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?

Un lenguaje regular es un lenguaje definido por


una expresin regular
Sintaxis y Semntica de un
Lenguaje de Programacin?

Sintaxis
Como se ve un programa
Representacin textual o estructura
Es posible una definicin matemtica precisa

Semntica
Cul es el significado de un programa
Es ms difcil dar una definicin matemtica
Por qu hacer anlisis sintctico?
Podemos proveer una definicin precisa y fcil
de entender
Una gramtica apropiada imparte estructura a
un lenguaje de programacin
Podemos construir automticamente un parser
que determine si el programa es sintcticamente
correcto
Ayuda en el proceso de traduccin
Fcil modificar/aadir al lenguaje
Entrada y Salida de un Parser
Entrada: - (123.3 + 23.6)

Token Stream Arbol de Parseo

Analizador Sintctico (Parser)


minus_op

left_paren_op
-
num(123.3)

plus_op
( )
num(23.6)

right_paren_op
123.3 23.6
+
Mismo string Dos derivaciones
num + num * num
<expr> <expr>

<expr> <op> <expr> <expr> <op> <expr>

<expr> <op> <expr> <expr> <op> <expr>


num + * num

num * num num + num

124 + (23.5 * 86) = 2145 (124 + 23.5) * 86 = 12685


Eliminacin de la Recursividad por
Izquierda
Recursin por la izquierda inmediata simple (Eliminacin de la recursividad
izquierda de las producciones)

En este caso la recursin por la izquierda se presenta solo en las reglas


gramaticales

AA|
Donde y son cadenas de terminales y no terminales y no comienza en A.

Esta regla genera todas las cadenas de la forma , , Todas las cadenas
comienzan con una , seguida por (0 o mas ).

Esta regla gramatical es equivalente a la expresin regular


Eliminacin de la Recursividad por
Izquierda
Para eliminar la recursin por la izquierda volvemos a escribir estas reglas
gramaticales divididas en dos: una para que primero genere y otra que
genere las repeticiones de utilizando recursin por la derecha en vez de recursin
por la izquierda:

A A
A A|

Ejemplo Considere de nueva cuenta la regla recursiva izquierda de la gramtica de


expresin simple:

exp exp opsuma term | term

La forma de esta regla es A A | , con A= exp, =opsuma term y =term. Al


volverla a escribir para eliminar la recursividad por la izquierda obtenemos que

exp term exp


exp opsuma term exp |
Eliminacin de la Recursividad por
Izquierda
Recursin por la izquierda inmediata general (Eliminando la recursin directa
por la izquierda de una produccin general)
Este es el caso en que tenemos producciones de la forma

A A | A ||A n | | | | m

Donde ninguna m comienzan con una A. Despus se sustituyen las


producciones de A por:

A A| A|.| m A
A A| A|.| n A|

Ejemplo. Considere la regla gramatical

exp exp + term | exp - term | term


Eliminacin de la Recursividad por
Izquierda

Recursin por la izquierda general (Eliminacin de la recursividad izquierda de


una gramtica completa puede ser mas difcil debido a la recursividad izquierda
indirecta).

Es indirectamente recursiva porque elimina por completo la recursividad izquierda

El algoritmo que aqu describimos eliminara sistemticamente la recursin por la


izquierda general de una gramtica. Siempre funciona si la gramtica no tiene ciclos
(donde un ciclo es una derivacin de por lo menos un paso que comienza y finaliza con
el mismo no terminal:
A -> Aa
O producciones (producciones de la forma A )
Eliminacin de la Recursividad por
Izquierda
Algoritmo

Entrada La gramtica G sin ciclos ni producciones


Salida Una gramtica equivalente sin recursin por la izquierda

1.- Ordnense los no terminales en un orden A, A,..,An


2.- PARA i =: 1 hasta n HACER
COMIENZA {PARA i}
PARA j=: 1 hasta i-1 HACER
Reemplace cada produccin de la forma Ai Aj por las producciones:
Ai | || k
Donde:
Aj | || k
Son todas las producciones de Aj actuales
Eliminar la recursividad inmediata por la izquierda entre las producciones de Ai
Eliminacin de la Recursividad por
Izquierda
S Aa | b
A Ac|Sd|

Se ordenan los no terminales S, A. No hay recursin directa por la izquierda entre las
producciones de S, de modo que no ocurre nada durante el paso 2 para el caso i=1.
Para i=2, se sustituyen las producciones de S en A Sd para obtener las siguientes
producciones de A.

A Ac|Aad | bd |

Eliminando la recursin directa por la izquierda entre las producciones de A, se


obtiene la siguiente gramtica
S Aa | b
AbdA | A
Ac A|ad A|

La eliminacin de la recursin por la izquierda no cambia el lenguaje modifica la


gramtica
Factorizacin por Izquierda
Una gramtica tiene dos producciones alternativas de un smbolo A empiezan iguales, no se
sabr por cul de ellas seguir. Se trata de reescribir las producciones de A para retrasar la
decisin hasta haber visto lo suficiente de la entrada como para elegir la opcin correcta.
Ejemplo de una gramtica que tiene Factorizacin por la izquierda

Para eliminar la Factorizacin se debe poner en practica la siguiente formula:


Factorizacin por Izquierda

EJEMPLO Resolucin
Compiladores
Introduccin al Anlisis Sintctico

Analizador Predictivo no Recursivo


LL1
Resumen
Implementando un Parser Descendente
Obteniendo los Primeros
Obteniendo los Siguientes
Anatomia de un Compilador
Programa (character stream)
Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
Representacin Intermedia
Optimizador
Representacin Intermedia Optimizada
Generador de Cdigo
Cdigo en Assembler
REGLAS DE LOS PRIMEROS
PRIMER EJEMPLO
SEGUNDO EJEMPLO EJEMPLO
REGLAS DE LOS SIGUIENTES
PRIMER EJEMPLO
SEGUNDO EJEMPLO
PARSER DESCENDENTE
E TE
E +TE | -TE |
T FT
T *FT | /FT |
F (E) | num | id
OBTENIENDO LOS PRIMEROS
P(E){(, num, id}
P(E){+, -, }
P(T){(,num,id}
P(T){*,/, }
P(F){(,num,id}
OBTENIENDO LOS SIGUIENTES
S(E){$,)}
S(E){$,)}
S(T){+,-,$,)}
S(T){+,-,$,)}
S(F){+,/,*-,$,)}
TABLA DE ANALISIS
SINTACTICO
+ - * / ( ) num id $
E TE TE TE
E +TE -TE
T FT FT FT
T *FT /FT
F (E) num id

E TE S(E){$,)}
P(E){(, num, id}
E +TE | -TE | S(E){$,)}
P(E){+, -, }
T FT S(T){+,-,$,)}
P(T){(,num,id}
T *FT | /FT | S(T){+,-,$,)}
P(T){*,/, }
F (E) | num | id S(F){+,/,*-,$,)}
P(F){(,num,id}
TABLA DE ANALISIS
SINTACTICO
+ - * / ( ) num id $
E TE TE TE
E +TE -TE
T FT FT FT
T *FT /FT
F (E) num id
VALIDAR CADENA LL(1)
PILA ENTRADA
$E num+id*num$
$E'T num+id*num$
$E'T'F num+id*num$
$E'T'F num+id*num$
$E'T'num +id*num$
$E'T' +id*num$
$E' +id*num$
$E'T+ +id*num$
$E'T'F id*num$
$E'T'id id*num$
$E'T' *num$
$E'R'F* *num$
$E'T'F num$
$E'T'num num$
$E'T' $
$E' $
$ $
ENTRADA a + b $

PILA X Programa para


Y anlisis sintctico SALIDA
Z predictivo
$

Tabla de anlisis
Sintctico M

S-ar putea să vă placă și