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)