clase3-2012-1 - Universidad Nacional de Jujuy

Download Report

Transcript clase3-2012-1 - Universidad Nacional de Jujuy

Universidad Nacional de Jujuy
Facultad de Ingeniería
COMPILADORES
ANALISIS SINTACTICO
Parte I
Elizabeth Reinoso [email protected]
Objetivos del Tema
Introducir el funcionamiento de un A.
sintáctico
 Introducir términos utilizados
 Presentar la especificación en forma
de gramáticas
 Identificar los tipos de analizadores
sintácticos

Eliz2abeth Reinoso: [email protected]
Índice General
Introducción
 Árboles de análisis sintáctico
 Especificación de un analizador
sintáctico
 Tipos de analizadores sintácticos

Elizabeth Reinoso: [email protected]
Introducción

Función
 Comprobar el orden en que llegan los


tokens
Construir una representación del programa
fuente
Si es sintacticamente incorrecto generar
error
Siguiente Token()
Fuente
Analizador
Léxico
TOKENS
Analizador
Sintáctico
Tabla de
Símbolo
Elizabeth Reinoso: [email protected]
Introducción

Función principal

El parser es la unidad que guía todo
el proceso, o casi todo, de la
compilación, ya que por un lado va
solicitando al lexer los tokens y al
mismo tiempo va dirigiendo el proceso
de análisis semántico y generación de
código intermedio.
Funcionamiento

Programa
fuente

lexer
Tablas de
símbolos
y de tipos

token
Obtienen un árbol teórico que permite
expresar el orden de los lexemas,
según van apareciendo.
Ese árbol debe ser el modelo de donde
sale el análisis semántico.
Para generar un parser tenemos 2
tecnicas:

Parser


Árbol de
análisis
sintáctico


A manos
Mediante herramientas que lo generan
automáticamente.
Para que un AS funcione debemos
especificar el lenguaje que debe leer
El lenguaje debe ser formal (tener
reglas bien definida)
Estas reglas se llaman gramáticas.
Diseño de gramáticas

Ejemplo
E::=E+T|T
T::=T*F|F
F::=id|F|(E)
Si queremos construir una cadena de tokens que
sean generados por una gramática, podemos
hacerlo aplicando las reglas de la gramática.
Por ejemplo: dada la siguiente gramática:
E::=E+E|E*E|num|id|(E)
Intentaremos derivar el tokens: id1+id2*id3
Por la izq: E::=E*E=>E+E*E=>id1+E*E=>id1+id2*E=>id1+id2*id3
Diseño de Gramaticas

Para construir el árbol sintáctico
E
E
E
id1
+
*
E
id2
E
id3
Dificultades

La recursividad: se expresa por medio
de una o mas reglas no recursivas
que son la base y una o mas regla
que son recursivas y que permite
hacer crecer la estructura del lenguaje
aplicándose así misma una y otra vez
A::=aAb
Dificultades


La ambigüedad: cuando una gramática
contiene una cadena para la que hay
mas de un árbol de análisis sintáctico se
dice que es ambigua.
Debido a que una gramática de estas
característica permite que a partir del
mismo código fuente se puedan obtener
diferentes códigos intermedios, no es
valida para construir un compilador.
Dificultades
 La ambigüedad
Si una gramática tiene alguna de estas característica
podremos afirmar que es ambigua
Gramatica con ciclo: S::=A|S::=a|A::=S
 Gramatica con alguna regla de la forma: E::=E…..E
 Gramatica que ofrezcan caminos alternativos
S::=B|S::=C|B::=C
 Producciones recursivas en las que las variables no
recursivas de la produccion puedan derivar a la cadena
vacia
S::=ABS|S::=s|A::=a|λ|B::=b|a|λ

Dificultades

La asociatividad: es cuando se operan tres o
mas operandos
Por ejemplo:6/3/2, si el operador tiene asociatividad por
la izquierda, primero se opera 6/3 y el resultado con /2

La precedencia: indica el orden en el que se
aplicara respecto a los demas operadores en
caso de poder aplicar mas de uno. Es decir si
en una regla podemos aplicar mas de un
operador, comenzaremos aplicando el de mas
precedencia y terminaremos por aplicar el de
menor precedencia
Dificultades

La parentizacion: incluir paréntesis a
la hora de evaluar expresiones en una
gramática, se añade una variable que
produzca expresiones entre
paréntesis. Los operandos se ponen a
la mayor distancia posible del símbolo
inicial (porque tiene la mayor
precedencia)
Análisis Sintáctico Lineal


Hay varios algoritmos de análisis sintáctico
(incluso para gramáticas ambiguas), pero su
coste computacional es elevado. Si se
consigue eliminar la ambigüedad, podemos
utilizar 2 estrategias:
Análisis descendentes: partimos de la raíz del
árbol sintáctico y aplicamos las reglas por la
izquierda (LL(k))
Análisis ascendentes: partimos de la cadena de
entrada y construimos el árbol a partir de las
hojas para llegar a la raíz (LR(k))
Tipos de Analizadores
Descendentes
LL(1)
Es predictivo, solo necesita un componente léxico
Se aplica las producciones de izquierda
Orden de lectura de la entrada de izquierda a derecha
Analizadores
Sintácticos
SLR (1)
Ascendentes
LR (1)
LALR (1)
Diagrama de Sintaxis
Son grafos dirigidos donde los
elementos no terminales de la
gramática aparecen como rectángulos
y los terminales como círculos o
elipses
 Todo diagrama de sintaxis se supone
que tiene un origen y un destino
aunque no se dibujan.

Diagrama de sintaxis

Correspondencia entre la notación
BNF y los diagramas de sintaxis.
BNF
AB
A|B
Diagrama de sintaxis
A
B
A
B
A|λ
A
Diagrama de Sintaxis
BNF
Diagrama de sintaxis
(A)*
A
(A)+
A
Ejemplos

Secuencia::=(sentencia “;”)+
Sentencia

;
Sentencia::=identificador “=“ Numero
Ejercicios

Diseñar una gramática no ambigua para
el lenguaje de las expresiones que se
pueden construir con true y false y los
operadores booleanos or, and, not y
paréntesis. La precedencia de mayor o
menor es not and or los dos últimos son
asociativos por la derecha
Ejercicios

Crear los diagramas de sintaxis para
esta gramática:
Programa::=Declaraciones Sentencias
Declaraciones::=(Decl “;”)+
Decl::=Entero Identificador
Sentencia::=(Asignacion “;”)+
Asignacion::=ParteIzq “=“ ParteDer
ParteIzq::=Identificador
ParteDer::=Expresion
Expresion::=(Expresion “+” Expresion)|(Expresion “-” Expresion)
Expresion::= (Identificador | Numero)