Está en la página 1de 85

Anatoma de un Compilador

Optimizador
Generador de Cdigo
Representacin Intermedia Optimizada
Cdigo en Assembler
Generador de Cdigo Intermedio
Representacin Intermedia
Analizador Lxico (Scanner)
Analizador Sintctico (Parser)
Token
rbol de Parseo
Programa
Anatoma de un Compilador
Optimizador de Cdigo
Generador de Cdigo
Representacin Intermedia Optimizada
Cdigo en Assembler
Generador de Cdigo Intermedio
Representacin Intermedia
Analizador Lxico (Scanner)
Analizador Sintctico (Parser)
Token Stream
rbol de Parseo
Programa (character stream)
Entrada y Salida de un Parser
-
( )
123.3 23.6
+
op_menos
op_paren_izq
num(123.3)
op_mas
num(23.6)
op_paren_der
Token Reconocido rbol de Parseo
Entrada: - (123.3 + 23.6)
A
n
a
l
i
z
a
d
o
r

S
i
n
t

c
t
i
c
o

(
P
a
r
s
e
r
)

Problema de los parntesis
balanceados
Podemos definir esto usando una expresin regular?
NO!
Intuicin
Nmero de parntesis abiertos debe ser igual a
nmero de parntesis cerrados
Necesitamos mantener un conteo o necesitamos
recursin
Adems: AFNs y AFDs no pueden ejecutar conteo
sin lmites
Problema de los parntesis
balanceados
Hay alguna gramtica que defina esto?

<S> ( <S> ) <S> |

La definicin es recursiva
Esta es una gramtica libre de contexto
Definiendo Gramticas Libres de
Contexto (GLCs)
Terminales
Smbolos para strings o tokens
No terminales
Variables sintcticas
Smbolo de Inicio
Un no-terminal especial designado como tal
Producciones
La forma en que los terminales y no-terminales son
combinados para formar strings
Un no-terminal en el lado izquierdo y un string de terminales
y no-terminales en el lado derecho
Ejemplo de una GLC
<S> ( <S> ) <S> |
Ejemplo de una GLC
<S> ( <S> ) <S>

<S>

Ejemplo de una GLC
<S> ( <S> ) <S>

<S>

Terminales
Ejemplo de una GLC
<S> ( <S> ) <S>

<S>

No-terminales
Ejemplo de una GLC
<S> ( <S> ) <S>

<S>

Smbolo de Inicio: <S>
Ejemplo de una GLC
<S> ( <S> ) <S>

<S>

Producciones
Los lenguajes regulares son un subconjunto
de los lenguajes libres de contexto
a
Expresin Regular Gramtica libre de contexto
<A> a
p q <S> <P> <Q>
Si p y q son expresiones regulares, usando GLCs <P> y <Q>
p | q <S> <P>
<S> <Q>
p * <S> <S> <P>
<S>
Ejemplo: Una GLC para expresiones
Expresiones aritmticas simples con + y *
8.2 + 35.6
8.32 + 86 * 45.3
(6.001 + 6.004) * (6.035 * -(6.042 + 6.046))
Terminales (o tokens)
num para todos los nmeros
op_mas (+), op_menos (-), op_frecuencia(*),
op_paren_izq((), op_paren_der())
Cul es la gramtica para todas las expresiones
posibles?
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Terminales
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Terminales
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
No-terminales
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
No-terminales
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Smbolo de Inicio:
<expr>
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Producciones
Ejemplo: Una GLC para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Ejemplo: Una GLC para expresiones



<expr> <expr> <op> <expr> | ( <expr> )
| - <expr> | num

<op> + | *

Ejemplo de Derivacin
Gramtica
<expr> <expr><op><expr> | (<expr>) | -<expr> | num
<op> + | *

Entrada
36 * ( 8 + 23.4)

Reconocimiento de Token
num * ( num + num )

Ejemplo de Derivacin
<expr>
num * ( num + num )
Ejemplo de Derivacin
<expr>
num * ( num + num )
Ejemplo de Derivacin
<expr>

num * ( num + num )
<expr> <expr><op><expr>
Ejemplo de Derivacin
<expr> <expr> <op> <expr>

num * ( num + num )
<expr> <expr><op><expr>
Ejemplo de Derivacin
<expr> <expr> <op> <expr>

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>


num * ( num + num )
<expr> num
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>

num * ( num + num )
<expr> num
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>


num * ( num + num )
<op> *
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>

num * ( num + num )
<op> *
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>


num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>


num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>

num * ( num + num )
<expr> (<expr>)
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )

num * ( num + num )
<expr> (<expr>)
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )


num * ( num + num )
<expr> <expr><op><expr>
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )

num * ( num + num )
<expr> <expr><op><expr>
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )


num * ( num + num )
<expr> num
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )

num * ( num + num )
<expr> num
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )


num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )

num * ( num + num )
<op> +
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )

num * ( num + num )
<op> +
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )

num * ( num + num )
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )

num * ( num + num )
<expr> num
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
num * ( num + num )
num * ( num + num )
<expr> num
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
num * ( num + num )
num * ( num + num )
Ejemplo de rbol de Parseo
<expr>
Ejemplo de rbol de Parseo
<expr> <expr> <op> <expr>

<expr>
<expr> <expr> <op>
Ejemplo de rbol de Parseo
<expr> num

num
<expr>
<expr> <expr> <op>
Ejemplo de rbol de Parseo
<op> *

*
num
<expr>
<expr> <expr> <op>
Ejemplo de rbol de Parseo
<expr> ( <expr> )

( ) *
num
<expr>
<expr> <expr>
<expr>
<op>
Ejemplo de rbol de Parseo
<expr> <expr> <op> <expr>

( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Ejemplo de rbol de Parseo
<expr> num

num
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Ejemplo de rbol de Parseo
<op> +

num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Ejemplo de rbol de Parseo
<expr> num
num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Ejemplo de rbol de Parseo


num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
num * ( num + num )
Derivaciones por Izq vs. por Der
Derivacin por Izq
En el string, encontramos el no-terminal ms a la
izquierda, y le aplicamos una produccin
El ejemplo anterior fue de una derivacin por la Izq

Derivacin por Der
Encontramos el no-terminal de ms a la derecha, y
le aplicamos una produccin
Ejemplo de Derivacin por Der


<expr>
Produccin:
String: <expr>
Ejemplo de Derivacin por Der


<expr>
<expr> <expr> <op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> <expr>
Ejemplo de Derivacin por Der


( )
<expr>
<expr> <expr>
<expr>
<op>
Produccin: <expr> ( <expr> )
String: <expr> <op> ( <expr> )
Ejemplo de Derivacin por Der


( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> ( <expr> <op> <expr> )
Ejemplo de Derivacin por Der


num
( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> num
String: <expr> <op> ( <expr> <op> num )
Ejemplo de Derivacin por Der


num
+
( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <op> +
String: <expr> <op> ( <expr> + num )
Ejemplo de Derivacin por Der


num num
+
( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> num
String: <expr> <op> ( num + num )
Ejemplo de Derivacin por Der


num num
+
( ) *
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <op> *
String: <expr> * ( num + num )
Ejemplo de Derivacin por Der


num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> num
String: num * ( num + num )
Ejemplo de Derivacin por Der


num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>

String: num * ( num + num )
Ejemplo de Derivacin Der
<expr>
<expr> <op> <expr>
<expr> <op> ( <expr> )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> <op> num )
<expr> <op> ( <expr> + num )
<expr> <op> ( num + num )
<expr> * ( num + num )
num * ( num + num )

Misma cadena Dos derivaciones



num + num * num
num num
* num
<expr>
<expr>
<expr>
<expr> <expr>
<op>
+
<op>
num num
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
*
<op>
124 + (23.5 * 86) = 2145 (124 + 23.5) * 86 = 12685
La Gramtica es Ambigua
Aplicar diferentes ordenes de derivacin,
produce rboles de parseo diferentes
Lleva a resultados ambiguos
Algunas veces, reescribir la gramtica con ms
no-terminales, elimina la ambigedad
La Gramtica Ambiga
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Eliminando la Ambigedad
<expr> <expr> + <term>
<expr> <term>
<term> <term> * <unit>
<term> <unit>
<unit> num
<unit> ( <expr> )
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Eliminando la Ambigedad



String: num + num * num
num
+
<expr>
<term> <expr>
<term> <unit>
*
num
<unit>
<term>
num
<unit>
Primer ejemplo en la nueva gramtica


+
( )
*
num
<term>
<unit> <term>
<expr>
<expr>
<term>
num * ( num + num )
<expr>
<unit>
num
<term>
<unit>
num
<unit>

También podría gustarte