You are on page 1of 8

INSTITUTO TECNOLOGICO DE POCHUTLA

INTEGRANTES:

Oliver Canseco Vázquez.

Abelardo Gutiérrez López

Oliver Pérez Carmona.

Daniel Ramírez Martínez

ING EN SISTEMAS COMPUTACIONALES

6TO SEMESTRE.

LENGUAJES Y AUTÓMATAS 1
Alfabetos, cadenas y lenguajes:

Un alfabeto es un conjunto finito no vacío cuyos elementos se llaman símbolos.


Denotamos un alfabeto arbitrario con la letra Σ.
Es un conjunto finito A. Sus elementos se llamaran símbolos o letras.

Ejemplo 1 Binario: A={0,1} es un alfabeto con símbolo 0 y 1.


Ejemplo 2 Binario: B={<0,0>,<0,1>,<1,0>,<1,1>} con símbolos <0,0>,<0,1>,<1,0>,<1,1>
en este caso no hay que confundir los símbolo.
Una cadena o palabra sobre un alfabeto Σ es cualquier sucesión finita de elementos de
Σ. Admitimos la existencia de una ´única cadena que no tiene símbolos, La cual se
denomina cadena vacía y se denota con λ. La cadena vacía desempeña, En la teoría de
lenguajes formales, un papel similar al que desempeña el conjunto vacío ∅ en la teoría de
conjuntos.

Tipos de cadenas:
Cadena de caracteres: que también se denomina en ocasiones palabra, es una secuencia
finita de símbolos seleccionados de algún alfabeto.
Cadena vacía: Es aquella cadena que representa cero apariciones de símbolos. Esta
cadena, esta designada por ɛ , | ɛ|= 0, es una cadena que puede construirse en cualquier
alfabeto.

Ejemplo:
Sea Σ = {a, b} el alfabeto que consta de los dos símbolos a y b. Las
Siguientes son cadenas sobre Σ:
Aba
Ababaaa
Aaaab.
Obsérvese que aba 6= aab. El orden de los símbolos en una cadena es significativo Ya que
las cadenas se definen como sucesiones, es decir, conjuntos secuencialmente Ordenados.
Ejemplo:
Ejemplo El alfabeto Σ = {0, 1} se conoce como alfabeto binario. Las cadenas sobre este
alfabeto son secuencias finitas de ceros y unos, llamadas Secuencias binarias, tales como
001
1011
001000001.

Lenguaje.
El lenguaje L de cadenas del alfabeto {a,b} en donde cada cadena comienza con una a
y tiene longitud par. Las cadenas aa, ab, aaaa, abbb, abab, abbbaaba, forman parte de ese
lenguaje.
Tipos de lenguajes:
Lenguaje natural (castellano)
Nosotros estamos relacionados con el concepto tradicional de gramática que, de esta forma
intuitiva, podemos considerar un conjunto de reglas el cual nos indican que es correcto y
que no lo es del, lenguaje natural. Con este fin podemos acércanos a la definición más clara
y formal de la lengua castellana.

Lenguaje artificial.
En este lenguaje aplicamos el mismo método en el cual definimos un fragmento del
lenguaje de programación. Donde pretendemos describir las instrucciones el cual nos
permite asignar un valor a una expresión ó a una variable en un lenguaje C.
Lenguaje regular.
Llamamos así a los lenguajes porque sus palabras contienen "regularidades" o repeticiones
de los mismos componentes, por ejemplo en este lenguaje L1 = {ab, abab, ababab,
abababab,...} Este ejemplo podemos apreciar las palabras de L1 son solo repeticiones de
"ab" donde se repiten varias veces. Su regularidad consiste en las palabras que contienen
"ab" varias veces.
Ejemplo:
Un conjunto de cadenas, todas ellas seleccionadas de un ∑*, donde ∑ es un determinado
alfabeto, se denomina lenguaje.
Los lenguajes habitualmente pueden interpretarse como conjuntos de cadenas. Un ejemplo
seria el inglés donde la colección de las palabras correctas inglesas es un conjunto de
cadenas del alfabeto que consta de todas las letras.
El lenguaje español consiste que todas la cadenas de palabras que nosotros llamamos
oraciones. No todas las combinaciones de palabras forman oraciones.
Un lenguaje consiste de un subconjunto del conjunto de todas las posibles cadenas que
pueden formar del alfabeto.
Herramientas computadoras ligadas con lenguajes.
Traductor.
Un traductor es un programa que tiene como entrada un texto escrito en un lenguaje
(lenguaje fuente) y como salida produce un texto escrito en un lenguaje (lenguaje objeto)
que preserva el significado de origen.
Ejemplos de traductores son los ensambladores y los compiladores.

Compilador.
El compilador es un programa informático que traduce un programa escrito en lenguaje de
programación y lo pasa a lenguaje de programación, podemos decir que este programa nos
permite traducir un código fuente de un programa en lenguaje de nivel alto, y lo pasmos a
otro nivel inferior (lenguaje maquina).
(Traductor)

Características
El programa se compila una sola vez, pero se puede ejecutar muchas
La ejecución del programa objeto es mucho más rápida que la interpretación de la fuente
El compilador tiene una visión completa del programa, por lo que puede dar una
información más detallada de los errores cometidos por el programador.
Fases:
Ensambladores.
El ensamblador es el programa en que se realiza la tracción de un programa escrito en
ensamblador y lo pasa a lenguaje máquina. Directa o no directa la traducción en que las
instrucciones no son más que instrucciones que ejecuta la computadora.

Interpretes.
Los intérpretes son los que realizan normalmente dos operaciones:
Traducen el código fuente a un formato interno.
Ejecuta o interpretan el programa traducido al formato interno.
Donde la primera pertenece al interprete el cual llama a veces al compilador, así se genera
el código interno, pero no es el lenguaje de máquina, ni lenguaje de símbolos, ni mucho
menos un lenguaje de nivel alto.
ANALISIS LEXICO
Lee la secuencia de caracteres del programa fuente, caracter a caracter, y los
agrupa para formar unidades con significado propio, los componentes léxicos
(Tokens en inglés). Estos componentes léxicos representan: palabras reservadas:
if, While, do, . . . identificadores: asociados a variables, nombres de funciones, tipos
definidos por el usuario, etiquetas, ... Por ejemplo: posición, velocidad, tiempo, . . .
operadores: = * + - / == > < &! = . . . símbolos especiales; ( ) [ ] { } ... constantes
numéricas: literales que representan valores enteros, en coma flotante, etc., 982,
0xF678, -83.2E+2,... constantes de caracteres: literales que representan cadenas
concretas de caracteres, “hola mundo”,... El analizador léxico opera bajo petición
del analizador sintáctico devolviendo un componente léxico conforme el analizador
sintáctico lo va necesitando para avanzar en la gramática. Los componentes léxicos
son los símbolos terminales de la gramática. Suele implementarse como una
subrutina del analizador sintáctico. Cuando recibe la orden obtienen el siguiente
componente léxico, el analizador léxico lee los caracteres de entrada hasta
identificar el siguiente componente léxico.

ANALISIS SINTACTICO
Es la fase del analizador que se encarga de chequear el texto de entrada en base
a una gramática dada. Y en caso de que el programa de entrada sea válido,
suministra el árbol sintáctico que lo reconoce. En teoría, se supone que la salida del
analizador sintáctico es alguna representación del árbol sintáctico que reconoce la
secuencia de Tokens suministrada por el analizador léxico. 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.
En definitiva, realiza casi todas las operaciones de la compilación. Este método de
trabajo da lugar a los métodos de compilación dirigidos por sintaxis.
ANALISIS SEMANTICO
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. En ella se utiliza la estructura jerárquica determinada por la
clase de análisis sintáctico para identificar los operadores y operandos de
expresiones y proposiciones.
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. 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.

GENERADOR DE CODIGO INTERMEDIO


Se puede considerar esta representación intermedia como un programa para una
máquina abstracta. Esta representación intermedia debe tener dos propiedades
importantes; debe ser fácil de producir y fácil de traducir al programa objeto.

La representación intermedia puede tener diversas formas. Una forma intermedia


es la llamada “código de tres direcciones”, que es como el lenguaje ensamblador
para una máquina en la que cada posición de memoria puede actuar como un
registro. El código de tres direcciones consiste en una secuencia de instrucciones,
cada una de las cuales tiene como máximo tres operandos.
OPTIMIZADOR CODIGO INTERMEDIO
Objetivo – Obtener código que se ejecuta más eficientemente según los criterios •
Tiempo de ejecución (optimización temporal) • Espacio de memoria utilizado
(optimización espacial).
Funcionamiento – Revisa el código generado a varios niveles de abstracción y
realiza las optimizaciones aplicables al nivel de abstracción.
Representaciones de código intermedio de más a menos abstractas
– Árbol sintáctico abstracto: optimizar subexpresiones redundantes, reducción de
frecuencia, etc.
– Tuplas o cuádruplas: optimizar en uso de los registros o de las variables
temporales.
–Ensamblador/Código máquina: convertir saltos a saltos cortos, reordenar
instrucciones.
Condiciones que se han de cumplir
– El código optimizado se ha de comportar igual que el código de partida excepto
por ser más rápido u ocupar menos espacio.
– Hay que buscar transformaciones que no modifiquen el comportamiento del
código según el comportamiento definido para el lenguaje de programación.

GENERADOR CODIGO OBJETO


La fase final de un compilador es la generación de código objeto, que por lo general
consiste en código de máquina relocalizable o código ensamblador. Las posiciones
de memoria se seleccionan para cada una de las variables usadas por el programa.
Después, cada una de las instrucciones intermedias se traduce a una secuencia de
instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la
asignación de variables a registros.
El generador de código objeto puede considerarse como la penúltima fase de un
compilador, la cual se encarga de tomar como entrada el código intermedio
generado por el front-end, y producir código objeto de la arquitectura target para
luego entrar en la fase de optimización de código.
Toma como entrada de representación intermedia el programa fuente y produce
como salida un programa objeto equivalente.

You might also like