conceptos de compilador

64
Universidad Metropolitana de Educación Ciencia Y Tecnología. Compiladores. Conceptos de compilador. Un compilador es un programa informático que traduce un programa escrito es un lenguaje de programación a otro lenguaje de programación genera un programa equivalente que la maquina será capaz de interpretar. Un compilador es un programa que permite traducir el código fuente de un programa de lenguaje de alto nivel a otro lenguaje de nivel inferior es típicamente lenguaje de maquina un programador puede diseñar un programa de lenguaje más cercano al ser humano para luego compilar al programa de la computadora. Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y da como salida otro texto en un lenguaje, denominado objeto. Compilador: Es un lenguaje fuente sea un lenguaje de programación de alto nivel y el objeto sea un lenguaje de bajo nivel ensamblador o código de máquina, a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador. Históricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores, pues el programa fuente sin traducir y el intérprete juntos daban una ocupación de memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores personales iban siempre acompañados de un intérprete de BASIC La mejor información sobre los errores por parte del compilador así como una mayor velocidad de ejecución del código resultante hizo que poco a poco se impusieran los compiladores. El proceso de compilador: Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación o lenguaje de máquina. Un traductor se puede necesitar otros programas para crear un programa objeto ejecutable. Es una tarea de reunir programas fuente a menudo se confía un programas distintos y se llama preprocesador. Los preprocesadores también puede que se expande abreviaturas, y se llaman marcos que son proposiciones de lenguaje fuentes. La creación de un programa Urriola. Soto: Ruiz. Página 1

Upload: joel-soto

Post on 29-Jun-2015

592 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Conceptos de compilador.

Un compilador es un programa informático que traduce un programa escrito es un lenguaje de programación a otro lenguaje de programación genera un programa equivalente que la maquina será capaz de interpretar.

Un compilador es un programa que permite traducir el código fuente de un programa de lenguaje de alto nivel a otro lenguaje de nivel inferior es típicamente lenguaje de maquina un programador puede diseñar un programa de lenguaje más cercano al ser humano para luego compilar al programa de la computadora.

Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y da como salida otro texto en un lenguaje, denominado objeto.

Compilador: Es un lenguaje fuente sea un lenguaje de programación de alto nivel y el objeto sea un lenguaje de bajo nivel ensamblador o código de máquina, a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador.

Históricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores, pues el programa fuente sin traducir y el intérprete juntos daban una ocupación de memoria menor que la resultante de los compiladores.

Por ello los primeros ordenadores personales iban siempre acompañados de un intérprete de BASIC La mejor información sobre los errores por parte del compilador así como una mayor velocidad de ejecución del código resultante hizo que poco a poco se impusieran los compiladores.

El proceso de compilador: Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación o lenguaje de máquina. Un traductor se puede necesitar otros programas para crear un programa objeto ejecutable. Es una tarea de reunir programas fuente a menudo se confía un programas distintos y se llama preprocesador.

Los preprocesadores también puede que se expande abreviaturas, y se llaman marcos que son proposiciones de lenguaje fuentes. La creación de un programa ejecutable es un típico de EXE para Microsoft Windows o DOS que conlleva los pasos.

1- Se llama compilación propiamente dicha y traducida los códigos fuentes escritos en un lenguaje de programación que al almacenado en un archivo a código en bajo nivel en código normalmente y directamente a un lenguaje de máquina.

2- Se llama enlazado en el cual se enlaza al códigos de bajo nivel generado de todos los ficheros y subprogramas que se han mandado compilar y se añade el código y las funciones que hay en las bibliotecas de compiladores para que ejecute y se puedan comunicarse con el sistema operativo que traduce así finalmente los códigos objeto a código de máquina.

Urriola.Soto:Ruiz. Página 1

Page 2: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Etapas de procesos.

El proceso de traducción se compone internamente en varias etapas o frases, que realizan distintas operaciones lógicas. Etapas o frases que realizan distintas operaciones lógicas. Estas etapas fases como en piezas separadas dentro del traductor y pueden que en realidad escribirse como operaciones codificadas y separadamente en la práctica a menudo.

Tipos de compiladores.

Un compilador cruzado: Es un compilador capaz de crear código ejecutable para otra plataforma distinta a aquélla en la que él se ejecuta. Esta herramienta es útil cuando quiere compilarse código para una plataforma a la que no se tiene acceso, o cuando es incómodo o imposible compilar en dicha plataforma como en el caso de los sistemas embebidos. Un ejemplo de un compilador con estas posibilidades es el NASM, que puede ensamblar, entre otro formato, ELF para sistemas UNIX y COM para DOS.

Uso de los compiladores cruzados: El uso fundamental de un compilador cruzado es compilar para un entorno diferente en el que se ejecuta el compilador. Esto es muy utilizado en las siguientes situaciones:

Sistemas empotrados, dónde los recursos son extremadamente limitados. Compilación para múltiples máquinas.

Un compilador cruzado cross compiler es aquel que genera código para una plataforma diferente a aquella en la que se ejecuta.

Por ejemplo, supongamos que queremos desarrollar aplicaciones para un teléfono móvil, una PDA o una consola de videojuegos. Normalmente será más cómodo realizar el desarrollo en un PC y luego volcar el código objeto en el dispositivo de destino. En estas situaciones, el compilador que usaremos en el PC es un caso de compilador cruzado.

El sistema operativo Nachos se ejecuta sobre una máquina virtual basada en el procesador MIPS. Los programas de usuario deben estar escritos en código máquina del MIPS. Afortunadamente, no necesitas escribir los programas de usuario en código máquina o en ensamblador, sino que lo puedes hacer en lenguaje C. El compilador cruzado que viene con la instalación de Nachos es capaz de traducir de C a código del MIPS.

El compilador cruzado que distribuimos con el Nachos es una versión del popular compilador GCC. Funciona sobre prácticamente cualquier versión de Linux. Si quieres trabajar en tu propio ordenador, necesitas instalar este compilador.

El lenguaje ensamblador: Es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.

Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos. Un ensamblador crea código objeto traduciendo instrucciones mnemónicas a códigos operativos, e interpretando los nombres simbólicos para direcciones de memoria y otras entidades.

El uso de referencias simbólicas es una característica básica de los ensambladores, evitando tediosos cálculos y direccionamiento manual después de cada modificación del programa. La mayoría de los

Urriola.Soto:Ruiz. Página 2

Page 3: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.ensambladores también incluyen facilidades para crear macros, a fin de generar series de instrucciones cortas que se ejecutan en tiempo real, en lugar de utilizar subrutinas.

Los ensambladores son por lo general más fáciles de programar que los compiladores de lenguajes de alto nivel, y han estado disponibles desde la década de 1950. Los ensambladores modernos, especialmente para arquitecturas basadas en RISC, como por ejemplo MIPS, SPARC y PA-RISC optimizan las instrucciones para explotar al máximo la eficiencia de segmentación del CPU.

Los ensambladores de alto nivel ofrecen posibilidades de abstracción que incluyen:

Control avanzado de estructuras. Procedimientos de alto nivel, declaración de funciones. Tipos de datos que incluyen estructuras, registros, uniones, clases y conjuntos. Sofisticado procesamiento de macros.

Un programa escrito en lenguaje Assembly consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de una computadora.

Auto compilador: Es aquél que está escrito en el mismo lenguaje que se pretende compilar. Supongamos, por ejemplo, que queremos desarrollar la versión 2.0 de un compilador Pascal. Dicho compilador generará un código mucho más rápido y eficiente que el que generaba la versión anterior 1.0.

Sin embargo, son ya muchas las máquinas IBM 370, Serie 1, PDP 11 que disponen del antiguo compilador, o que al menos tienen otro compilador Pascal. La mejor opción consiste en escribir el nuevo compilador en Pascal, ya que así podrá el compilador ser compilado en las distintas máquinas por los compiladores Pascal ya existentes.

Meta compilador: Es un traductor que tiene como entrada la definición de un lenguaje y como salida el compilador para dicho lenguaje2.

Descompilador: Es el que traduce código máquina a lenguaje de alto nivel. Los descompiladores más usuales son los desensambladores, que traducen un programa en lenguaje máquina a otro en ensamblador.

Los compiladores son programas que se encargan de traducir programas escritos por el programador en lenguaje de alto nivel a un lenguaje de bajo nivel que es comprensible por la maquina y que de esta manera, permite que pueda ejecutar por la computadora y transforma el código fuente a un lenguaje de máquina y código objeto.

Para poder entender cómo realizar su tarea es muy conveniente conocer las diversas frases que cumplan un compilador para lograr la traducción. Las primeras tres fases son análisis léxicos, sintáctico y las frases en las que se leen los caracteres del códigos fuentes, también se analizan se comprueban si son validos y se van reagrupando en secuencias lógicas y frases y gramaticales.

Esta primera partes es la que se conoce como Front End, y las últimas tres frases de las síntesis generación de códigos intermedios que optimización de códigos y generación de códigos que a partir del análisis anterior se genera la traducción para convertirlo en código o lenguaje de maquina la segunda parte se denomina Back End.

Permanente el manejados de errores que se encarga de analizar en cada una de las frases posibles de errores que pueden haber durante los procesos de la traducción.

Urriola.Soto:Ruiz. Página 3

Page 4: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Ventajas de compilar frente a interpretar:

Se compila una vez, se ejecuta n veces. En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se traduce tantas

veces una línea como veces se repite el bucle. El compilador tiene una visión global del programa, por lo que la información de mensajes de error es

más detallada. Ventajas del intérprete frente al compilador: Un intérprete necesita menos memoria que un compilador. En principio eran más abundantes dado que

los ordenadores tenían poca memoria. Permiten una mayor interactividad con el código en tiempo de desarrollo.

Funciones de un compilador

Un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente, Hay miles de lenguajes fuente, desde los lenguajes de programación tradicionales, como FORTRAN o Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las áreas de aplicación de la informática.

Los lenguajes objeto son igualmente variados; un lenguaje objeto puede ser otro lenguaje de programación o el lenguaje de máquina de cualquier computador entre un microprocesador y un supercomputador.

Partes en las que trabaja un compilador

Conceptualmente un compilador opera en fases. Cada una de las cuales transforma el programa fuente de una representación en otra. En la práctica se pueden agrupar fases y las representaciones intermedias entres las fases agrupadas no necesitan ser construidas explícitamente

Urriola.Soto:Ruiz. Página 4

Page 5: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Las tres primeras fases, que forman la mayor parte de la porción de análisis de un compilador se analizan en la sección IX. Otras dos actividades, la administración de la tabla se símbolos y el manejo de errores, se muestran en interacción con las seis fases de análisis léxico, análisis sintáctico, análisis semántico, generación de código intermedio, optimación de código y generación de código.

Administrador de la tabla de símbolos.

Una función esencial de un compilador es registrar los identificadores utilizados en el programa fuente y reunir información sobre los distintos atributos de cada identificador. Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador, con los campos para los atributos del identificador.

La estructura de datos permite encontrar rápidamente el registro de cada identificador y almacenar o consultar rápidamente datos en un registro cuando el analizador léxico detecta un identificador en el programa fuente, el identificador se introduce en la tabla de símbolos. Sin embargo, normalmente los atributos de un identificador no se pueden determinar durante el análisis léxico.

Las fases restantes introducen información sobre los identificadores en la tabla de símbolos y después la utilizan de varias formas. Por ejemplo, cuando se está haciendo el análisis semántico y la generación de código intermedio, se necesita saber cuáles son los tipos de los identificadores, para poder comprobar si el programa fuente los usa de una forma válida y así poder generar las operaciones apropiadas con ellos.

El generador de código, por lo general, introduce y utiliza información detallada sobre la memoria asignada a los identificadores.

Urriola.Soto:Ruiz. Página 5

Page 6: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Características de un compilador.

Los programas compiladores se traducen las instrucciones en un lenguaje de alto nivel a instrucciones que las computadoras pueden interpretar y ejecutar cada lenguaje de programación se requieren compiladores separados.

Los compiladores son programas de traducción insertadas en la memoria por los sistemas operativos para convertir programas de computadoras en pulsaciones electrónicas ejecutables de lenguaje de maquinas.

Características de compiladores generalmente un compilador se divide en dos partes:

Front End: Analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Parte que suele ser independiente de la plataforma o sistema operativo para el que funcionará.

Back End: parte en donde se genera el código máquina exclusivo para una plataforma a partir de lo analizado en el Front End.

Por lo general el resultado del Back End no puede ser ejecutado directamente, se necesita pasar por un proceso de enlazado Linker. Existen varios tipos de compiladores: Compiladores cruzados, Compiladores optimizadores, Compiladores de una sola pasada, Compiladores de varias pasadas, Compiladores JIT Just In Time.

Los compiladores pueden ser de:

una sola pasada: examina el código fuente una vez, generando el código o programa objeto. pasadas múltiples: requieren pasos intermedios para producir un código en otro lenguaje, y una

pasada final para producir y optimizar el código producido durante los pasos anteriores. Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el

programa. Compiladores incrementales: generan un código objeto instrucción por instrucción una vez en

hacerlo para todo el programa cuando el usuario teclea cada orden individual. Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla. Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que

se está utilizando para compilar. Es perfectamente normal construir un compilador de Pascal que genere código para MS-DOS y que el compilador funcione en Linux y se haya escrito en C++.

Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos.

Auto compilador: compilador que está escrito en el mismo lenguaje que va a compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al lenguaje, mejorar el código generado, etc.

Meta compilador: es sinónimo de compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los meta compiladores se encuentra con la dificultad de unir la generación de código con la parte de análisis.

Urriola.Soto:Ruiz. Página 6

Page 7: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores. Descompilador: es un programa que acepta como entrada código máquina y lo traduce a un

lenguaje de alto nivel, realizando el proceso inverso a la compilación.

Compiladores en sí que se entiendan.

Compiladores que se entiendan se manejan todo igual o quizás confundís el Front End con lo que en realidad es el compilador es la interfaz visual que se encarga de reconocer sintaxis, colorearte las palabras del lenguaje, y hacer que compilar sea tan fácil como hacer click en un botón.

El compilador es binario y ejecutable que pasándole como parámetros los archivos que quiere compilar te los transforma en un .EXE o binario de Linux o ejecutable de Mac o etc.

Ejemplo:gcc text.c -o TestEso te compila el text.c y te los transforma en un ejecutable.

El Free Pascal como el Borland C menor al 5 y el Turbo Pascal. Viene con un IDE por defecto que es esa cosa horrible con onda DOS.

Si te bajas el GCC o el Borland C 5.5. Ambos vienen sin IDE es decir interfaz visual. Tendrías que bajaste algún IDE que use alguno de estos compiladores. Por ejemplo Free C, Eclipse C++, Visual C, etc. Un lenguaje de programación permite al usuario crear programas que serán entendidos por el ordenador directa o indirectamente con el objetivo de realizar alguna tarea.

Urriola.Soto:Ruiz. Página 7

Page 8: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Ensamblador anexan todo lo que hicimos.

;Programa cadenas.ens;;Lectura de dos cadenas, concatenar y dar la vuelta;El programa pide al usuario que introduzca dos cadenas cualesquiera;A continuacion, las concatena, y muestra el resultado en pantalla al;derecho y al reves

;leer cadena1wrstr /mens1instr /cadena1;leer cadena2wrstr /mens2instr /cadena2;concatenarmove #cadena1,.r1move #cadena2,.r2move #resu1,.r0move #resu2,.r3

cad1: cmp [.r1],#0bz $cad2move [.r1],[.r0]inc .r0inc .r1br $cad1

cad2: cmp [.r2],#0bz $finmove [.r2],[.r0]inc .r0inc .r2br $cad2

fin: move #0,[.r0];mostrar al derechowrstr /derechowrstr /resu1wrstr /eol;mostrar al revescmp .r0,#resu1bz $fin2

rev: dec .r0cmp [.r0],#0bz $fin2move [.r0],[.r3]inc .r3br $rev

fin2: move #0,[.r3]wrstr /reveswrstr /resu2

Urriola.Soto:Ruiz. Página 8

Page 9: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.wrstr /eolhalt;cadenas

mens1: data "Introduzca la primera cadena: "mens2: data "Introduzca la segunda cadena: "derecho:data "Cadena al derecho: "reves: data "Cadena al reves: "eol: data "\n"cadena1:res 500cadena2:res 500resu1: res 1000resu2: res 1000

end

Programa fact.ens

;El programa pide un entero, y a continuacion calcula el factorial y;lo muestra en pantalla.;Es necesario que la pila este configurada hacia direcciones decrecientes,;si no el ejemplo no funcionara correctamente.

; coloco el puntero de pila en la cima de la memoriamove #32767,.sp

; Escribo un mensaje y solicito un numerowrstr /UN_NUMEROinint .r1

; preparo el argumento de la funcion y la llamopush .r1call /SUB_FACT

; recupero el valor y lo trato segun lo que devolviopop .r2cmp .r2,#0bn /ERRORwrstr /EL_FACT_ESwrint .r2halt

ERROR: cmp .r2, #COD_NEGATIVObz /ERROR1wrstr /NUMERO_GRANDEhalt

ERROR1: wrstr /NUMERO_NO_VALIDOhalt

; almacenamiento de la cadenas de caracteres con su referencias

UN_NUMERO: data "\nUn numero: "NUMERO_NO_VALIDO: data "\nNumero no valido"NUMERO_GRANDE: data "\nNumero demasiado grande"EL_FACT_ES: data "\nEl factorial es "

COD_NEGATIVO: equ -1

Urriola.Soto:Ruiz. Página 9

Page 10: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.COD_OVERFLOW: equ -2

; ************************************************************************; Rutina SUB_FACT;; Calcula el factorial de un numero que le viene en la pila;;; ************************************************************************

; salvo los registros en el marco de pilaSUB_FACT: push .iy

push .r1push .r2

; coloco el marco de pilamove .sp, .iy

; recojo el argumentomove #5[.iy],.r1cmp .r1,#0bp /SIGUE1

; es negativo devuelvo un codigo de error de numero negativo.move #COD_NEGATIVO,.r2br /VOLVER

; valor no negativoSIGUE1: bp /SIGUE2

move #1,.r2br /VOLVER

; valor positivo en R1SIGUE2: move #1,.r2SIGUEMUL: mul .r2, .r1

bv /OVERFLOWmove .a, .r2dec .r1cmp .r1, #0bz /VOLVERbr /SIGUEMUL

; se produjo overflow, devuelvo codigo de error de OVERFLOWOVERFLOW: move #COD_OVERFLOW,.r2

; retorno el valor en la misma posicion del argumentoVOLVER: move .r2, #5[.iy]

; restauro los valores y retornopop .r2pop .r1pop .iyret

Programa matriz.ens

;Muestra un menu que ofrece opciones para manejar una matriz 5x5;1.Introducir un valor;2.Consultar un valor;3.Mostrar el contenido de la matriz;4.Salir

Urriola.Soto:Ruiz. Página 10

Page 11: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

nFilas: equ 6 ; número de filas de la matriznColumnas: equ 5 ; número de columnas de la matriznOpciones: equ 5 ; núm. de opcionesopcAlmacenar: equ 1opcObtener: equ 2opcMostrar: equ 3opcSalir: equ 4

move #0x7fff,.sp ; inicializar la pilabucleGeneral: call /funcMenu move .r1, .r5 ; guardar la opcion en r5 cmp .r5, #opcSalir ; comprobar que es la opcion de salir bz /fin cmp .r5, #opcMostrar ; comprobar que es la opcion de mostrar bz /opcion3 call /solicitarPosicion ; solicitar par de posicion en la matriz cmp .r5 , #opcAlmacenar ; comprobar si es opcion 1 o 2 bnz /opcion2opcion1: wrstr /sPedirValor ; solicitar un valor inint .r3 call /ponerValor ; colocar valor en la memoria br /bucleGeneral opcion2: call /dameValor ; solicitar valor de la matriz wrstr /sDecirValor ; sacar valor por pantalla wrint .r3 br /bucleGeneralopcion3: call /mostrarMatriz ; llamar a procedimiento de mostrar matriz wrchar #13 br /bucleGeneralfin: halt

longAlmacenMatriz: equ 6*5dMatriz: res 30

sRetCarro: data "\n"sAlmacenar: data "\n1 .- Amacenar valor"sObtener: data "\n2 .- Obtener valor"sMostrar: data "\n3 .- Escribir Matriz"sSalir: data "\n4 .- Salir" sPedirOpcion: data "\n Dame opcion:"sPedirFila: data "\n Dame número de fila: "sPedirColumna: data "\n Dame número de columna: "sDecirValor: data "\n El valor es "sPedirValor: data "\n Valor a almacenar: "

funcMenu: wrstr /sRetCarro wrstr /sAlmacenar wrstr /sObtener wrstr /sMostrar wrstr /sSalir wrstr /sPedirOpcionmenuDeNuevo: inchar .r1 ; lee la opcion sub .r1, #48 ; resta el valor ascii del '0'

Urriola.Soto:Ruiz. Página 11

Page 12: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores. cmp .a,#1 ; comprueba límite inferior bn /menuDeNuevo ; si no valido repetir lectura cmp .a, #nOpciones ; comprueba límite superior bp /menuDeNuevo ; si no valido repetir lectura move .a, .r1 ; colocar salida en .r1 ret

solicitarPosicion: wrstr /sPedirFila ; mensaje de solicitud inint .r1 cmp .r1, #1 ; comprueba límite inferior bn /solicitarPosicion ; si no valido repetir cmp .r1, #nFilas ; comprueba límite superior bp /solicitarPosicion ; si no valido repetirotraColumna: wrstr /sPedirColumna ; mensaje de solicitud inint .r2 cmp .r2, #1 ; comprueba límite inferior bn /otraColumna ; si no valido repetir cmp .r2, #nColumnas ; comprueba límite superior bp /otraColumna ; si no valido repetir ret

dameValor: dec .r2 dec .r1 mul .r1, #nColumnas add .a, .r2 add .a, #dMatriz move .a, .ix move #0[.ix],.r3 retponerValor: dec .r2 dec .r1 mul .r1, #nColumnas add .a, .r2 add .a, #dMatriz move .a, .ix move .r3, #0[.ix] ret mostrarMatriz: move #nFilas,.r1 move #dMatriz,.ix

wrstr /sRetCarrootraFila: move #0,.r2sigueFila: wrint #0[.ix] inc .r2 inc .ix wrchar #32 cmp .r2, #nColumnas bnz /sigueFila wrstr /sRetCarro dec .r1 bnz /otraFila ret

Programa matriz.ens

Urriola.Soto:Ruiz. Página 12

Page 13: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Muestra un menu que ofrece opciones para manejar una matriz 5x51. Introducir un valor2. Consultar un valor3. Mostrar el contenido de la matriz4. Salir

nFilas: equ 6 ; número de filas de la matriznColumnas: equ 5 ; número de columnas de la matriznOpciones: equ 5 ; núm. de opcionesopcAlmacenar: equ 1opcObtener: equ 2opcMostrar: equ 3opcSalir: equ 4

move #0x7fff,.sp ; inicializar la pilabucleGeneral: call /funcMenu move .r1, .r5 ; guardar la opcion en r5 cmp .r5, #opcSalir ; comprobar que es la opcion de salir bz /fin cmp .r5, #opcMostrar ; comprobar que es la opcion de mostrar bz /opcion3 call /solicitarPosicion ; solicitar par de posicion en la matriz cmp .r5 , #opcAlmacenar ; comprobar si es opcion 1 o 2 bnz /opcion2opcion1: wrstr /sPedirValor ; solicitar un valor inint .r3 call /ponerValor ; colocar valor en la memoria br /bucleGeneral opcion2: call /dameValor ; solicitar valor de la matriz wrstr /sDecirValor ; sacar valor por pantalla wrint .r3 br /bucleGeneralopcion3: call /mostrarMatriz ; llamar a procedimiento de mostrar matriz wrchar #13 br /bucleGeneralfin: halt

longAlmacenMatriz: equ 6*5dMatriz: res 30

sRetCarro: data "\n"sAlmacenar: data "\n1 .- Amacenar valor"sObtener: data "\n2 .- Obtener valor"sMostrar: data "\n3 .- Escribir Matriz"sSalir: data "\n4 .- Salir" sPedirOpcion: data "\n Dame opcion:"sPedirFila: data "\n Dame número de fila: "sPedirColumna: data "\n Dame número de columna: "sDecirValor: data "\n El valor es "sPedirValor: data "\n Valor a almacenar: "

funcMenu: wrstr /sRetCarro

Urriola.Soto:Ruiz. Página 13

Page 14: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores. wrstr /sAlmacenar wrstr /sObtener wrstr /sMostrar wrstr /sSalir wrstr /sPedirOpcionmenuDeNuevo: inchar .r1 ; lee la opcion sub .r1, #48 ; resta el valor ascii del '0' cmp .a,#1 ; comprueba límite inferior bn /menuDeNuevo ; si no valido repetir lectura cmp .a, #nOpciones ; comprueba límite superior bp /menuDeNuevo ; si no valido repetir lectura move .a, .r1 ; colocar salida en .r1 ret

solicitarPosicion: wrstr /sPedirFila ; mensaje de solicitud inint .r1 cmp .r1, #1 ; comprueba límite inferior bn /solicitarPosicion ; si no valido repetir cmp .r1, #nFilas ; comprueba límite superior bp /solicitarPosicion ; si no valido repetirotraColumna: wrstr /sPedirColumna ; mensaje de solicitud inint .r2 cmp .r2, #1 ; comprueba límite inferior bn /otraColumna ; si no valido repetir cmp .r2, #nColumnas ; comprueba límite superior bp /otraColumna ; si no valido repetir ret

dameValor: dec .r2 dec .r1 mul .r1, #nColumnas add .a, .r2 add .a, #dMatriz move .a, .ix move #0[.ix],.r3 retponerValor: dec .r2 dec .r1 mul .r1, #nColumnas add .a, .r2 add .a, #dMatriz move .a, .ix move .r3, #0[.ix] ret mostrarMatriz: move #nFilas,.r1 move #dMatriz,.ix

wrstr /sRetCarrootraFila: move #0,.r2sigueFila: wrint #0[.ix] inc .r2 inc .ix wrchar #32 cmp .r2, #nColumnas bnz /sigueFila

Urriola.Soto:Ruiz. Página 14

Page 15: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores. wrstr /sRetCarro dec .r1 bnz /otraFila ret

operaciones.ensEn r0 se guarda la direccion de la funcion de operacionen r1 se guarda el primer operandoen r2 se guarda el segundo operandoen a se guarda el resultado de la operacionen r3 se guarda la opcion elegida por el usuario

INICIO:; Muestra las operaciones por la consola

wrstr /menu1wrstr /menu2wrstr /menu3wrstr /menu4wrstr /menu5wrstr /menu6wrstr /menu7wrstr /menu8wrstr /menu0

; Lectura de la operacionwrstr /cad1inint .r3

; Se calcula la direccion de la funcion correspondientecmp .r3,#0bz /SALIRcmp .r3,#1bz $OP1cmp .r3,#2bz $OP2cmp .r3,#3bz $OP3cmp .r3,#4bz $OP4cmp .r3,#5bz $OP5cmp .r3,#6bz $OP6cmp .r3,#7bz $OP7cmp .r3,#8bz $OP8br $OPERROR

OPERANDOS :;primer operando - se guarda en la variable OPERANDO1

wrstr /cad2inint /OPERANDO1

;segundo operando - se guarda en la variable OPERANDO2wrstr /cad3inint /OPERANDO2

Urriola.Soto:Ruiz. Página 15

Page 16: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.;se ponen los parametros en la pila

push /RESULTADOpush /OPERANDO1push /OPERANDO2

;se llama a la funcion operar

call /OPERAR;se recuperan los valores de retorno de la funcion

pop /OPERANDO2pop /OPERANDO1pop /RESULTADO

;se muestra el resultadowrstr /cad4wrint /RESULTADOwrstr /saltolin

ACARREO : bnc $DESBORDAMIENTOwrstr /cad7

DESBORDAMIENTO :bnv $ACABARwrstr /cad6

;vuelta a empezarACABAR : br /INICIO

;direcciones de las funcionesOP1 : move #SUMA,.r0

br /OPERANDOSOP2 : move #RESTA,.r0

br /OPERANDOSOP3 : move #PRODUCTO,.r0

br /OPERANDOSOP4 : move #DIVISION,.r0

br /OPERANDOSOP5 : move #MODULO,.r0

br /OPERANDOSOP6 : move #Y,.r0

br /OPERANDOSOP7 : move #O,.r0

br /OPERANDOSOP8 : move #OEX,.r0

br /OPERANDOSOPERROR : move #ERROR,.r0

br /OPERANDOS

;Funciones (paso de parametros por registros)SUMA : add .r1,.r2

retRESTA : sub .r1,.r2

retPRODUCTO : mul .r1,.r2

retDIVISION : div .r1,.r2

retMODULO : mod .r1,.r2

retY : and .r1,.r2

Urriola.Soto:Ruiz. Página 16

Page 17: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.ret

O : or .r1,.r2ret

OEX : xor .r1,.r2ret

ERROR : wrstr /cad5ret

SALIR : halt

;funcion operar (paso de parametros por pila)OPERAR : move .sp,.ix

move #3[.ix],.r1 ;se recupera el primer argumentomove #2[.ix],.r2 ;se recupera el segundo argumentocall [.r0] ;se llama a la operacion pertinentemove .a,#4[.ix] ;se devuelve el resultadoret

;cadenas de textocad1 : data "Introduzca la operacion: "cad2 : data "Introduzca el primer operando: "cad3 : data "Introduzca el segundo operando: "cad4 : data "El resultado de la operacion es: "cad5 : data "La operacion introducida no es correcta.\n"cad6 : data "La operacion produjo desbordamiento.\n"cad7 : data "La operacion produjo acarreo.\n"menu1 : data "1.Suma\n"menu2 : data "2.Resta\n"menu3 : data "3.Producto\n"menu4 : data "4.Division\n"menu5 : data "5.Modulo\n"menu6 : data "6.And\n"menu7 : data "7.Or\n"menu8 : data "8.Xor\n"menu0 : data "0.Salir\n"saltolin : data "\n"

;variablesOPERANDO1 : res 1OPERANDO2 : res 1RESULTADO : res 1end

Urriola.Soto:Ruiz. Página 17

Page 18: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Los arboles que hay árboles como se identifican.

Los arboles Inorden: Izquierda-Raíz-Derecha.

1- GEAIBMCLDFKJH.

Los arboles Postorden: izquierda-Derecha-Raíz.

Los arboles Pre orden: Raíz-izquierda-Derecha.

Urriola.Soto:Ruiz. Página 18

I

E

GA

M

B

C

D

L F

J

K H

A

E

H

G

D

C L

J

F K

G

E

I

B M

C

D

A

FH

J

Page 19: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Los arboles Inorden.

2- IABEGLDCFMKHJ.

Los arboles Postorden:

Los arboles Pre orden:

Urriola.Soto:Ruiz. Página 19

D

A

IB

G

E

F

C M

L

H

K J

D

L

GE

B

AI

J

HK

M

CF

I

B

J

A

E

G L

D

C F

M

K H

Page 20: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Gramática BNF definición.

La BNF es un metalenguaje muy utilizado para definir la estructura sintáctica de un lenguaje de programación. Con la aparición de la notación BNF desarrollada en primer lugar por Backus en 1960 cuando trabajaba en un borrador del ALGOL 60, modificada en 1963 por Naur y formalizada por Knuth en 1964 se tiene una guía para el desarrollo del análisis sintáctico.

En 1959, Sheridan describe un método de FORTRAN que introducía paréntesis adicionales alrededor de los operando para ser capaz de analizar las expresiones. Más adelante, Floyd introduce la técnica de la precedencia de operador y el uso de las funciones de precedencia. A mitad de la década de los 60, Knuth define las gramáticas LR y describe la construcción de una tabla canónica de LR.

Por otra parte, el uso por primera vez descendente recursivo tuvo lugar en el año 1961. En el año 1968 se estudian y definen las gramáticas LL así como los parsers predictivos. También se estudia la eliminación de la recursión a la izquierda de producciones que contienen acciones semánticas sin afectar a los valores de los atributos.

Los métodos SLR y LALR de LR. Debido a su sencillez y a su capacidad de análisis para una gran variedad de lenguajes, la técnica de LR va a ser la elegida para los generadores automáticos de parsers. A mediados de los 70, Johnson crea el generador de analizadores sintácticos YACC para funcionar bajo un entorno UNIX. Junto al análisis sintáctico, también se fue desarrollando el análisis semántico.

La gramática Bnf es el acrónico de Backus Naur Form, y fue utilizada para describir el algol 60 Backus 59 Naur 63. Algunas definiciones para el correcto de la notación de Bnf.

Terminal: Es un símbolo terminal cuando tiene entidad propia y se describe por sí mismo es decir no requiere una explicación.

No terminal: Es un símbolo es no terminal cuando requiere una explicación mediante una regla o producción. En Bnf han de ir encerrado entre los paréntesis angulares.

Meta símbolos: son aquellos símbolos de la notación utilizada dos para distinguir los elementos y propiedades de una regla.

En la notación Bnf se utilizan una serie de reglas o producciones cuyos objetivos es la descripción de unidades sintácticas o símbolos no terminales.

Una regla BNF:

V

Especifica que un solo símbolo no terminal v N puede ser substituido por N T sin importar el contexto donde aparezca v. Estas producciones se conocen como independientes del contexto. De acuerdo con N. Chomsky, una gramática y un lenguaje correspondiente son independientes del contexto si y solo si pueden definirse con un conjunto de producciones independientes del contexto.

Urriola.Soto:Ruiz. Página 20

Page 21: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Las gramáticas independientes del contexto son muy importantes en la teoría de los lenguajes de programación, ya que los lenguajes que definen tienen, en general, una estructura muy sencilla. Las técnicas de análisis sintáctico suelen basarse en gramáticas independientes del contexto.

Una gramática representa la definición formal de la sintaxis de un lenguaje. Consta de un conjunto de reglas que especifican las secuencias de símbolos ítems de léxico que forman estructuras sintácticas en el lenguaje definido.

Un metalenguaje es una gramática formal destinada a la descripción de un lenguaje. Existen tres metalenguajes comúnmente utilizados. BNF se identifica como Backus-Naur-Form.

Notación desarrollada por los especialistas Backus y Naur para definir lenguaje Algol60

Ejemplo de BNF para lenguaje Pascal:

<Sentencia for>:= for <variable>:= <intervalo> do <sentencia>

<Intervalo>:= <valor inicial> to <valor final> | <valor inicial> downto <valor final>

<Sentencia for>:= for <variable>:= <valor inicial> <hasta> <valor final>do <sentencia>

<hasta>::= to | downto

<variable> := <identificador>

<Identificador>:= <letra> {<letra>|<dígito>} o

<letra>:= A | B... | Z | a | b... | z

<dígito>:= 0 | 1 | 2... | 9

<valor inicial>:= <expresión>

<valor final>:= <expresión>

Alternativamente se pueden usar reglas BNF en forma recursiva.

<Alfanum>:= <letra> | <dígito>

<secuencia>:= <alfanum> | <alfanum> <secuencia>

<identificador>:= <letra> | <letra> <secuencia>

Los símbolos <, >, |, {,}:=, no son parte del lenguaje definido, sino parte del mecanismo de descripción y reciben el nombre de meta símbolos. El símbolo:= significa se define como. Las secuencias encerradas entre < > constituyen símbolos no terminales o meta variables y las secuencias restantes subrayadas y otras símbolos terminales.

Urriola.Soto:Ruiz. Página 21

Page 22: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

La máquina de Turing.

Es un modelo computacional que realiza una lectura y escritura de manera automática sobre una entrada llamada cinta, generando una salida en esta misma. Este modelo está formado por un alfabeto de entrada y uno de salida, un símbolo especialmente llamado blanco que un conjunto de estados finitos y un conjunto de transiciones entre dichos estados.

Su funcionamiento se basa en una función de transición, que recibe un estado inicial y una cadena de caracteres de la cinta, la cual puede ser infinita pertenecientes al alfabeto de entrada.

La máquina puede ir leyendo una celda de la cinta en cada paso, también es borrando el símbolo en el que se encuentra posicionado su cabezal y escribiendo un nuevo símbolo perteneciente al alfabeto de salida, para luego desplazar el cabezal a la izquierda o a la derecha.

Esto se repite según se indique en la función de transición, para finalmente detenerse en un estado final o de aceptación, representando así la salida.

Mediante este modelo teórico y el análisis de la complejidad de los algoritmos, fue posible la categorización de problemas computacionales de acuerdo a su comportamiento, apareciendo así, el conjunto de problemas denominados P y NP, cuyas soluciones pueden encontrarse en tiempo polinómico por máquinas de Turing deterministas y no deterministas, respectivamente.

Definición formal:

Una máquina de Turing con una sola cinta puede definirse como una 7 tupla.

Donde:[]

es un conjunto finito de estados. es un conjunto finito de símbolos distinto del espacio en blanco, denominado alfabeto de máquina

o de entrada. es un conjunto finito de símbolos de cinta, denominado alfabeto de cinta .

es el estado inicial. es un símbolo denominado blanco, y es el único símbolo que se puede repetir un número

infinito de veces.

es el conjunto de estados finales de aceptación.

es una función parcial denominada función de transición, donde es un movimiento a la izquierda y es el movimiento a la derecha.

Existen en la literatura un abundante número de definiciones alternativas, pero todas ellas tienen el mismo poder computacional, por ejemplo se puede añadir el símbolo como símbolo de no movimiento en un paso de cómputo.

Urriola.Soto:Ruiz. Página 22

Page 23: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

El Funcionamiento

La máquina de Turing consta de un cabezal lector y escritor y una cinta infinita en la que el cabezal lee el contenido, borra el contenido anterior y escribe un nuevo valor. Las operaciones que se pueden realizar en esta máquina se limitan.

Avanzar el cabezal lector y escritor hacia la derecha.

Visualización de una máquina de Turing, en la que se ve el cabezal y la cinta que se lee.

Avanzar el cabezal lector y escritor hacia la izquierda.

El cómputo es determinado a partir de una tabla de estados de la forma: Estado, valor y nuevo estado, nuevo valor, dirección.

Esta tabla toma como parámetros el estado actual de la máquina y el carácter leído de la cinta, dando la dirección para mover el cabezal, el nuevo estado de la máquina y el valor a escribir en la cinta. La memoria es la cinta de la máquina que se divide en espacios de trabajo denominados celdas, donde se pueden escribir y leer símbolos. Inicialmente todas las celdas contienen un símbolo especial denominado blanco.

La máquina de Turing puede considerarse como un autómata capaz de reconocer lenguajes formales.

En ese sentido, es capaz de reconocer los lenguajes recursivamente e numerables, Su potencia es, por tanto, superior a otros tipos de autómatas, como el autómata finito, o el autómata con pila, o igual a otros modelos con la misma potencia computacional.

Representación como diagrama de estados.

Las maquinas de Turing pueden representarse mediante grafos particulares, también llamados diagramas de estados finitos, de la siguiente manera.

Urriola.Soto:Ruiz. Página 23

Page 24: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Esta máquina de Turing está definida sobre el alfabeto a, b, c, posee el conjunto de estados q0, q1, q2, q3, q4, q5, q6, con las transiciones que se pueden ver. Su estado inicial es q0 y el estado final es q2, el lenguaje de salida X, Y, Z, B siendo B el símbolo denominado blanco. Esta máquina reconoce la expresión regular de la forma anbncn con n > = 0.

Los estados se representan como vértices, etiquetados con su nombre en el interior. Una transición desde un estado a otro, se representa mediante una arista dirigida que une a estos

vértices, y esta rotulada por símbolo que lee el cabezal y símbolo que escribirá el cabezal, movimiento del cabezal.

El estado inicial se caracteriza por tener una arista que llega a él y que no proviene de ningún otro vértice.

El o los estados finales se representan mediante vértices que están encerrados a su vez por otra circunferencia.

Modificaciones equivalentes.

Una razón para aceptar la máquina de Turing como un modelo general de cómputo es que el modelo que hemos definido anteriormente es equivalente a muchas versiones modificadas que en principio pareciera incrementar el poder computacional.

Máquina de Turing determinista y no determinista.

La entrada de una máquina de Turing viene determinada por el estado actual y el símbolo leído, un par estado, símbolo, siendo el cambio de estado, la escritura de un nuevo símbolo y el movimiento del cabezal, las acciones a tomar en función de una entrada.

Símbolo posible exista a lo sumo una posibilidad de ejecución, se dirá que es una máquina de Turing determinista, mientras que en el caso de que exista al menos un par estado, símbolo con más de una posible combinación de actuaciones se dirá que se trata de una máquina de Turing no determinista.

La capacidad de cómputo de ambas versiones es equivalente; se puede demostrar que dada una máquina de Turing no determinista existe otra máquina de Turing determinista equivalente, en el sentido de que reconoce el mismo lenguaje, y viceversa.

Es decir, el no determinismo permitirá reducir la complejidad de la solución de los problemas, permitiendo resolver, por ejemplo, problemas de complejidad exponencial en un tiempo polinómico.

Codificación de una máquina de Turing

Toda máquina de Turing puede codificarse como una secuencia binaria finita, es decir una secuencia finita de ceros y unos. Para simplificar la codificación, suponemos que toda MT tiene un único estado inicial denotado por , y un único estado final denotado . Tendremos que para una MT M de la forma.

donde s1 representa el símbolo blanco 0, Δ o b según se desee

denotar, es alfabeto de entrada y son los símbolos auxiliares utilizados por M cada MT utiliza su propia colección finito de símbolos auxiliares.

Urriola.Soto:Ruiz. Página 24

Page 25: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Máquina universal de Turing.

Una máquina de Turing computa una determinada función parcial de carácter definido, definida sobre las secuencias de posibles cadenas de símbolos de su alfabeto. Posiblemente, la idea germinal del concepto de sistema operativo, un programa que puede, a su vez, ejecutar, en el sentido de controlar otros programas, demostrando su existencia, y abriendo camino para su construcción real.

Con esta codificación de tablas como cadenas, se abre la posibilidad de que unas máquinas de Turing se comporten como otras máquinas de Turing. Sin embargo, muchas de sus posibilidades son indecidibles, pues no admiten una solución algorítmica.

Máquina de Turing cuántica

En 1985, Deutsch presentó el diseño de la primera Máquina cuántica basada en una máquina de Turing. Con este fin enunció una nueva variante la tesis de Church Turing dando lugar al denominado principio de Church Turing Deutsch.

Está compuesta por los tres elementos clásicos:

una cinta de memoria infinita en donde cada elemento es un qubit, un procesador finito y un cabezal.

La cinta de memoria es similar a la de una máquina de Turing tradicional. La única diferencia es que cada elemento de la cinta de la máquina cuántica es un qubit. El alfabeto de esta nueva máquina está formado por el espacio de valores del qubit. La posición del cabezal se representa con una variable entera.

Urriola.Soto:Ruiz. Página 25

Page 26: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.El análisis sintáctico, como se utilizan puede ser descendente y ascendente.

Un analizador sintáctico es una de las partes de un compilador que transforma su entrada en un árbol de derivación. El análisis sintáctico convierte el texto de entrada en otras estructuras comúnmente árboles, que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada.

Un analizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintáctico para construir la estructura de datos, por ejemplo un árbol de análisis o árboles de sintaxis abstracta los lenguajes habitualmente reconocidos por los analizadores sintácticos son los lenguajes libres de contexto.

Cabe notar que existe una justificación formal que establece que los lenguajes libres de contexto son aquellos reconocibles por un autómata de pila, de modo que todo analizador sintáctico que reconozca un lenguaje libre de contexto es equivalente en capacidad computacional a un autómata de pila.

Los analizadores sintácticos fueron extensivamente estudiados durante los años 70 del siglo XX, detectándose numerosos patrones de funcionamiento en ellos, cosa que permitió la creación de programas generadores de analizadores sintácticos a partir de una especificación de la sintaxis del lenguaje en forma Backus-Naur.

Análisis sintáctico descendente:

Un analizador puede empezar con el símbolo inicial e intentar transformarlo en la entrada, intuitivamente esto sería ir dividiendo la entrada progresivamente en partes cada vez más pequeñas.

El análisis sintáctico descendente es una técnica de análisis sintáctico que intenta comprobar si una cadena X pertenece al lenguaje definido por una gramática L y G aplicando los siguientes criterios.

1- Partir del axioma de la gramática.2- Escoger reglas gramaticales estratégicamente.3- Hacer derivaciones por la izquierda.4- Obtener el árbol de análisis sintáctico o error.

Urriola.Soto:Ruiz. Página 26

Page 27: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Análisis sintáctico descendente

Explicaremos este método con un ejemplo, usando la siguiente gramática simple, G1 T1, N1, P1, S1 que define los enteros no negativos ENN

T1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

N1 = {DIGITO, ENN}

P1 = {ENN DIGITO | ENN DIGITO}

DIGITO 0|1|2|3|4|5|6|7|8|9|

S1 = {ENN}

Queremos analizar la frase 123. Un principio solo conocemos la raíz del árbol y la frase que debe analizarse.

Árbol semántico frase

ENN 1 2 3

En el primer paso encontramos la producción ENN DIGITO y obtenemos el inicio del árbol de análisis sintáctico.

En el siguiente paso hallamos de nuevo a la misma producción.

Urriola.Soto:Ruiz. Página 27

Page 28: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Después encontramos la producción ENN DIGITO, que expande el árbol sintáctico a lo siguiente:

Encontramos ahora la producción DIGITO 1, que establece la conexión con el primer elemento de la frase dada.

La producción DIGITO 2 establece la conexión con el segundo elemento de la frase:

Por último el árbol de análisis sintáctico queda completo con la producción DIGITO 3.

Podemos ver que el árbol crece de arriba abajo a medida que se lee la frase de entrada de izquierda a derecha. Por consiguiente, este método se denomina análisis sintáctico descendente.

Análisis sintáctico ascendente.

Un analizador puede empezar con la entrada e intentar llegar hasta el símbolo inicial, intuitivamente el analizador intenta encontrar los símbolos más pequeños y progresivamente construir la jerarquía de símbolos hasta el inicial.

Objetivo de un análisis ascendente.

El objetivo de un análisis ascendente consiste en construir el árbol sintáctico desde abajo hacia arriba, esto es, desde los tokens hacia el axioma inicial, lo cual disminuye el número de reglas mal aplicadas con respecto al caso descendente si hablamos del caso con retroceso o amplía el número de gramáticas susceptibles de ser analizadas si hablamos del caso LL.

Operaciones en un analizador ascendente.

Un analizador sintáctico va construyendo el árbol, se enfrenta a una configuración distinta se denomina configuración y debe tomar una decisión sobre el siguiente paso u operación a realizar.

Urriola.Soto:Ruiz. Página 28

Page 29: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Básicamente se dispone de cuatro operaciones diferentes, y cada tipo de analizador ascendente se distingue de los demás en base a la inteligencia sobre cuándo aplicar cada una de dichas operaciones análisis ascendente consiste en partir de una configuración inicial e ir aplicando operaciones, cada una de las cuales permite pasar de una configuración origen a otro destino.

Las operaciones disponibles son las siguientes:

1. ACEPTAR: se acepta la cadena: β ≡ EOF y α ≡ S. axioma inicial.

2. RECHAZAR: la cadena de entrada no es válida.

3. REDUCIR: consiste en aplicar una regla de producción hacia atrás a algunos elementos situados en el extremo derecho de α.

4. DESPLAZAR: consiste únicamente en quitar el terminal más a la izquierda de β y ponerlo a la derecha de α.

Clasificación

Analizador sintáctico ascendente con retroceso. Analizador sintáctico ascendente LR.

Análisis ascendente con retroceso.

Que ocurría con el caso descendente, este tipo de análisis intenta probar todas las posibles operaciones reducciones y desplazamientos mediante un método de fuerza bruta, hasta llegar al árbol sintáctico, o bien agotar todas las opciones, en cuyo caso la cadena se rechaza.

En el análisis con retroceso no se permiten las reglas, puesto que estas se podrán aplicar de forma indefinida.

Análisis ascendente sin retroceso.

El análisis ascendente sin retroceso busca una derivación derecha de la cadena de entrada de forma determinista.

Este se sustenta en su aplicación a las gramáticas LR K.

La L viene de la lectura de la cadena de entrada de izquierda a derecha.

La R de producir un árbol de derivación derecho.

La k indica el número de símbolos que es necesario leer a la entrada para tomar la decisión de qué producción emplear.

Un Parser del tipo short reduce puede verse como un autómata de pila determinista extendido que realiza el análisis de abajo hacia arriba.

Dada una cadena de entrada w, simula una derivación más a la derecha.

Urriola.Soto:Ruiz. Página 29

Page 30: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Diferencias entre el descendente y el ascendente

En el análisis sintáctico descendente: se construye el árbol sintáctico arriba hacia abajo y se utiliza más reglas.

En el análisis sintáctico ascendente: se construye el árbol sintáctico de abajo hacia arriba, lo cual disminuye el número de reglas mal aplicadas con respecto al caso descendente.

Análisis sintáctico ascendente.

Ejemplifiquemos el análisis sintáctico ascendente usando otra vez la gramática G1 y la frase 123. De nuevo, solo sabemos cuál es la raíz del árbol de análisis sintáctico y la frase que debemos de analizar. En el primer paso se encuentran la reducción 1 DIGITO y se obtiene el inicio del árbol sintáctico.

En el segundo paso se encuentra la reducción del DIGITO ENN y se obtiene el segundo árbol sintáctico El tercer paso reduce el segundo elemento de la frase usando la reducción 2 DIGITO. Entonces se aplica la reducción DIGITO ENN para continuar con el árbol de análisis sintáctico:

En el paso siguiente se reduce a un digito el último elemento de la frase: 3 DIGITO

Para concluir se completa el árbol de análisis sintáctico con la reducción ENN DIGITO ENN: A partir de este ejemplo podemos ver que comenzamos con las hojas del árbol sintáctico y asciende hacia la raíz. . Por ello, este método se denomina análisis sintáctico ascendente.

Urriola.Soto:Ruiz. Página 30

Page 31: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

El análisis léxicos.

El analizador léxico, también conocido como scanner, lee los caracteres uno a uno desde la entrada y va formando grupos de caracteres con alguna relación entre sí tokens, que constituirán la entrada para la siguiente etapa del compilador. Cada token representa una secuencia de caracteres que son tratados como una única entidad.

Hay dos tipos de tokens: tiras específicas, el punto y coma, la asignación, los operadores aritméticos o lógicos, etc.; tiras no específicas, como identificadores, constantes o etiquetas. Se considera que un token tiene dos partes componentes: el tipo de token y su valor. Las tiras específicas sólo tienen tipo lo que representan, mientras que las tiras no específicas tienen tipo y valor.

Comenzaremos con la parte más sencilla del compilador: el analizador léxico. Habitualmente el término análisis léxico se refiere al tratamiento de la entrada que produce como salida la lista de tokens. Un token hace alusión a las unidades más simples que tiene significado.

Habitualmente un token o lexema queda descrito por una expresión regular. Léxico viene del griego lexis, que significa palabra. Una herramienta eficaz para encontrar en qué lugar de la cadena se produce un emparejamiento.

El análisis léxico, el problema es encontrar la subcadena a partir de la última posición en la que se produjo un emparejamiento y que es aceptada por una de las expresiones regulares que definen los lexemas del lenguaje dado.

En un compilador, el análisis lineal se llama análisis lineal o exploración. Por análisis lineal entendemos la cadena de caracteres que constituye el programa fuente se lee de izquierda a derecha y se agrupan en componentes léxicos, que son secuencias de caracteres que tiene un significado colectivo en análisis léxico los caracteres de las siguientes proposiciones de asignación.

Los espacios en blanco separan los caracteres de estos componentes léxicos normalmente se eliminan durante el análisis léxico. Una expresión regular denota un conjunto de secuencias de símbolos válidas que se construyen en base al alfabeto de un lenguaje.

El Analizador Léxico es la etapa del compilador que va a permitir saber si es un lenguaje de formato libre. Frecuentemente va unido al analizador sintáctico en la misma pasada, funcionando entonces como una subrutina de este último. Ya que es el que va leyendo los caracteres del programa, ignorará aquellos elementos innecesarios para la siguiente fase, como los tabuladores, comentarios, espacios en blanco.

Funcionamiento de un analizador léxico.El analizador léxico es la primera fase de un compilador. Su función principal es leer los caracteres de entrada y producir como salida una secuencia de tokens que el parser luego utiliza en su análisis sintáctico. El analizador léxico lee una secuencia de caracteres del código fuente del programa hasta identificar un token, el cual es retornado como respuesta al pedido del analizador sintáctico.

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.

Urriola.Soto:Ruiz. Página 31

Page 32: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Cuando recibe la orden el siguiente componente léxico, el analizador léxico lee los caracteres de entrada hasta idéntica el siguiente componente léxico. Analizador léxico analizador sintáctico programa fuente léxico componente

Especificación de un Analizador Léxico. Analizador Léxico para un lenguaje determinado, es necesario diseñar su especificación. Para ello hay que identificar primeramente la colección de tokens que compone el lenguaje. Cada token debe estar especificado mediante algún esquema generador o un esquema reconocedor, preferiblemente expresiones regulares.

Funciones el análisis léxico.

Otras funciones secundarias:

Manejo del chero de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y gestionar posibles errores de lectura.

Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea o caracteres no validos para formar un token.

Inclusión de ficheros: # include ... La expansión de macros y funciones inline: # define ... Contabilizar el número de líneas y columnas para emitir mensajes de error. Reconocimiento y ejecución de las directivas de compilación.

Ventajas de separar el análisis léxico y el análisis sintáctico: Facilita transportabilidad del traductor (por ejemplo, si decidimos en un momento dado cambiar las

palabras reservadas Begin y End de inicio y de bloque, por f y g, solo hay que cambiar este modulo. Se simplifica el diseño: el analizador es un objeto con el que se interactúa mediante ciertos

métodos.

La opción g

Como lo usamos en un contexto escalar, la opción g itera sobre la cadena, devolviendo cierto cada vez que casa, y falso cuando deja de casar. Se puede averiguar la posición del emparejamiento utilizando la función.

La opción c.

La opción c afecta a las operaciones de emparejamiento con g en un contexto escalar. Normalmente, cuando una búsqueda global escalar tiene lugar y no ocurre casamiento, la posición de comienzo de búsqueda es restablecida al comienzo de la cadena. La opción c hace que la posición inicial de emparejamiento permanezca donde la dejó el último emparejamiento con éxito y no se vaya al comienzo. Al combinar esto con el ancla G, la cual casa con el final del último emparejamiento, obtenemos que la combinación.

La opción i: La última opción i permite ignorar los tipos de letra mayúsculos o minúsculos.

Urriola.Soto:Ruiz. Página 32

Page 33: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Código del Analizador Léxico.

Este es el código completo de la subrutina scanner que se encarga del análisis léxico:

1 package Lexical::Analysis; 2 sub scanner { 3 local $_ = Shift; 4 {# Con el redo del final hacemos un bucle "infinito" 5 if (m {\G\s* (\d+)}gc) { 6 push @tokens, 'NUM', $1; 7 } 8 elsif (m {\G\s*int\b}igc) { 9 push @tokens, 'INT', 'INT';10 } 11 elsif (m {\G\s*string\b}igc) {12 push @tokens, 'STRING', 'STRING';13 } 14 elsif (m {\G\s*p\b}igc) {15 push @tokens, 'P', 'P'; # P para imprimir16 } 17 elsif (m {\G\s* ([a-z_]\w*)\b} igc) {18 push @tokens, 'ID', $1;19 } 20 elsif (m {\G\s*\"([^"]*)\"} igc) {21 push @tokens, 'STR', $1;22 } 23 elsif (m {\G\s* ([+*() = ;,])} GC) {24 push @tokens, 'PUN', $1;25 }26 elsif (m {\G\s*(\S)}gc) {# Hay un carácter "no blanco"27 Error: fatal "Carácter invalido: $1\n";28 }29 else {30 last;31 }32 redo;33 }34 }

Urriola.Soto:Ruiz. Página 33

Page 34: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Buffers de entrada.

buffer de entrada resulta útil cuando es necesario un pre-análisis en la entrada para identificar los componentes léxicos después se introducen algunas técnicas básicas para encontrar la velocidad del analizador léxico, como es el uso de centinelas que sirven para marcar el final de buffer, hay tres métodos generales de implantar un léxico:

Utilizar un generador de analizadores léxicos, como el compilador LEX para producir el analizador léxico a partir de una especificación basada en expresiones regulares, en este caso el generador proporciona rutinas para leer la entrada y manejarla con buffers.

Escribir el analizador léxico en un lenguaje convencional de programación de sistemas utilizando las posibilidades de entrada y salida de este lenguaje para leer la entrada.

Escribir el analizador léxico en lenguaje ensamblador y manejar explícitamente la lectura de la entrada

Área del almacenamiento primario destinada a contener datos durante transferencia de entrada salida.

Si se utiliza la pareja de buffers, cada vez que se mueva el apuntador delantero se debe comprobar si se ha salido de una mitad del buffer, si así ocurriera se deberá cargar la segunda mitad. Se pueden reducir estas dos pruebas a una si se amplía cada mitad del buffer para admitir un carácter centinela EOF al final.

Se mantienen dos apuntadores al buffer de entrada:

Apuntador delantero examina hacia delante hasta encontrar una concordancia con un patrón. Una vez determinado el siguiente lexema, el apuntador delantero se coloca en el carácter de su extremo derecho.

Apuntador de lexema se queda al inicio del lexema y lo procesa.

Técnica de Pareja de buffers

Se divide en dos mitades de tamaño N un bloque del disco 1024 o 4096 Dos punteros: comienzo lexema y delantero.

Al principio los dos igual y avanzo delantero hasta encontrar concordancia con patrón un token.

      Delantero se coloca en su carácter derecho.

     Comienzo lexema y delantero delimitan lexema.

    Procesa lexema (devuelvo token y coloco comienzo lexema en delantero primer carácter del siguiente

      Cando termina una mitad, recarga la otra y continua hasta encontrar token.

Un buffer de entrada resulta útil cuando es entrada para identificar los componentes léxicos después se introducen algunas técnicas básicas para encontrar la velocidad del analizador léxico, como es el uso de centinelas que sirven para marcar el final de buffer, hay tres métodos generales de implantar un léxico:

Urriola.Soto:Ruiz. Página 34

Page 35: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Escribir el analizador léxico en un lenguaje convencional de programación de sistemas utilizando las posibilidades de entrada y salida de este lenguaje para leer la entrada.

Escribir el analizador léxico en lenguaje ensamblador y manejar explícitamente la lectura de la entrada.

Utilizar un generador de analizadores léxicos, como el compilador LEX para producir el analizador léxico a partir de una especificación basada en expresiones regulares, en este caso el generador proporciona rutinas para leer la entrada y manejarla con buffers.

Puede estar dividido en:

Texto lenguaje fuente

Traductor

Texto lenguaje objeto

Programa objeto

Compilador

Manejo de errores

Manejo de tabla de símbolos

Programa fuente

Buffer = espacio en memoria

Programa fuente

Mensajes de error

Programa fuente

Analizador léxico

Analizador sintáctico

Análisis semántico

Generación de código intermedio

Optimización de código

Generador de código

Programa objeto

Manejo de tabla de símbolos

Analizador léxico

Analizador sintáctico

Tabla de símbolos

Componente léxico

Obtén el siguiente componente léxico

Los buffers se utilizan a menudo, conjuntamente con E/S de hardware, tal como unidades de disco, enviar o recibir datos a/o desde una red, o reproducción de sonido en un altavoz. Una línea a una montaña rusa en un parque de atracciones comparte muchas similitudes. Las personas que viajan en la montaña llegan, a menudo, a un ritmo desconocido y variable, pero la montaña rusa será capaz de cargar personas de golpe tal como llegan se van montando. La zona de la cola actúa como un buffer: un espacio temporal donde los que deseen viajar deben esperar a que el viaje esté disponible. Los buffers utilizan generalmente un método FIFO primero en entrar, primero en salir, es decir, la salida de datos se produce en el orden en que llegaron.

Urriola.Soto:Ruiz. Página 35

Page 36: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Se utiliza un buffer dividido en dos mitades de caracteres cada una como se indica en la figura:

Texto lenguaje fuente

Traductor

Texto lenguaje objeto

Programa objeto

Compilador

Programa fuente

Mensajes de error

Programa fuente

Analizador léxico

Analizador sintáctico

Análisis semántico

Generación de código intermedio

Optimización de código

Generador de código

Programa objeto

Manejo de errores

Manejo de tabla de símbolos

Analizador léxico

Analizador sintáctico

Tabla de símbolos

Componente léxico

Obtén el siguiente componente léxico

Programa fuente

Buffer = espacio en memoria

Urriola.Soto:Ruiz. Página 36

Page 37: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Expresiones de maquina finita.

Máquinas de estado finito.

Una máquina de estado finito o autómata finito es aquella que tiene un número finito de estados así como se puede introducir una serie de monedas a una máquina recaudadora, también se puede dar a cualquier autómata una serie de caracteres de su alfabeto de entrada.

Una serie finita de caracteres se llama cadena de caracteres. Se dice que el autómata acepta una cadena de caracteres si, cuando empieza en su estado inicial y recibe esta serie de entradas, la maquina llega a un estado de aceptación.

El conjunto de estados, el alfabeto de entrada y el conjunto de cadenas de caracteres aceptados por el autómata determinista la imagen.

El conjunto de estados es empezar, no, a, b, c, d. Los estados de aceptación son b y d. El alfabeto de entrada es O, 1, ya que los bordes que salen de cada vértice tienen la etiqueta O la etiqueta 1. Una serie que conduce al estado b solamente puede tener ceros.

Se puede demostrar por inducción sobre el número de ceros que una serie de ceros conduce a un estado a si tiene un número impar de ceros y a un estado b si tiene un número par de ceros.

Que es una máquina procesadora de información, las señales de entrada son la presión sobre el acelerador y la posición angular del volante, y las señales de salida corresponden a la velocidad y dirección del vehículo. En una máquina vendedora, también una procesadora de información las señales de entrada son las monedas depositadas y la selección de la mercancía, las señales de salida son la mercancía y, posiblemente, el cambio.

MÁQUINAS DE ESTADO FINITOAhora introducimos un modelo abstracto de una máquina de estado finito, la cual está especificada por:1. Un conjunto finito de estados S= {s0, s1, s2,. . .}.2. Un elemento especial del conjunto S, s0, es conocido como estado inicial.3. Un conjunto finito de caracteres de entrada I = {i1, i2...}4. Un conjunto finito de caracteres de salida O = {o1, 02. . .}.5. Una función f de S x / a S, conocida como función de transición.6. Una función g de S a O, conocida como función de salida.

Urriola.Soto:Ruiz. Página 37

Page 38: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Una máquina de estado finito se encuentra en uno de sus estados. Al llegar un carácter de entrada, la máquina pasará a otro estado de acuerdo con la función de transición. Además, en cada estado la máquina produce un carácter de salida de acuerdo con la función de salida. Al principio, la máquina se encuentra en su estado inicial.

MÁQUINAS DE ESTADO FINITO COMO MODELOS DE SISTEMAS FÍSICOS:

Una máquina de estado finito puede ser útil para modelar un sistema físico. Anteriormente vimos cómo una máquina vendedora puede ser modelada como una máquina finita. Consideremos el problema de diseñar un contador módulo 3 que reciba de números 0, 1 Y 2 como entrada, y produzca una sucesión de números 0, 1 Y 2 como salida de manera que en cualquier instante la salida sea igual al módulo 3 de la suma de los dígitos de la sucesión de entrada. La máquina de la figura siguiente generará la sucesión de salida como:

EntradaEstado O 1 2 Salida=>A A B C OB C A 1C A B 2.

Observe que A es un estado correspondiente a la situación en que el módulo 3 de la suma de todos los dígitos de entrada es 0; B es un estado que corresponde a la situación en que el módulo 3 de la suma de todos los dígitos de entrada es 1, Y C es un estado que corresponde a la situación en que el módulo 3 de la suma de todos los dígitos de entrada es 2.

Los grafos son artefactos matemáticas que permiten expresar de una forma visualmente muy sencilla y efectiva las relaciones que se dan entre elementos de muy diversa índole.

Urriola.Soto:Ruiz. Página 38

Page 39: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Un grafo esta formado por dos conjuntos:

Un conjunto V de puntos llamados vértices.

Un conjunto de pares de vértices que se llaman aristas o arcos y que indican que vértices están relacionados.

De manera sencilla podemos decir que un grafo es un conjunto de vértices con enlaces entre ellos denominado aristas o arcos.

Un grafo simple es cuando entre dos vértices hay un solo arco, si hay más de un arco se llama multígrafo.

Un grafo es dirigido si los arcos se pueden recorrer en una dirección concreta y no en la contraria.

El grado de un vértice comprende el número de aristas que inciden en el vértice.

 

Urriola.Soto:Ruiz. Página 39

Page 40: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Los arboles son partes semánticos.

Árboles semánticos:

Un árbol semántico es una secuencia de secuencias de expresiones del tipo, donde es una fórmula del lenguaje y n es un índice numérico siendo 0, tal que se constituye a partir de una expresión 1 según ciertas reglas. A esta secuencia la llamaremos árbol, o más esquemáticamente.

Las reglas de construcción se basan en la definición de conjunto modelo, de modo que puede concebirse como una secuencia de enunciados metalingüísticos acerca de un conjuntos y modelo que nos permite obtener un S modelo que Satisfaga.

Comprobación estática

Comprobación de tipos:

La aplicación de los operadores y operandos deben ser compatibles Comprobaciones del flujo del control Las proposiciones que hacen que se abandone el flujo del control de una construcción debe

transferirse a otro punto. Comprobaciones de unicidad Hay situaciones en los que un objeto solo puede definirse una vez exclusivamente. Las etiquetas

de una sentencia case no deben repetirse, declaraciones de objetos,.. Comprobaciones relacionadas con nombre El mismo nombre debe aparecer dos o más veces. En Ada el nombre que aparece en un bloque

puede aparecer al principio y final, el compilador debe comprobar que se utiliza el mismo él ambos sitios.

Además de comprobar que un programa cumple con las reglas de la gramática, hay que comprobar que lo que se quiere hacer tiene sentido fase también modifica la tabla de símbolos y suele estar mezclada con la generación de código intermedio

Las gramáticas independientes del contexto G2 no son suficientes para realizar el análisis semántico

Por ejemplo, no hay forma de comprobar si una variable ha sido definida ya, o si existe una determinada etiqueta

Es necesario definir un tipo de gramática más rica como las gramáticas de atributo

Las gramáticas de atributo son gramáticas G2 a las que se añaden atributos y reglas de evaluación de atributos funciones reglas semánticas. Un Árbol semántico es una técnica similar a las tablas de verdad que puede simplificar la evaluación de algunas fórmulas

Inicialmente, se forma el conjunto LP de letras proposicionales de la fórmula. Se construye un nodo inicial del árbol que se tomará como nodo actual y se aplica el siguiente procedimiento

1.- Se intenta evaluar la fórmula en el nodo actual.

2.- Si es posible asignar a F un valor { } V F se etiqueta el nodo con dicho valor y se finaliza el tratamiento del nodo actual.

Urriola.Soto:Ruiz. Página 40

Page 41: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.En caso. Contrario: Se Selecciona la primera letra proposicional p del conjunto LP

Se Borra p de LP.

Se Construyen dos ramas, una correspondiente a p Interpretado con valor VIdentificada como p y la otra correspondiente a p con valor F identificada como. Repetir el procedimiento por cada uno de los dos nuevos nodos. Al final del desarrollo del árbol, cada rama ACTIVA es un modelo para el juicio; si el juicio de salida era V., entonces una rama ACTIVA es un modelo para la formula, mientras si era F. es un modelo para la formula. Si no hay ramas ACTIVAS, el juicio de salida es insatisfactible; por ejemplo, si se trataba de un juicio del tipo V. entonces es insatisfactible, o sea es una Tautología.

Urriola.Soto:Ruiz. Página 41

Page 42: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Fase de compilación y como este estructurado.

Fases de Compilación de un Programa

La compilación consiste en la traducción de un programa fuente escrito en un lenguaje de alto nivel  a un programa objeto y luego  se debe utilizar un programa llamado montador o enlazador con linker.

El proceso de montaje conduce a un programa en lenguaje máquina directamente ejecutable.

Intérprete: toma el programa fuente, lo traduce y a continuación lo ejecuta un ejemplo de lenguaje interpretado es Java.

Compilador: es un programa que se encargan de convertir las instrucciones escritas en un lenguaje de programación en instrucciones escritas en lenguaje máquina 0´s y 1´s que la computadora.

Fases de Proceso de un compilador:

1- Analizador Léxico: Realiza un análisis del archivo. La cadena de entrada se lee e izquierda a derecha y se va agrupando en componentes léxicos, que son secuencias de caracteres con un significado colectivo.

2- Analizador Sintáctico: Realiza un análisis jerárquico agrupado de los componentes léxicos en frases gramaticales que el compilador utiliza.

3- Analizador Semántico: Busca errores semánticos, reúne información sobre los tipos; identifica operadores en base al árbol sintáctico producido en el análisis anterior operación entre tipos de datos incompatibles, rangos permitidos existencia de variables.

4- Generador de código intermedio: Algunos compiladores generan una representación explicita del programa fuente este código es independiente de la maquina y a veces se usa en un conjunto con interpretes, en lenguajes independientes de la plataforma.

5- Optimización: Esta fase trata de mejorar el código intermedio, o las estructuras que generaran el código definitivo de modo de que resulte un código de maquina más rápido de ejecutar para guardarlos valores calculados por cada instrucción.

6- Generador de código. Esta fase final de un compilador. Genera el código objeto, que por lo general consiste en un código de maquina re localizable o código ensamblador.

7- Agrupación lógica de un  compilador: Es la fase de análisis, depende del lenguaje fuente y son independientes de las maquinas controla la corrección del programa fuente, manejando errores encada etapa.

Urriola.Soto:Ruiz. Página 42

Page 43: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Las fases de compilación

La primera fase consiste en escribir el código fuente en lenguaje C o C++ archivos con extensión .c y .h en C y .cpp y .hpp en C++. Luego se efectúa la compilación, por ejemplo con gcc en C o g++ en C++. La compilación se desarrolla en tres grandes fases.

El preprocesador

El compilador comienza por aplicar cada instrucción pasada al preprocesador todas las líneas que comienzan con #, entre estas las # define. Estas instrucciones son en realidad muy simples ya que únicamente copian o eliminan secciones de código sin compilarlas.

Es en esta fase que las #define que se encuentran en un archivo fuente c o .cpp o en un header .h o .hpp son reemplazadas por código CC+. Al final de esta etapa, no habrán instrucciones comenzando por #.

Las fases de resolución de un problema con computadora son:

Análisis del problemaDiseño del algoritmoCodificación Compilación y ejecuciónVerificaciónDepuraciónMantenimientoDocumentación

Fase de edición: Esta fase consiste en escribir dentro de un fichero, llamado programa fuente, el programa anterior, utilizando para ello un editor.

Fase de compilación: Esta fase consiste en traducir el programa fuente a lenguaje máquina, obteniéndose el programa objeto, utilizando para ello un compilador o intérprete, que informa sobre los errores sintácticos cometidos.

Fase de montaje: Esta fase consiste en enlazar los distintos programas objetos que pueden componer una aplicación, así como las rutinas necesarias del sistema, obteniéndose el programa ejecutable, utilizando para ello un montador.

Fase de prueba de ejecución: Esta fase consiste en ejecutar el programa utilizando un juego de datos de entrada lo suficientemente amplio y diverso para poder asegurar que el programa funciona de forma adecuada, proporcionando los resultados correctos.

Fase de explotación y mantenimiento: Esta fase consiste en el uso cotidiano del programa por parte de los usuarios del mismo, así como en la comprobación periódica de su buen funcionamiento y en la realización de las modificaciones necesarias para que se mantenga actualizado.

Urriola.Soto:Ruiz. Página 43

Page 44: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Errores: Durante todas las fases comentadas pueden cometerse errores, que se pueden clasificar como sigue:

Errores de compilación: Sintácticos cometidos al escribir el programa en un lenguaje de programación determinado. Este lenguaje impone unas reglas sintácticas que deben ser cumplidas, ya que en caso contrario aparece este tipo de error.

Errores de ejecución: Los errores causados por la ejecución de una operación no permitida, como dividir por cero, exceder un rango de valores, cuando ocurren, se suele decir que el programa ha sido abortado por el sistema.

Errores de lógica: son los errores en los resultados, por ejemplo se espera un listado ordenado y aparece desordenado. Como en el caso anterior, para detectarlos debe probarse el programa en su totalidad y verificar que los resultados son correctos.

Errores de especificación: son los errores causados por unas especificaciones incorrectas, debidas a un malentendido entre el programador y quien plantea el problema.

Fases de la compilación

La compilación es el proceso de la traducción de programas fuente a programas objeto.

El programa objeto obtenido de la compilación no ha sido traducido normalmente a código máquina sino a ensamblador. Para conseguir el programa máquina real se debe utilizar un programa llamado montador o enlazador linker.

El proceso de ejecución de un Programa en C++ tiene los siguientes pasos:

Escritura del programa fuente con un editor programa que permite a una computadora actuar de modo similar a una máquina de escribir electrónica y guardarlo en un dispositivo de almacenamiento un disco.

Introducir el programa fuente en memoria. Compilar el programa con el compilador C++. Verificar y corregir errores de compilación listado de errores. Obtención del programa objeto. El montador obtiene el programa ejecutable. Se ejecuta el programa y si no existen errores, se tendrá la salida del mismo.

Urriola.Soto:Ruiz. Página 44

Page 45: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Urriola.Soto:Ruiz. Página 45

Page 46: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Urriola.Soto:Ruiz. Página 46

Page 47: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Urriola.Soto:Ruiz. Página 47

Page 48: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Urriola.Soto:Ruiz. Página 48

Page 49: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.

Urriola.Soto:Ruiz. Página 49

Page 50: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Conclusión.

El programa compilador traduce las instrucciones en un lenguaje de alto nivel a instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje de programación se requiere un compilador separado. El compilador traduce todo el programa antes de ejecutarlo.

Los compiladores son, pues, programas de traducción insertados en la memoria por el sistema operativo el compilador es un programa que se encarga de traducir los programas escritos por el programador en lenguaje de alto nivel entendible por el ser humano a un lenguaje de bajo nivel que es el comprensible La máquina de Turing puede considerarse como un autómata capaz de reconocer lenguajes formales.

Reconocer los lenguajes recursivamente e numerables, de su potencia es, por tanto, superior a otros tipos de autómatas, como el autómata finito, o el autómata con pila, o igual a otros modelos con la misma potencia computacional.

Este modelo está formado por un alfabeto de entrada y uno de salida, un símbolo especialmente llamado blanco que un conjunto de estados finitos y un conjunto de transiciones entre dichos estados. Su funcionamiento se basa en una función de transición la entrada de una máquina de Turing viene determinada por el estado actual y el símbolo leído, un par estado, símbolo, siendo el cambio de estado, la escritura de un nuevo símbolo y el movimiento del cabezal, las acciones a tomar en función de una entrada.

Una máquina de Turing computa una determinada función parcial de carácter definido, definida sobre las secuencias de posibles cadenas de símbolos de su alfabeto. Un analizador sintáctico es una de las partes de un compilador que transforma su entrada en un árbol de derivación. El análisis sintáctico convierte el texto de entrada en otras estructuras comúnmente árboles, que son más útiles para el posterior análisis.

Una máquina de estado finito o autómata finito es aquella que tiene un número finito de estados así como se puede introducir una serie de monedas a una máquina recaudadora, también se puede dar a cualquier autómata una serie de caracteres de su alfabeto de entrada.

En una máquina vendedora, también una procesadora de información las señales de entrada son las monedas depositadas y la selección de la mercancía, las señales de salida son la mercancía y, posiblemente, el cambio.

La compilación consiste en la traducción de un programa fuente escrito en un lenguaje de alto nivel  a un programa objeto y luego  se debe utilizar un programa llamado montador o enlazador con linker. El proceso de montaje conduce a un programa en lenguaje máquina.

Un árbol semántico es una secuencia de secuencias de expresiones del tipo, donde es una fórmula del lenguaje y n es un índice numérico siendo 0, tal que se constituye a partir de una expresión 1 según ciertas reglas. Esta fase consiste en escribir dentro de un fichero, llamado programa fuente, el programa anterior, utilizando para ello un editor.

Urriola.Soto:Ruiz. Página 50

Page 51: Conceptos De Compilador

Universidad Metropolitana de Educación Ciencia Y Tecnología.

Compiladores.Esta fase consiste en traducir el programa fuente a lenguaje máquina, obteniéndose el programa objeto, utilizando para Esta fase consiste en ejecutar el programa utilizando un juego de datos de entrada lo suficientemente amplio y diverso para poder asegurar que el programa funciona de forma adecuada, proporcionando los resultados correctos.

La compilación es el proceso de la traducción de programas fuente a programas objeto el programa objeto obtenido de la compilación no ha sido traducido normalmente a código máquina sino a ensamblador. Para conseguir el programa máquina real se debe utilizar un programa llamado montador o enlazador linker.

Los grafos son artefactos matemáticas que permiten expresar de una forma visualmente muy sencilla y efectiva las relaciones que se dan entre elementos.

Una máquina de estado finito se encuentra en uno de sus estados. Al llegar un carácter de entrada, la máquina pasará a otro estado de acuerdo con la función de transición. Además, en cada estado la máquina produce un carácter de salida de acuerdo con la función de salida. Al principio, la máquina se encuentra en su estado inicial.

Urriola.Soto:Ruiz. Página 51