You are on page 1of 31

INGENIERIA EN SISTEMAS COMPUTACIONALES

Programación de Sistemas
Unidad 2

Mtro. Ernesto Silva Mendoza


Unidad 2. Analizadores: Lexico, sintactico y
semantico
2.1 Analisis lexico

2.2 Análisis sintáctico

2.3 Analisis semantico


Analizadores
Los ordenadores son una mezcla equilibrada
de Software y Hardware

Analizador
Los compiladores son programas de
Léxico, computadora que traducen de un lenguaje a
otro un lenguaje escrito en lenguaje fuente y
Sintáctico y produce un programa equivalente escrito en
lenguaje objeto

Semántico
Un compilador se compone internamente de
varias etapas o faces que realizan operaciones
lógicas y estas son
• Es la primera fase de un compilador
• También llamad scanner tiene las funciones de leer el
programa fuente como un archivo de caracteres y dividirlo en
tokens.
• Los tokens son las palabras reservadas de un lenguaje,
secuencia de caracteres que representa una unidad de
información en el programa fuente
Analizador
léxico
Analizador
Lexico
• Eliminar los comentarios del programa.
• Eliminar espacios en blanco, tabuladores, retorno de
carro, etc, y en general, todo aquello que carezca de
significado según la sintaxis del lenguaje.
• Reconocer los identificadores de usuario, números,
Otras palabras reservadas del lenguaje, ..., y tratarlos
correctamente con respecto a la tabla de símbolos (solo
funciones que en los casos que debe de tratar con la tabla de símbolos).
• Llevar la cuenta del número de línea por la que va
realiza : leyendo, por si se produce algún error, dar información
sobre donde se ha producido.
• Avisar de errores léxicos. Por ejemplo, si @ no pertenece
al lenguaje, avisar de un error.
• Puede hacer funciones de preprocesador.
• Los componentes léxicos influyen en las decisiones del
análisis sintáctico y los atributos en la traducción de los
componentes léxicos
• En la práctica, los componentes léxicos suelen tener un
solo atributo -un apuntador a la entrada de la tabla de
símbolos donde se guarda la información sobre el
Atributos de componente léxico.
• Ejemplo 3.1. Los componentes léxicos y los valores de
los atributos asociados para la proposición de FORTRAN.
• E = M * e ** 2
Componentes •

Se escriben a continuación como una secuencia de parejas:
< id, apuntador a la entrada de la tabla de símbolos para E>
• < op_asign. >
Léxicos •

< id, apuntador a la entrada de la tabla de símbolos para M>
< op-mult,>
• < id. apuntador a la entrada de la tabla de si m bolos para e>
• < op_exp, >
• < núm. valor entero 2 >
Necesidad del analizador léxico

• El análisis léxico del


análisis sintáctico a
menudo permite
simplificar una u otra de
dichas fases.
• El analizador léxico nos
permite simplificar el
analizador sintáctico.
Unidades
sintácticas
de un
lenguaje
ejemplo.
• Tabla de símbolos es una importante estructura de datos
creada y mantenida por los compiladores con el fin de
almacenar información acerca de la ocurrencia de diversas
entidades, tales como nombres de variables, nombres de
funciones, objetos, clases, interfaces, etc. tabla de símbolos se
utiliza en el análisis y la síntesis de un compilador.
• Una tabla de símbolos es simplemente una tabla que puede
Creación de ser lineal o una tabla hash.

tablas de
Simbolos
Manejo de Errores
lexicos
• Son pocos los errores simplemente en el nivel léxico ya que tiene una visión muy
restringida de un programa fuente. El analizador léxico debe devolver el componente
léxico de un identificador y dejar a otra fase se ocupe de los errores.


Suponga que una situación en la cual el analizador léxico no puede continuar por que
ninguno de los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de
recuperación más sencilla sea recuperación “EN MODO PANICO” (este método de
recuperación es donde se borra caracteres sucesivos de la entrada hasta que el
analizador léxico pueda encontrar un componente léxico bien formado). ¡¡Los
programas no siempre son correctos!!


El compilador tiene que:

• Reportar clara y exactamente la presencia de errores

• Recuperarse de cada error lo suficientemete rápido para poder detectar errores


subsiguientes:

• Tratar de evitar mensajes falsos de error

• Un error que produce un token erroneo

• Errores léxicos posibles


Generación de códigos lexicos: LEX Y FLEX

LEX: es un programa para generar analizadores léxicos (en inglés scanners o lexers).

Lex se utiliza comúnmente con el programa yacc que se utiliza para generar análisis sintáctico. Lex, escrito
originalmente por Eric Schmidt y Mike Lesk, es el analizador léxico estándar en los sistemas Unix, y se incluye en el
estándar de POSIX. Lex toma como entrada una especificación de analizador léxico y devuelve como salida el
codigo fuente implementando el analizador léxico en C.

Aunque tradicionalmente se trata de software propietario, existen versiones libres de lex basadas en el código
originalde AT&T en sistemas como OpenSolaris y Plan 9 de los laboratorios Bell. Otra versión popular de software
libre de lex es Flex.
Analizador Sintáctico
• Es la fase del analizador que se encarga
de chequear el texto de entrada en base
a una gramática dada.
• También conocidos como Parseadores
(parser)
• Y en caso de que el programa de entrada
sea válido, suministra el árbol sintáctico
que lo reconoce.
• En la práctica, el analizador sintáctico
también hace:
• Acceder a la tabla de símbolos
(para hacer parte del trabajo del
analizador semántico).
• Chequeo de tipos (del analizador
semántico).
• Generar código intermedio
• Generar errores cuando se
producen
Análisis Sintáctico Según su
tipo
• Top-Down Parsing
• Parte del axioma de la gramática.
• Procesa la entrada de izquierda a derecha.
• Bottom-Up Parsing
• Parte desde los tokens hacia el axioma
inicial.
• Disminuye la cantidad de reglas aplicadas
Análisis semántico: Componentes

• Un componente importante del análisis semántico es la verificación


de tipos.
• El compilador verifica si cada operador tiene operandos permitidos
por la especificación del lenguaje fuente.
• Por ejemplo, las definiciones de muchos lenguajes de programación
requieren que el compilador indique un error cada vez que se use un número
real como índice de una matriz. Sin embargo, la especificación del lenguaje
puede permitir ciertas coerciones a los operandos, por ejemplo, cuando un
operador aritmético binario se aplica a un número entero y a un número real.
En este caso, el compilador puede necesitar convertir el número entero a
real.
• Con las reglas de la gramática que se presenta a continuación
dará lugar al árbol sintáctico.
• El árbol sintético se construye con un conjunto de reglas
conocido como gramática y que definen con total precisión el
Analizador lenguaje fuente.

Sintáctico:
Representación
de sus
componentes
• Los errores que puede detectar el analizador
sintáctico son aquellos que violan las reglas de una
gramática independiente del contexto. Ya hemos
mencionado que algunas de las características de un
lenguaje de programación no pueden enunciarse
con reglas independientes del contexto, ya que
dependen de él; por ejemplo, la restricción de que
Errores los identificadores deben declararse previamente.
Por lo tanto, los principales errores semánticos son:
• Conversiones de tipos no permitidas
• int x;
• x = 4.32;
• Si el lenguaje Li generado por la gramática i entonces se
cumple que

Gramáticas
• Especificación para la estructura sintáctica de un lenguaje de
programación, muy similar a la estructura léxica.
• Se define a través de Reglas Gramaticales RG

Gramática
Libre de
Contexto
• RG
exp → exp op exp | (exp) | número
Derivación op → + | - | *
• EJEMPLO:
(34-3) * 42
Árbol de
Análisis
Sintáctico
• El análisis semántico dota de un significado coherente a lo
que hemos hecho en el análisis sintáctico.
• El chequeo semántico se encarga de que los tipos que
intervienen en las expresiones sean compatibles o que
los parámetros reales de una función sean coherentes con
los parámetros formales
Analizador • Funciones principales

semántico • Identificar cada tipo de instrucción y sus componentes


• Completar la Tabla de Símbolos
• Realizar distintas comprobaciones y validaciones
• Comprobaciones de tipos.
• Comprobaciones del flujo de control.
• Comprobaciones de unicidad.
• Comprobaciones de emparejamiento.
La tarea del compilador requiere la extracción del contenido semántico
incluido en las distintas sentencias del programa.

Es por esto que se hace necesario dotar al compilador de una serie de


rutinas auxiliares que permitan captar todo aquello que no se ha

Concepto de expresado mediante la sintaxis del lenguaje y todo aquello que hace
descender a nuestro lenguaje de programación de las alturas de una
máquina abstracta hasta el nivel de un computador real.
analizador
El análisis semántico completa las dos fases anteriores de análisis
semántico lexicográfico y sintáctico incorporando ciertas comprobaciones que no
pueden asimilarse al mero reconocimiento de una cadena dentro de un
lenguaje.

La fase de análisis semántico revisa el programa fuente para tratar de


encontrar errores semánticos y reúne la información sobre los tipos para
la fase posterior de generación de código
Componentes

• Un componente
importante del análisis
semántico es la
Verificación de Tipos.
• Aquí, el compilador verifica
si cada operador tiene
operandos permitidos por
la especificación del
lenguaje fuente
Representación
de sus
componentes
Ejemplo:
• Se está compilando el
siguiente programa,
escrito en un lenguaje de
programación ficticio,
cuya sintaxis resultará fácil
de comprender para
cualquier programador:
Análisis semántico y generación de código
• Compiladores de un solo paso: integran la
generación de código con el análisis semántico.
Estos compiladores generan directamente el
código a partir del árbol de la derivación. En este
caso, las llamadas a las rutinas que escriben el
código ensamblador suelen entremezclarse con
el análisis semántico.
• Compiladores de dos o más pasos: en el primer
paso de la compilación, el analizador semántico
genera un código abstracto denominado código
intermedio. En un segundo paso se realiza la
generación del código definitivo a partir del
código intermedio. A veces se separa también la
optimización de código, la cual se realiza en un
tercer paso independiente.
Sintaxis/Semántica

• Sintaxis
• Conjunto de reglas formales que
especifican la estructura de los
programas pertenecientes a dicho
lenguaje

• Semántica
• Conjunto de reglas que especifican el
significado de cualquier sentencia
sintácticamente válida
• Ejemplos de comprobación semántica
Int z
Char j
z=1+2*j+4
Ejemplos de • ERROR:

comprobación Identificador no declarado: j en línea 1 Columna 13


variable j.

semántica J = 1+ verdadero
• ERROR:
Se esperaba un valor de tipo numérico o
cadena tras el operador: + en la línea 2
Columna 7
Bilbiografia.

• Daniel-C Yañez. (2017). Compiladores. 19/01/2019, de Blogger. Blog Personal Sitio web:
http://estructuradec0ntrol.blogspot.com/2017/02/analizador-lexico-sintactico-y-semantico.html
• Germania Rodriguez. (2011). Automatas y compiladores analisis sintactico. 19/01/2019, de LinkedIn
Corporation Sitio web: https://es.slideshare.net/grrodriguez/automatas-y-compiladores-analisis-sintactico
• Infomania pro. (2016). Aanalisis semantico. 19/01/2019, de LinkedIn Corporation Sitio web:
https://es.slideshare.net/Infomaniapro/unidad4-analisissemantico
• Alfonseca Moreno, M.; De la Cruz Echendia, M.; Ortega De la Fuente, A.;
Pulido Cañabate, E.. (2006). Compiladores e interpretes: teoría y práctica.
Madrid: Pearseon Education.

You might also like