Se muestra el analisis de una opcion a seguir cuando se desea realizar un analizador sintactico.
Este manual sencillo se baso en el libro:
========================================================
VER EL LIBRO COMPLETO Y DESCARGA
http://www.scribd.com/doc/153507389/Compiladores-Principios-Tecnicas-y-Herramientas-Dragon-Book
====================================================
2. En esta guía solo nos enfocaremos en la realización de la parte de analizado sintáctico.
En la compilación el análisis consta de tres fases:
1. Análisis lineal: en el que la cadena de caracteres que constituye el programa fuente se lee
de izquierda a derecha y se agrupa en componentes léxicos, que son secuencias de
caracteres que tienen un significado colectivo.
2. Análisis jerárquico: en el que los caracteres o los componentes léxicos se agrupan
jerárquicamente en colecciones anidadas con un significado colectivo.
3. Análisis semántico: en el que se realizan ciertas revisiones para asegurar que los
componentes de un programa se ajustan de un modo significativo.
Análisis léxico
En un compilador, el análisis lineal se llama análisis léxico. Por ejemplo, en el análisis léxico los
caracteres de la proposición de asignación:
posición := inicial + velocidad * 60 )
el analizado léxico se encarga de identificar las cadenas e identificarlas como componentes léxicos
o cadenas erróneas lexicalmente construyendo una tabla de simbolos, el analizado léxico para la
sentencia anterior arrojaría los siguiente información:
NOTA*: Los valores numéricos son ejemplo de lo que un analizador léxico le arroja al analizador
sintáctico:
Valor Numérico Ejemplo
(Lo arroja el analizador lexico)
Lexema
(Cadena que representa al
token)
Gramema
(Significado de la cadena o token
identificado)
100 Posición Identificador
150 := Operador asignación
100 inicial Identificador
151 + Operador aritmético suma
100 Velocidad Identificador
152 * Operador aritmético multiplicación
101 60 Cadena numérica
165 ) Operador “Paréntesis que cierra”
Se preguntaran ¿para qué el analizador léxico define números para las sentencias que lee?
Bueno tienes varias razones pero la principal razón que es más óptimo trabajar con números que
15. Una vez elaborados los PRIMEROS, vamos a realizar los SIGUIENTES:
Como ejemplo utilizaremos las primeras 11 reglas de sintaxis:
0. < MODULO > → Programa id ; < CUERPO > .
1. < CUERPO > → < DECLARACIONES > < PRINCIPAL >
2. < DECLARACIONES > → Variable < L_I_A >
3. < L_I_A > → < LISTA DE IDENTIFICADORES > : < TIPOS > ; < L_I_A_AUX >
4. < L_I_A_AUX > →
5. < L_I_A_AUX > → < L_I_A >
6. < LISTA DE IDENTIFICADORES > → id < Id_AUX >
7. < Id_AUX > →
8. < Id_AUX > → , < LISTA DE IDENTIFICADORES >
9. < TIPOS > → < ESTANDAR >
10. < TIPOS > → < VECTORES >
Solo nos vamos a enfocar en los elementos no terminales de la izquierda (son los que están < >):
< MODULO > → Programa id ; < CUERPO > .
Ahora buscamos < MODULO > que es el símbolo inicial en el lado derecho de las reglas de
producción, observamos que en ninguna de las 80 reglas de producción existe este elemento no
terminal en el lado derecho por lo cual, deducimos que:
FO(< MODULO >) = { $ }
El SIGUIENTE de < MODULO > es fin de archivo representado por $, por la deducción anterior y por
definición:
18. Continuando con la siguiente regla:
8. < Id_AUX > →
9. < Id_AUX > → , < LISTA DE IDENTIFICADORES >
Buscamos en el lado derecho de las reglas de producción y lo encontramos en:
7. < LISTA DE IDENTIFICADORES > → id < Id_AUX >
Observamos que no tiene elementos después de < Id_AUX > entonces, el SIGUIENTE de < Id_AUX
>, es el SIGUIENTE de < LISTA DE IDENTIFICADORES >. Y como ya lo realizamos, entonces:
FO(< Id_AUX >) = { : }
Las siguientes reglas:
10. < TIPOS > → < ESTANDAR >
11. < TIPOS > → < VECTORES >
Buscamos en el lado derecho de las reglas de producción y lo encontramos en:
4. < L_I_A > → < LISTA DE IDENTIFICADORES > : < TIPOS > ; < L_I_A_AUX >
Observamos que el SIGUIENTE de < TIPOS > es ; , entonces:
FO(< TIPOS >) = { ; }
Las siguientes reglas:
12. < ESTANDAR > → enteros
13. < ESTANDAR > → Real
14. < ESTANDAR > → cadena
15. < ESTANDAR > → Booleano
16. < ESTANDAR > → Caracter
17. < ESTANDAR > → Byte
Buscamos en el lado derecho de las reglas de producción y lo encontramos en:
18. < VECTORES > → Arreglo [ < C_E_A > ] de < ESTANDAR >
Deducimos que el SIGUIENTE de < ESTANDAR > es el SIGUIENTE de < VECTORES >, buscamos y
encontramos: