presentación de powerpoint - eafranco.com€¢lenguajes de programación ... de símbolos para...

55

Upload: doantruc

Post on 07-Jun-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Contenido

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

• Recordando la estructura de un compilador

• Recordando el análisis léxico

• El análisis sintáctico • Comparación con el análisis léxico

• El Rol del Parser

• Lenguajes de programación • Gramáticas

• Estructura

• Notación

• Lenguajes libres de contexto

• Derivaciones y arboles sintácticos • Más a la izquierda (De izquierda a derecha)

• Más a la derecha (De derecha a izquierda)

• Ejercicios 05

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

2

Recordando la estructura de un compilador

Analizador Sintáctico (Parser)

Generador de Código

Optimizador de Código

Analizador Semántico

Analizador Léxico (Scanner)

Árbol de parseo

Programa Fuente (Flujo de caracteres)

Token stream

Representación Intermedia

Representación Intermedia Optimizada

Código Objeto

An

álisis

S

ínte

sis

Tabla de símbolos

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

3

Recordando el análisis léxico

• A la primera fase de un compilador se le llama análisis

léxico o escaneo. El analizador léxico lee el flujo de

caracteres que componen el programa fuente y los

agrupa en secuencias significativas, conocidas como

lexemas. Para cada lexema, el analizador léxico produce

como salida un token de la forma:

Símbolo abstracto

Apunta a una

entrada en la tabla

de símbolos para

dicho token

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

4

Recordando el análisis léxico

posicion = inicial + velocidad * 60

Símbolo

Abstracto identificador

Apunta a una

entrada en la tabla

de símbolos para

un identificador (La tabla

de símbolos contiene

información acerca de éste

como su nombre y tipo).

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

5

El análisis sintáctico (Parser)

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

• El análisis sintáctico o parsing utiliza los primeros

componentes de los tokens producidos por el analizador

léxico para crear una representación intermedia en

forma de árbol que describa la estructura gramatical del

flujo de tokens.

• Una representación típica es el árbol sintáctico, en el cuál cada

nodo interior representa una operación y los hijos del nodo

representan los argumentos de la operación.

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

6

El análisis sintáctico

posicion = inicial + velocidad * 60 Flujo de tokens

del análisis léxico

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

7

El análisis sintáctico

•Entrada: Secuencia de tokens de un analizador

léxico

•Salida: El árbol sintáctico de un programa

8 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

8

Comparación con el analizador léxico

Fase Entrada Salida

Lexer Secuencia de

caracteres

Secuencia de

tokens

Parser Secuencia de

tokens

Árbol Sintáctico

9 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

9

El rol del Parser

• No todas las secuencias de tokens son programas …

• El parser debe distinguir entre secuencias de tokens

válidos y no válidos.

• Necesitamos

• Un lenguaje para describir secuencias de tokens válidas.

• Un método para distinguir entre secuencias de tokens válidas y

no válidas.

10 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

10

Gramáticas de los lenguaje de programación

• Un lenguaje de programación se puede generar con una

gramática dependiente del contexto.

• Las declaraciones provocan la necesidad de analizar el contexto.

• No se utilizan estas gramáticas por la complejidad temporal de

su analizador (autómatas lineales acotados).

• Solución:

• Utilizar una gramática libre del contexto que tiene una

complejidad lineal y dejar las características del lenguaje

dependientes del contexto para el análisis semántico.

11 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

11

Estructura de un lenguaje de programación

• Los lenguajes de programación tienen estructuras recursivas.

• Considere el lenguaje de las expresiones aritméticas con: enteros, +,*, ( y )

• Una expresión es cualquiera de:

• Un entero

• Una expresión seguida de ¨+¨ seguida de otra expresión.

• Una expresión seguida de ¨*¨ seguida de otra expresión.

• Un ´(´ seguido de una expresión seguido de un ´)´.

12 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

12

Estructura de un lenguaje de

programación

• int

• int + int

• (int + int ) * int

Son expresiones.

13 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

13

Notación para lenguajes de programación

• Una notación alternativa

E int

E E + E

E E * 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

14 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

14

Observaciones

• Todas las expresiones aritméticas se pueden obtener por

una secuencia de reemplazos

• Cualquier secuencia de reemplazos forma una expresión

aritmética válida

• Esto significa que no podemos obtener ( int )) mediante

reemplazos.

Esta notación es una gramática libre de contexto

15 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

15

Gramáticas libres de contexto

• Estas gramáticas, conocidas también como gramáticas de tipo 2 o gramáticas 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 autómata de pila determinístico o no determinístico.

• Como toda gramática se definen mediante una cuádrupla

G = (N, T, P, S)

• - N es un conjunto finito de símbolos no terminales

• - T es un conjunto finito de símbolos terminales

• - P es un conjunto finito de producciones

• - S es el símbolo inicial o axioma 16

Compiladores (Análisis Sintáctico IV - Edgardo A. Franco)

Gramáticas libres de contexto • En una gramática libre del contexto, cada producción de P

tiene la forma:

• Es decir, que en el lado izquierdo de una producción puede aparecer

el símbolo inicial o un símbolo no terminal y en el lado derecho de

una producción cualquier cadena de símbolos terminales y/o no

terminales de longitud mayor o igual que 1.

• La gramática puede contener también la producción si el

lenguaje que se quiere generar contiene la cadena vacía.

17 Compiladores (Análisis Sintáctico IV - Edgardo A. Franco)

Gramáticas libres de contexto vs. regulares

¿Porqué no se incluye la especificación léxica como parte

de la sintaxis?

• Las expresiones regulares son un caso particular de las

gramáticas libres de contexto.

• Los AFD son muy sencillos de implementar y son muy

eficientes frente a los autómatas a pila necesarios para

reconocer las GLC, la eficiencia del traductor se vería

comprometida.

18 Compiladores (Análisis Sintáctico IV - Edgardo A. Franco)

Gramáticas libres de contexto vs. regulares

¿Expresiones regulares o gramáticas independientes del

contexto?

• Las expresiones regulares no permiten construcciones

anidadas tan comunes en los lenguajes de programación:

paréntesis equilibrados, concordancia de pares de palabras

clave como begin-end, do-while, ...

• Pg. consideremos el problema de los paréntesis

equilibrados en una expresión aritmética. El hecho de que

haya un paréntesis abierto obliga a que haya un paréntesis

cerrado.

19 Compiladores (Análisis Sintáctico IV - Edgardo A. Franco)

Gramáticas libres de contexto vs. regulares

¿Expresiones regulares o gramáticas independientes del contexto?

• Este problema es similar a considerar el lenguaje

• Si intentamos escribir una expresión regular, lo más próximo sería: pero no se garantiza que el numero de a’s antes y después sea el mismo.

• Las expresiones regulares NO SABEN contar. NO es posible especificar la estructura de un lenguaje de programación con sólo expresiones regulares.

20 Compiladores (Análisis Sintáctico IV - Edgardo A. Franco)

Gramáticas libres de contexto • Una gramática libre de contexto es una gramática formal en la

que cada regla de producción es de la forma: V → w

• Donde V es un símbolo no terminal y w es una cadena de terminales y/o no terminales.

• El término 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 gramática libre de contexto que lo genera.

21 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

21

Gramáticas libres de contexto

• Las gramáticas libres de contexto permiten describir la mayoría de los lenguajes de programación, de hecho, la sintaxis de la mayoría de lenguajes de programación está definida mediante gramáticas libres de contexto.

• La notación más frecuentemente utilizada para expresar gramáticas libres de contexto es la forma Backus-Naur.

22 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

22

Gramáticas libres de contexto (GLC) • Una gramática libre de contexto consiste de:

• Un conjunto de no terminales N

• Un conjunto de terminales T

• Un símbolo inicial S (no terminal)

• Un conjunto de producciones de la forma

• E donde E N

• E Y1Y2 … Yn donde Yi NT

23 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

23

Ejemplo de GLC

• Expresiones aritméticas simples

E int

E E + E

E E * E

E ( E )

• Un no terminal: E

• Varios terminales: int, +, *, (, )

• Llamados terminales por que nunca se reemplazan

• Por convención el primer no terminal para la primera producción es el símbolo inicial.

24 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

24

Expresiones Aritméticas

•Expresiones aritméticas simples

E E+E E*E (E) id

•Algunos elementos del lenguaje

id id + id

(id) id * id

(id) * id id * (id)

25 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

25

La idea de una GLC

•La idea de una GLC es:

• Verificar membrecía en el lenguaje: "si" o "no"

• Pero también se necesita el árbol sintáctico de la entrada

• Manejar errores

• Necesitamos una implementación de una GLC

26 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

26

Derivaciones y árboles sintácticos

•Una derivación es una secuencia de producciones

S …

•Una derivación se puede dibujar como un árbol

• El símbolo inicial es la raíz del árbol

• Para cada producción X Y1…Yn agregar hijos Y1,

… Yn a el nodo X

27 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

27

Ejemplo de derivación

•Gramática

E E+E E*E (E) id

Cadena

id * id + id

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

28

Ejemplo de derivación (Continuación)

E

E+E

E*E+E

id*E+E

id*id+E

id*id+id

29 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

29

Derivación en detalle (1)

E

E raíz del arbol

Expresión

30 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

30

Derivación en detalle (2)

E

E+E

E

E + E

31 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

31

Derivación en detalle (3)

E

E+E

E*E+E

E

E + E

E * E

32 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

32

Derivación en detalle (4)

E

E+E

E*E+E

id*E+E

E

E + E

E * E

id

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

33

Derivación en detalle (5)

E

E+E

E*E+E

id*id+id

E

E + E

E * E

id

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

34

id

E

E+E

E*E+E

id*E+E

id*id+id

id*id+id

E

E + E

E * E

id id

id

35 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

35

Derivación en detalle (6)

Notas en derivaciones

• Un árbol sintáctico 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 derivación muestra la asociación de operaciones, la cadena de entrada no!

36 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

36

Derivación más a la izquierda y más a la

derecha

• El ejemplo anterior es

una derivación más a la

izquierda

• En cada paso, reemplaza el

no terminal más a la

izquierda.

• Existe una noción

equivalente llamada

derivación más a la

derecha

E

E+E

E+id

D*E+id

E*id+id

id*id+id

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

37

E

E raíz del arbol

Expresión

38 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

38

Derivación más a la derecha en detalle (1)

E

E+E

E

E + E

39 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

39

Derivación más a la derecha en detalle (2)

E

E+E

E+id

E

E + E

id

40 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

40

Derivación más a la derecha en detalle (3)

E

E+E

E+id

E*E+id

E

E + E

id E * E

41 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

41

Derivación más a la derecha en detalle (4)

E

E+E

E+id

E*E+id

E*id+id

E

E + E

id E * E

id 42

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

42

Derivación más a la derecha en detalle (5)

E

E+E

E+id

E*E+id

id*id+id

E

E + E

id E * E

id id 43

Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

43

Derivación más a la derecha en detalle (6)

Derivaciones y árboles sintácticos

• Note que para cada árbol sintáctico hay una derivación más a la

izquierda y una más a la derecha.

• La diferencia es el orden en el cual se agregan las ramas

44 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

44

Resumen de derivaciones

• No sólo estamos interesados si:

s L(G)

• Necesitamos un árbol sintáctico para s

• Una derivación define un árbol sintáctico

• Pero un árbol sintáctico puede tener más de una derivación

• Tanto las derivaciones más a la izquierda como más a

la derecha son importantes en implementaciones de

analizadores sintácticos.

45 Compiladores (Análisis Sintáctico I - Edgardo A. Franco)

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

45

46 Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

E

E + E

id E * E

id id

E

E + E

E * E

id id

id

Derivación por la izquierda Derivación por la derecha

Resumen de derivaciones

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

46

• 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 gramática no ambigua para obtener la

cadena id*id+id.

47 Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

Resumen de derivaciones

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

47

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Considere la siguiente gramática libre de contexto:

• y la cadena

a) Proporcione una derivación por la izquierda para la cadena

b) Proporcione una derivación por la derecha para la cadena

c) Proporcione un árbol de análisis sintáctico para la cadena

d) ¿La gramática es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramática

aSSSSS |*|

*aaa

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

48

Ejercicios 05 Problema 01

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Considere la siguiente gramática libre de contexto:

• y la cadena

a) Proporcione una derivación por la izquierda para la cadena

b) Proporcione una derivación por la derecha para la cadena

c) Proporcione un árbol de análisis sintáctico para la cadena

d) ¿La gramática es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramática

01|10SS

000111

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

49

Ejercicios 05 Problema 02

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Considere la siguiente gramática libre de contexto:

• y la cadena

a) Proporcione una derivación por la izquierda para la cadena

b) Proporcione una derivación por la derecha para la cadena

c) Proporcione un árbol de análisis sintáctico para la cadena

d) ¿La gramática es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramática

aSSSSS |*|

aaa*

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

50

Ejercicios 05 Problema 03

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Considere la siguiente gramática libre de contexto:

• y la cadena

a) Proporcione una derivación por la izquierda para la cadena

b) Proporcione una derivación por la derecha para la cadena

c) Proporcione un árbol de análisis sintáctico para la cadena

d) ¿La gramática es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramática

|)( SSSS

(()())

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

51

Ejercicios 05 Problema 04

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Considere la siguiente gramática libre de contexto:

• y la cadena

a) Proporcione una derivación por la izquierda para la cadena

b) Proporcione una derivación por la derecha para la cadena

c) Proporcione un árbol de análisis sintáctico para la cadena

d) ¿La gramática es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramática

aSSSSSSS |*|)(||

aaa *)(

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

52

Ejercicios 05 Problema 05

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Considere la siguiente gramática libre de contexto:

• y la cadena

a) Proporcione una derivación por la izquierda para la cadena

b) Proporcione una derivación por la derecha para la cadena

c) Proporcione un árbol de análisis sintáctico para la cadena

d) ¿La gramática es ambigua o no? Justifique su respuesta

e) Describa el lenguaje generado por esta gramática

|| bSaSaSbSS

aabbab

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

53

Ejercicios 05 Problema 06

Compiladores (Análisis Sintáctico II - Edgardo A. Franco)

• Diseñe gramáticas para el siguiente lenguaje:

a) El conjunto de todas las cadenas de 0’s y 1’s , de tal forma que

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

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

palíndromos; es decir, que la cadena se lea igual al derecho y al

revés.

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

aparece como subcadena.

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

54

Ejercicios 05 Problema 08

Ejercicios 05

16 Análisis sintáctico I Compiladores - Profr. Edgardo Adrián Franco Martínez

55

•Fecha de entrega

Entregar en formato digital vía Web, con el

titulo "Ejercicios 05 GLC derivaciones" a más

tardar el día lunes 11 de abril de 2011.