Post on 07-Jun-2018
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