Title: Presentaci
1Compiladores e intérpretes Análisis Sintáctico
I Profesor Eridan Otto
2Análisis Sintáctico I
- Introducción
- Tipos de análisis sintáctico
3Compiladores e intérpretes
Análisis sintáctico I Introducción
- Cada lenguaje de programación tiene reglas que
determinan la estructura sintáctica que indica la
correcta formación de los mismos. - La sintaxis de un lenguaje de programación puede
ser descrita por gramáticas libres de contexto o
notación BNF (Bakus-Naur Form) - Ventajas de usar gramáticas
- Son especificaciones sintácticas precisas de los
lenguajes - Fáciles de comprender
- Para algunas clases de gramáticas se puede
construir un parser automáticamente - El proceso de construcción de un abalizador
sintáctico puede llevar a descubrir ambigüedades - Una gramática bien diseñada, imparte estructura
al lenguaje de programación, siendo más fácil
generar código y detectar errores. - Los lenguajes evolucionan en el tiempo, una
gramática bien definida permite ampliar o
modificar más fácilmente el lenguaje y la
implementación de su compliador
4Compiladores e intérpretes
Análisis sintáctico I Introducción
- Funciones
- Comprobar que los componentes léxicos entregados
por el analizador léxico, cumple con las reglas
de la gramática. - Reporte de errores de sintaxis y recuperación de
los mismos, de manera que reporte la mayor
cantidas posible de errores - Generar el árbol sintáctico par la próxima fase
de compilación.
Manejo de Errores
Componente léxico
Analizador léxico
Programa Fuente
Analizador sintáctico
Arbol sintáctico
Obtener otro
Componente léxico
Tabla de Símbolos
5Compiladores e intérpretes
Análisis sintáctico I Tipos
- Tres tipos generales de analizadores sintácticos.
- Métodos universales Cocke-Younger-Kasami y
Early - Sirven para cualquier gramática
- Son ineficientes para su uso en lenguajes reales
- Descendentes (TOP-DOWN)
- Construyen el árbol de análisis sintáctico de
arriba (No terminal inicial) hacia abajo
(terminales), todos los analizadores de este tipo
reconocen un subconjunto de gramáticas - Analizadores descendentes recursivos
- Analizadores LL(1) con tabla (PDA determinista)
- Ascendentes (BOTTOM-UP)
- Construyen el árbol de análisis sintáctico de
abajo hacia arriba, tampoco son capaces de
reconocer todas las GLC - Analizadores de precedencia de operador
- Analizadores LR(1)
6Compiladores e intérpretes
Análisis sintáctico I Tipos
- Tanto para el análisis descendente como para el
ascendente - La entrada se examina de izquierda a derecha, un
símbolo cada vez - Se trabaja con subclases de gramática
- En general las gramáticas serán LL y LR
- LL(K) es subconjunto de LR(k)
- En la práctica sólo seutilizan LL(1) y LR(1)
- Muchos compiladores se denomina parse diriven,
debido a que la fáse sintáctica es muy relevante
y va dirigiendo al analizador léxico. - Al igual que con los analizadores léxicos existen
herramientas para generar automáticamente
analizadores sintácticos como YACC y Bison.
7Compiladores e intérpretes
Análisis sintáctico I Tipos
- Descendente (visión general)
- Algoritmo
- Símbolo inicial de la gramática, debe ubicarse
como raiz del árbol de derivación. - Hata que sólo hayan símbolos terminales, derivar
por la izquierda. - Ejemplo
- Gramática de expresiones
- EXPRESION EXPRESION TERMINO
EXPRESION TERMINO TERMINO - TERMINO Id Numero
- Entrada Id Id Id
- Derivación
- EXPRESION ? EXPRESION TERMINO ?
- EXPRESION
TERMINO TERMINO ? - TERMINO TERMINO
TERMINO ? - Id TERMINO TERMINO ?
- Id Id TERMINO ?
- Id Id Id
8Compiladores e intérpretes
Análisis sintáctico I Tipos
- Ascendente (visión general)
- DefiniciónPivote
- Secuencia más larga de símbolos (Terminales y No
Terminales) en la parte más izquierda de la
entrada que se puede encontrar en la parte
derecha de una producción y tal que los símbolos
a su derecha son terminales. - Ejemplo para la gramatica de expersiones
anterior - Si la entrada es EXPRESION TERMINO Id
- El pivote es EXPRESION TERMINO
- Algoritmo
- Empezar con la cadena de entrada
- Intentar llegar hasta el símbolo inicial,
encontrando en cada paso un pivote y reduciéndolo
con el no terminal de la producción
correspondiente. - Ejemplo Id Id Id? TERMINO Id Id ?
EXPRESION Id Id ? EXPRESION TERMINO
Id ? EXPRESION Id ? EXPRESION TERMINO ?
EXPRESION -
9Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Descendentes
- Más de una opción A con el mismo
terminal o secuencia de terminales como primeros
símbolo de cada producción - Esto implica que el analizador debe poder
retroceder (Backtracking) - Analizar varios elementos de la entrada hacia
delante. - Recursividad izquierda
- Eliminación de la recursividad
- Ambigüedad
- Factorización por la izquierda
- Ascendentes
- Más de una opción A y es el
pivote - Otros
- Problemas semánticos
10Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Recursividad Izquierda en un paso, caso una
producción simple - Se produce cuando una producción tiene la forma
- A A
- Se resuelve transformando la producción o regla
de derivación original en dos reglas - A
- A
- Ejemplo Considere la gramática de expresiones
siguiente y elimine su recursividad izquierda - E ETT
- T T FF
- F (E) Id, aplicando la regla anterior
la gramática queda - E TE
- E TE
- T FT
- T FT
- F (E) Id
11Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Recursividad Izquierda en un paso, caso múltiples
producciones - Se produce cuando una producción tiene la forma
- A
- Se resuelve transformando la producción o regla
de derivación original en dos reglas - A
- A
- Ejemplo Considere la gramática de expresiones
siguiente y elimine su recursividad izquierda - EXPRESION EXPRESION TERMINO EXPRESION
TERMINO TERMINO - aplicando la regla anterior, las producciones
quedan - EXPRESION TERMINO A
- A TERMINO A
TERMINOA
12Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Una gramática es recursiva por la izquierda si
tiene un no terminal tal que exista una
derivación A para alguna cadena - Ejemplo
- S Aa b
- A Ac Sd
- El no terminal S es recursivo en más de un paso
S -gt Aa -gt Sda - El siguiente algoritmo elimina sistemáticamente
la recursividad izquierda de una gramática - Disponer de los símbolos no términales en algún
orden - For i1 to n
- For j1 to i-1
- - Reemplazar cada producción
por -
- donde
son todas las producciones de -
- - Eliminar recursividad izquierda
de las
Este algoritmo está asegurado cuando en la
gramática no existen ciclos (derivaciones que
llevan exactamente al mismo no terminal) ni
producciones
13Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Para el ejemplo, la producción epsilon no afecta
el resultado. - Se ordena S, A. Para i1 no sucede nada y
tampoco hay recursividad izquierda en las
producciones de S. - Para i 2, se sustituyen las producciones de S
(j1) en ASd obteniendo - A Ac Aad
bd - Eliminando la recursividad inmediata
- S Aa b
- A bdAA
- A cAadA
14Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Factorización por la izquierda
- La idea básica, es que cuando no está claro cuál,
entre dos producciones alternativas usar para
expandir un no terminal A , se deben re escribir
las producciones de A para diferir la decisión
hasta que el analizador haya procesado suficiente
entrada como para hacer la elección correcta. - Ejemplo
- sent IF expr THEN sent ELSE sent
- IF expr THEN sent
- REPEAT sent UNTIL expr
- REPEAT sent FOREVER
- Algoritmo , deja gramática factorizada por la
izquierda - Para cada noterminal A, encuentre el prefijo
común a dos o más alternativas de la forma
donde
representa todas las alternativas que no
comienzan con , por -
-
- Aquí A es un nuevo no terminal. Aplicar
repetidamente esta transformación hasta que no
existan dos alternativas para un no terminal con
el mismo prefijo.
15Compiladores e intérpretes
Análisis sintáctico I Problemas del AS
- Para el ejemplo, se deben corregir los IF THEN y
REPEAT. Aplicando el algoritmo las producciones
quedan - sent IF expr THEN sentA1
- REPEAT sentA2
- A1ELSE sent
- A2UNTIL expr FOREVER
-