Você está na página 1de 55

16 Anlisis sintctico I

Compiladores - Profr. Edgardo Adrin Franco Martnez

Contenido
Recordando la estructura de un compilador Recordando el anlisis lxico El anlisis sintctico Comparacin con el anlisis lxico El Rol del Parser Lenguajes de programacin Gramticas Estructura Notacin Lenguajes libres de contexto Derivaciones y arboles sintcticos Ms a la izquierda (De izquierda a derecha) Ms a la derecha (De derecha a izquierda) Ejercicios 05
Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

Recordando la estructura de un compilador


Programa Fuente (Flujo de caracteres)

Anlisis

Analizador Lxico (Scanner)


Token stream
Analizador Sintctico (Parser) rbol de parseo Analizador Semntico Representacin Intermedia Optimizador de Cdigo Representacin Intermedia Optimizada Generador de Cdigo Cdigo Objeto
Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

Tabla de smbolos

Sntesis

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

Recordando el anlisis lxico


A la primera fase de un compilador se le llama anlisis

lxico o escaneo. El analizador lxico lee el flujo de caracteres que componen el programa fuente y los agrupa en secuencias significativas, conocidas como lexemas. Para cada lexema, el analizador lxico produce como salida un token de la forma:

Smbolo abstracto

Apunta a una entrada en la tabla de smbolos para dicho token

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

Recordando el anlisis lxico


posicion = inicial + velocidad * 60

Smbolo Abstracto
identificador

Apunta a una entrada en la tabla de smbolos para un identificador (La tabla


de smbolos contiene informacin acerca de ste como su nombre y tipo).

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

El anlisis sintctico (Parser)


El anlisis sintctico o parsing utiliza los primeros

componentes de los tokens producidos por el analizador lxico para crear una representacin intermedia en forma de rbol que describa la estructura gramatical del flujo de tokens.
Una representacin tpica es el rbol sintctico, en el cul cada

nodo interior representa una operacin y los hijos del nodo representan los argumentos de la operacin.

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

El anlisis sintctico
posicion = inicial + velocidad * 60
Flujo de tokens del anlisis lxico

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

El anlisis sintctico
Entrada: Secuencia de tokens de un analizador

lxico
Salida: El rbol sintctico de un programa

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

Comparacin con el analizador lxico


Fase
Lexer

Entrada
Secuencia de caracteres Secuencia de tokens

Salida
Secuencia de tokens rbol Sintctico

Parser

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

10

El rol del Parser


No todas las secuencias de tokens son programas El parser debe distinguir entre secuencias de tokens

vlidos y no vlidos. Necesitamos


Un lenguaje para describir secuencias de tokens vlidas. Un mtodo para distinguir entre secuencias de tokens vlidas y

no vlidas.

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

10

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

11

Gramticas de los lenguaje de programacin


Un lenguaje de programacin se puede generar con una

gramtica dependiente del contexto.


Las declaraciones provocan la necesidad de analizar el contexto. No se utilizan estas gramticas por la complejidad temporal de

su analizador (autmatas lineales acotados).

Solucin: Utilizar una gramtica libre del contexto que tiene una complejidad lineal y dejar las caractersticas del lenguaje dependientes del contexto para el anlisis semntico.
11

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

12

Estructura de un lenguaje de programacin


Los

lenguajes de programacin tienen estructuras recursivas. Considere el lenguaje de las expresiones aritmticas con: enteros, +,*, ( y ) Una expresin es cualquiera de:
Un entero Una expresin seguida de + seguida de otra expresin. Una expresin seguida de * seguida de otra expresin. Un ( seguido de una expresin seguido de un ).

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

12

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

13

Estructura de un lenguaje de programacin


int int + int (int + int ) * int

Son expresiones.
13

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

14

Notacin para lenguajes de programacin


Una notacin alternativa E int EE+E EE*E E (E) Podemos pensar en estas reglas como reglas de reescritura. Comenzamos con E y reemplazamos ocurrencias de E con alguna regla que esta a la derecha. E E * E (E) * E (E + E) * E (int + int) * int

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

14

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

15

Observaciones
Todas las expresiones aritmticas se pueden obtener por

una secuencia de reemplazos


Cualquier secuencia de reemplazos forma una expresin

aritmtica vlida
Esto significa que no podemos obtener ( int ))

mediante

reemplazos.

Esta notacin es una gramtica libre de contexto

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

15

Gramticas libres de contexto


Estas gramticas, conocidas tambin como gramticas de tipo

2 o gramticas independientes del contexto, son las que generan los lenguajes libres o independientes del contexto. Los lenguajes libres del contexto son aquellos que pueden ser reconocidos por un autmata de pila determinstico o no determinstico.
Como toda gramtica se definen mediante una cudrupla

G = (N, T, P, S)
- N es un conjunto finito de smbolos no terminales - T es un conjunto finito de smbolos terminales - P es un conjunto finito de producciones - S es el smbolo inicial o axioma
Compiladores (Anlisis Sintctico IV - Edgardo A. Franco)

16

Gramticas libres de contexto


En una gramtica libre del contexto, cada produccin de P

tiene la forma:

Es decir, que en el lado izquierdo de una produccin puede aparecer

el smbolo inicial o un smbolo no terminal y en el lado derecho de una produccin cualquier cadena de smbolos terminales y/o no terminales de longitud mayor o igual que 1. La gramtica puede contener tambin la produccin si el lenguaje que se quiere generar contiene la cadena vaca.
Compiladores (Anlisis Sintctico IV - Edgardo A. Franco)

17

Gramticas libres de contexto vs. regulares


Porqu no se incluye la especificacin lxica como parte de la sintaxis? Las expresiones regulares son un caso particular de las gramticas libres de contexto.
Los AFD son muy sencillos de implementar y son muy

eficientes frente a los autmatas a pila necesarios para reconocer las GLC, la eficiencia del traductor se vera comprometida.
18

Compiladores (Anlisis Sintctico IV - Edgardo A. Franco)

Gramticas libres de contexto vs. regulares


Expresiones regulares o gramticas independientes del contexto? Las expresiones regulares no permiten construcciones anidadas tan comunes en los lenguajes de programacin: parntesis equilibrados, concordancia de pares de palabras clave como begin-end, do-while, ...
Pg.

consideremos el problema de los parntesis equilibrados en una expresin aritmtica. El hecho de que haya un parntesis abierto obliga a que haya un parntesis cerrado.
Compiladores (Anlisis Sintctico IV - Edgardo A. Franco)

19

Gramticas libres de contexto vs. regulares


Expresiones regulares o gramticas independientes del contexto? Este problema es similar a considerar el lenguaje

Si intentamos escribir una expresin regular, lo ms

prximo sera: pero no se garantiza que el numero de as antes y despus sea el mismo.
Las expresiones regulares NO SABEN contar. NO es

posible especificar la estructura de un lenguaje de programacin con slo expresiones regulares.


Compiladores (Anlisis Sintctico IV - Edgardo A. Franco)

20

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

21

Gramticas libres de contexto


Una gramtica libre de contexto es una gramtica formal en la

que cada regla de produccin es de la forma:


Vw

Donde V es un smbolo no terminal y w es una cadena de

terminales y/o no terminales.


El trmino libre de contexto se refiere al hecho de que el no

terminal V puede siempre ser sustituido por w sin tener en cuenta el contexto en el que ocurra.
Un lenguaje formal es libre de contexto si hay una gramtica

libre de contexto que lo genera.


Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

21

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

22

Gramticas libres de contexto


Las gramticas libres de contexto permiten describir la

mayora de los lenguajes de programacin, de hecho, la sintaxis de la mayora de lenguajes de programacin est definida mediante gramticas libres de contexto.
La notacin ms frecuentemente utilizada para expresar

gramticas libres de contexto es la forma Backus-Naur.

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

22

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

23

Gramticas libres de contexto (GLC)


Una gramtica libre de contexto consiste de: Un conjunto de no terminales N Un conjunto de terminales T Un smbolo inicial S (no terminal) Un conjunto de producciones de la forma
E E Y1Y2 Yn

donde E N donde Yi NT

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

23

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

24

Ejemplo de GLC
Expresiones aritmticas simples E int EE+E EE*E E(E) Un no terminal: E Varios terminales: int, +, *, (, ) Llamados terminales por que nunca se reemplazan Por convencin el primer no terminal para la primera produccin es el smbolo inicial.

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

24

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

25

Expresiones Aritmticas
Expresiones aritmticas simples

E E+E E*E (E) id


Algunos elementos del lenguaje

id (id) (id) * id

id + id id * id id * (id)

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

25

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

26

La idea de una GLC


La idea de una GLC es:
Verificar membreca en el lenguaje: "si" o "no" Pero tambin se necesita el rbol sintctico de la entrada Manejar errores Necesitamos una implementacin de una GLC

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

26

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

27

Derivaciones y rboles sintcticos


Una derivacin es una secuencia de producciones

S
Una derivacin se puede dibujar como un rbol
El smbolo inicial es la raz del rbol Para cada produccin X Y1Yn agregar hijos Y1,

Yn a el nodo X

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

27

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

28

Ejemplo de derivacin
Gramtica

E E+E E*E (E) id Cadena id * id + id

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

29

Ejemplo de derivacin
(Continuacin)

E E+E E*E+E id*E+E id*id+E id*id+id


29

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

30

Derivacin en detalle (1)


E raz del arbol

Expresin

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

30

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

31

Derivacin en detalle (2)


E

E E+E

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

31

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

32

Derivacin en detalle (3)


E

E E+E E*E+E
E *

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

32

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

33

Derivacin en detalle (4)


E

E E+E E*E+E id*E+E

id
Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

34

Derivacin en detalle (5)


E

E E+E E*E+E id*id+id

id

id

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

35

Derivacin en detalle (6)


E

E E+E E*E+E id*E+E id*id+id id*id+id

id

id

id
35

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

36

Notas en derivaciones
Un rbol sintctico tiene Terminales en las hojas No terminales en los nodos interiores Un recorrido de izquierda a derecha de las hojas da

como resultado la entrada original


El rbol de derivacin muestra la asociacin de

operaciones, la cadena de entrada no!

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

36

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

37

Derivacin ms a la izquierda y ms a la derecha


El ejemplo anterior es

una derivacin ms a la izquierda


En cada paso, reemplaza el

no terminal ms a la izquierda.
Existe una nocin

equivalente llamada derivacin ms a la derecha

E E+E E+id D*E+id E*id+id id*id+id

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

38

Derivacin ms a la derecha en detalle (1)


E raz del arbol

Expresin

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

38

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

39

Derivacin ms a la derecha en detalle (2)

E E+E

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

39

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

40

Derivacin ms a la derecha en detalle (3)

E E+E E+id

id

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

40

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

41

Derivacin ms a la derecha en detalle (4)

E E+E E+id E*E+id

id

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

41

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

42

Derivacin ms a la derecha en detalle (5)


E

E E+E E+id E*E+id E*id+id

id

id
Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

42

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

43

Derivacin ms a la derecha en detalle (6)


E

E E+E E+id E*E+id id*id+id

id

id

id
43

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

44

Derivaciones y rboles sintcticos


Note que para cada rbol sintctico hay una derivacin ms a la

izquierda y una ms a la derecha. La diferencia es el orden en el cual se agregan las ramas

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

44

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

45

Resumen de derivaciones
No slo estamos interesados si: s L(G) Necesitamos un rbol sintctico para s Una derivacin define un rbol sintctico Pero un rbol sintctico puede tener ms de una derivacin Tanto las derivaciones ms a la izquierda como ms a

la derecha son importantes en implementaciones de analizadores sintcticos.

Compiladores (Anlisis Sintctico I - Edgardo A. Franco)

45

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

46

Resumen de derivaciones
Derivacin por la izquierda E Derivacin por la derecha E

id

id

id

id

id
Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

id
46

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

47

Resumen de derivaciones
La diferencia es el orden en el cual se agregan las ramas,

pero se genera el mismo rbol por ambos lados, lo que indica que es una gramtica no ambigua para obtener la cadena id*id+id.

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

47

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

48

Ejercicios 05
Problema 01 Considere la siguiente gramtica libre de contexto: S SS | SS* | a
y la cadena

aa a *

a) Proporcione una derivacin por la izquierda para la cadena b) Proporcione una derivacin por la derecha para la cadena c) Proporcione un rbol de anlisis sintctico para la cadena d) La gramtica es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramtica

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

49

Ejercicios 05
Problema 02 Considere la siguiente gramtica libre de contexto:

S 0S1 | 01
y la cadena

000111

a) Proporcione una derivacin por la izquierda para la cadena b) Proporcione una derivacin por la derecha para la cadena c) Proporcione un rbol de anlisis sintctico para la cadena d) La gramtica es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramtica

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

50

Ejercicios 05
Problema 03 Considere la siguiente gramtica libre de contexto: S SS | *SS | a
y la cadena

*aaa

a) Proporcione una derivacin por la izquierda para la cadena b) Proporcione una derivacin por la derecha para la cadena c) Proporcione un rbol de anlisis sintctico para la cadena d) La gramtica es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramtica

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

51

Ejercicios 05
Problema 04 Considere la siguiente gramtica libre de contexto: S S (S )S |
y la cadena

(()())

a) Proporcione una derivacin por la izquierda para la cadena b) Proporcione una derivacin por la derecha para la cadena c) Proporcione un rbol de anlisis sintctico para la cadena d) La gramtica es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramtica

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

52

Ejercicios 05
Problema 05 Considere la siguiente gramtica libre de contexto: S S S | SS | (S ) | S* | a
y la cadena

( a a) * a

a) Proporcione una derivacin por la izquierda para la cadena b) Proporcione una derivacin por la derecha para la cadena c) Proporcione un rbol de anlisis sintctico para la cadena d) La gramtica es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramtica

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

53

Ejercicios 05
Problema 06 Considere la siguiente gramtica libre de contexto:

S aSbS | bSaS |
y la cadena

aabbab

a) Proporcione una derivacin por la izquierda para la cadena b) Proporcione una derivacin por la derecha para la cadena c) Proporcione un rbol de anlisis sintctico para la cadena d) La gramtica es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramtica

Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

54

Ejercicios 05
Problema 08 Disee gramticas para el siguiente lenguaje:
a) El conjunto de todas las cadenas de 0s y 1s , de tal forma que

justo antes de cada 0 vaya por lo menos un 1.


b) El conjunto de todas las cadenas de 0s y 1s que sean

palndromos; es decir, que la cadena se lea igual al derecho y al revs.


c) El conjunto de todas las cadenas de 0s y 1s en donde 011 no

aparece como subcadena.


Compiladores (Anlisis Sintctico II - Edgardo A. Franco)

16 Anlisis sintctico I
Compiladores - Profr. Edgardo Adrin Franco Martnez

55

Ejercicios 05
Fecha de entrega

Entregar en formato digital va Web, con el titulo "Ejercicios 05 GLC derivaciones" a ms tardar el da lunes 11 de abril de 2011.

Você também pode gostar