Ingeniera de Sistemas Generalidades Ing. Max Jara Paredes maxjarap@gmail.com 22 FORTRAN (FORmula TRANslation), Jhon Backus Sin estructuras de datos como registros, apuntadores, tipos enumerados Sin recursividad Los verdaderos programadores usan ensamblador Compiladores Historia GNU Eiffel 2 33 Ayudan a comprender el funcionamiento de la mquina a bajo nivel Ayudan a comprender mejor el diseo e implementacin de programas Se aplican tcnicas aprendidas en semestres anteriores Las tcnicas de su construccin son aplicables al desarrollo software en general: anlisis lxico en formateadores y editores de texto, lenguajes de consulta, transformacin de formatos de ficheros Aplicacin al procesamiento paralelo y distribuido Compiladores Porqu estudiarlos? GNU Eiffel 3 44 MODELO LENGUAJE CARACTERISTICAS Compilado Fortran, Cobol, C, C++, Pascal Sintaxis rigurosa. Programas rpidos o de tamao reducido. Explotacin de instrucciones especiales del microprocesador Interpretado Lisp, Basic, SQL Desempeo lento. Ideal para desarrollos rpidos (prototipos). Sintaxis ms relajada y mayor libertad en la conversin de datos. Pseudocompilado Java Transportabilidad absoluta. Requiere mquina virtual para ser ejecutado. Mejor desempeo que un programa interpretado pero ms lento que uno compilado. La sintaxis es rigurosa. Ponencia presentada por el M. en C. Eduardo Ren Rodrguez vila en la Tercera Semana de Ingeniera IEEE; Abril 29, 1998; ENEP Aragn. FUENTE Compiladores Porqu estudiarlos? GNU Eiffel 4 55 Generalidades - Conceptos relacionados Compiladores Teora de algoritmos Lenguajes de programacin Arquitectura de computadores Teora de lenguajes Ingeniera del software Matemticas discretas GNU Eiffel 5 66 Qu se entiende por comunicacin? Cul es la finalidad de la comunicacin? Cuales son los elementos comunes en una comunicacin? Cmo el hombre se comunica con el hombre? Cmo el hombre se comunica con el computador? Qu se entiende por lenguaje? Generalidades - Comunicacin GNU Eiffel 6 77 Cmo el hombre le indica al computador lo que debe hacer? En el marco de los conceptos: comunicacin y lenguaje, qu papel juega la programacin? Cules lenguajes de programacin conoce? Qu sabe respecto a su nivel de abstraccin? Lenguaje de programacin GNU Eiffel 7 88 Lenguaje programacin tiene Semntica tiene Significado relacionada con Sintxis Aspecto BNF Traduccin relacionada con en formato usada Programa de un de un Lenguaje de programacin - Concepto GNU Eiffel 8 99 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1949-1950 Primeros ensambladores simblicos * * ESCRIBE "HELLO, WORLD!" A DONDE SEA QUE HAYA SIDO APUNTADA SYSPRINT * EN EL LANZADOR JCL * HELLOPRT START 0 INICIO PRINT NOGEN RESERVA LAS MACRO EXPANSIONES BEGIN SAVE (14,12) GUARDA LOS REGISTROS DE ENTRADA LR 12,15 LOCALIZA.... USING HELLOPRT,12 ...DONDE ESTAMOS ST 13,SAVE+4 GUARDA EL AREA ACTUAL DE DIRECCIONES LA 11,SAVE APUNTA A UNA NUEVA AREA DE DIRECCIONES ST 11,8(13) EN EL AREA ANTERIOR LR 13,11 MUEVE EL AREA DE DIRECCIONES GUARDADA * * DOPUT EQU * PUT SYSPRINT,HELLOMSG ESCRIBE EL MENSAJE B DOPUT EN UN CICLO SIN FIN * * CODIGO NECESARIO PARA REGRESAR EL CONTROL AL MVS * L 13,SAVE+4 OBTIENE AREA DE DIRECCIONES GUARDADA RETURN (14,12),RC=0 AL SISTEMA OPERATIVO * * DEFINICIONES PARA AREA DE TRABAJO Y ARCHIVOS * SAVE DS 18F PARA GUARDAR AREA LOCAL HELLOMSG DC C'Hello, world!!!' SYSPRINT DCB DSORG=PS,MACRF=PM,DDNAME=SYSPRINT,RECFM=FA,LRECL=133,BLKSIZE=133 GNU Eiffel 9 10 10 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1954-1957 Fortran C C Versin Fortran C Program Hello implicit none logical DONE DO while (.NOT. DONE) write(*,10) END DO 10 format('Hello, world!!!') END GNU Eiffel 10 11 11 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1959 Lisp ; ; Versin Lisp ; (DEFUN HELLO-WORLD () (PRINT (LIST 'Hello, 'world!!!))) GNU Eiffel 11 12 12 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1959-1960 Cobol 000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. HELLOWORLD. 000300 DATE-WRITTEN. 02/05/96 21:04. 000400* AUTHOR EDUARDO RODRIGUEZ AVILA 000500 ENVIRONMENT DIVISION. 000600 CONFIGURATION SECTION. 000700 SOURCE-COMPUTER. RM-COBOL. 000800 OBJECT-COMPUTER. RM-COBOL. 000900 001000 DATA DIVISION. 001100 FILE SECTION. 001200 100000 PROCEDURE DIVISION. 100100 100200 MAIN-LOGIC SECTION. 100300 BEGIN. 100400 DISPLAY " " LINE 1 POSITION 1 ERASE EOS. 100500 DISPLAY "Hello, world!!!" LINE 15 POSITION 1O. 100600 STOP RUN. 100700 MAIN-LOGIC/EXIT. 100800 EXIT. GNU Eiffel 12 13 13 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1960 Algol 60 ; ; Versin Algol 60 ; BEGIN FILE F (KIND=REMOTE); EBCDIC ARRAY E [0:11]; REPLACE E BY "Hello, world!!!"; WHILE TRUE DO BEGIN WRITE (F, *, E); &NBSP; END; END. GNU Eiffel 13 14 14 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1964 Basic 10 REM 20 REM Ejemplo 30 REM 40 print "Hello, world!!!" 50 goto 40 GNU Eiffel 14 15 15 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1965 PL/I /* Versin PL/1 */ Hello: procedure options(main); declare My_String char(20) varying initialize('Hello, world!!!'); put skip list(My_String); end Test; GNU Eiffel 15 16 16 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1967 Simula Begin while 1 = 1 do begin outtext ("Hello, world!!!"); outimage; end; GNU Eiffel 16 17 17 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1971 Pascal (* Ejemplo *) Program Hello (input, output); Begin writeln('Hello, world!!!'); End GNU Eiffel 17 18 18 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1972 C /* Ejemplo */ #include <stdio.h> main() { for (;;) { printf ("Hello, world!!!\n"); } } GNU Eiffel 18 19 19 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1972 Prolog % % Ejemplo % hello :- printstring ("Hello, world!!!"); printstring ([]) printstring ([H|T]) :- put (H), printstring (T). GNU Eiffel 19 20 20 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 19719 Ada -- -- Ejemplo -- with Text_Io; use Text_Io; procedure Hello is begin put ("Hello, world!!!"); end Hello; GNU Eiffel 20 21 21 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1980 Modula 2 (* Ejemplo *) MODULE PrintHelloWorld; FROM InOut IMPORT WriteString, WriteLn; BEGIN WriteString('Hello world!'); WriteLn; END PrintHelloWorld. GNU Eiffel 21 22 22 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1983 C++ // Ejemplo // #include <iostream.h> int main() { cout <<"Hello, world!!!" << '\n'; return 0; } GNU Eiffel 22 23 23 Lenguaje de programacin - Ejemplos Ao Lenguaje Descripcin 1996 Java public class HelloWorld { public static void main (String[] args) { System.out.println("Hello, world!\n"); } } GNU Eiffel 23 24 24 Select case expresin case expresin: proposicin case expresin: proposicin case else: proposicin End select 1 if (expresin) then proposicin 2 Lenguaje de programacin - Gramtica Gramtica estudia Morfologa Sintaxis Oracin Palabras forma estructura Ejemplo GNU Eiffel 24 25 25 Alto nivel de abstraccin Bajo nivel de abstraccin Programa fuente (Lenguaje fuente) Programa objeto (Lenguaje objeto) Traductor (Lenguaje de Implementacin) Semntica Semntica Traductor Esquema funcional GNU Eiffel 25 26 26 Lenguaje programacin Ejecucin de programa Intrprete Traductor Intrprete Ensamblador Compilador Cargar, analizar y ejecutar Fcil depuracin Lentitud - bucles Uso memoria Traductor - Intrprete Caractersticas GNU Eiffel 26 27 27 Lenguaje ensamblador Lenguaje mquina Ensamblador Traductor Intrprete Ensamblador Compilador Traductor - Ensamblador GNU Eiffel 27 28 28 Lenguaje programacin Lenguaje mquina Compilador Traductor Intrprete Ensamblador Compilador Optimizacin cdigo Eficiencia cdigo resultante Velocidad Memoria Traductor - Compilador Caractersticas GNU Eiffel 28 29 29 Los Diagramas de TombStone o Maquinas T Traductor - Notacin y simbologa GNU Eiffel 29 P L Programa L S M Compilador M Mquina L M Intrprete 30 30 P L ordenar sparc ordenar x86 grafos z80 Representacin Programa P escrito en un Lenguaje L (Cdigo ejecutable para la mquina L) Representacin de una Mquina ejecutando cdigo mquina M M z80 x86 sparc Traductor - Notacin y simbologa GNU Eiffel 30 Scalable Processor ARChitecture RISC - Sun Microsystems Zilog Z80 - Federico Faggin Intel - 8080 31 31 Un programa corre en una mquina cuando est en el cdigo de la mquina. L = M P L M grafos z80 sparc ordenar x86 x86 Traductor Coherencia en los Diagramas GNU Eiffel 31 Todo se ejecuta sobre una mquina real 32 32 Traductor Coherencia en los Diagramas GNU Eiffel 32 Coherencia de interpretacin L M M P L Iguales Iguales L S M P L P S M Iguales Iguales Iguales Coherencia de Compilacin 33 33 S: lenguaje origen, T: lenguaje destino y L: lenguaje de implementacin para una mquina particular T S L x86 z80 sparc x86 z80 x86 Traductor - Representacin GNU Eiffel 33 S L T z80 sparc x86 z80 x86 x86 34 34 z80: lenguaje origen, x86: lenguaje destino y x86: lenguaje de implementacin. Estos 2 ltimos as mismos compilados? Traductor - Representacin GNU Eiffel 34 z80 x86 x86 x86 z80 x86 Compilador Z80 x86 Interpretes x86 x86 Interpretes x86 x86 Semntica equivalente Caer en una ambigedad x86 IF FOR THEN FOR ENDIF 35 35 z80: lenguaje origen, x86: lenguaje destino y x86: lenguaje de implementacin. Estos 2 ltimos as mismos compilados? Traductor - Representacin GNU Eiffel 35 z80 x86 x86 x86 z80 x86 Compilador z80 x86 Nueva Simbologa? 36 36 Traductor implementado en lenguaje M de un programa escrito en un lenguaje S a otro escrito en un lenguaje T P T P S T S M M Traductor - Representacin GNU Eiffel 36 37 37 El programa ordenar es traducido a cdigo de mquina para la arquitectura Intel x86 ordenar sparc x86 sparc x86 ordenar x86 x86 x86 ordenar x86 Traductor - Ejemplo GNU Eiffel 37 38 38 Traductor - Notacin y simbologa GNU Eiffel 38 39 39 Un traductor se ejecuta sobre una mquina M solo si est escrito en cdigo mquina M. El programa fuente debe escribirse en el lenguaje fuente S del traductor. El programa destino estar escrito en el lenguaje destino T del traductor. El programa destino debe ser semnticamente equivalente al programa fuente Traductor - Consideraciones generales GNU Eiffel 39 40 40 ordenar sparc x86 z86 x86 x86 Traductor - Consideraciones generales Ejemplo GNU Eiffel 40 41 41 Traductor sparc a 68000 y traductor 68000 a x86. Dos etapas (n=2), dos traductores y un lenguaje intermedio (n-1) Traductor - Traductores de n etapas GNU Eiffel 41 ? ? 42 42 Compiladores Cruzados GNU Eiffel 42 Se denomina compilador cruzado (en ingls cross-compiler) a un compilador que se ejecuta en una mquina pero el cdigo objeto es para otra mquina. Y la forma cruzada? 43 43 Compiladores Cruzados (modelo) GNU Eiffel 43 Si L S N se ejecuta a travs de S M M, entonces se tiene un compilador L M N , es decir un compilador de L a N que se ejecuta en M. Ntese que el lenguaje de implementacin S del compilador L S N debe ser el mismo que el lenguaje fuente del compilador ya existente S M M, y a dems el lenguaje objeto M del compilador ya existente debe ser el mismo que el lenguaje de implementacin de L M N. Notacin en T 44 44 Compiladores Cruzados (BOOTSTRAPPING) GNU Eiffel 44 BOOTSTRAPPING (truco de arranque) se basa en utilizar las facilidades que ofrece un lenguaje para compilarse a s mismo. Este puede plantear la cuestin: Qu fue primero, el huevo o la gallina? El lenguaje Pascal fue implementado por medio de varios booststrapping logrando as, construir un compilador para el Pascal completo, implementado por primera vez por Niklaus Wirth (1971) 45 45 Compiladores Cruzados (BOOTSTRAPPING-Ejm.) GNU Eiffel 45 Supngase que escribimos un compilador L L N, para un lenguaje L, escrito en L para una mquina N. Pero las tareas de desarrollo se llevan a cabo en otra mquina M, donde existe un compilador L M M. En un primer paso se obtiene un compilador cruzado L M N, que se ejecuta sobre M y produce el cdigo para N: 46 46 Compiladores Cruzados (BOOTSTRAPPING-Ejm.) GNU Eiffel 46 El resultado de la segunda compilacin es un compilador L N N que se ejecuta en una mquina N, y produce un cdigo para N. Sin embargo el compilador est construido en una mquina M 47 47 Notacin T (Ejercicios) GNU Eiffel 47 1. Se tiene dos compiladores que se ejecutan en la misma mquina H, uno de los cuales traduce lenguaje A al lenguaje B mientras que el otro traduce el lenguaje B al lenguaje C, El resultado es?: 2. Sea A H B; Se pide construir un compilador en una mquina M para que traduzca dicho lenguaje A en Lenguaje B pero para una mquina K. 3. Se ha elaborado un traductor de un Lenguaje A (origen) a un Lenguaje H (destino). Asumiendo que solo tenemos Mquinas con arquitectura x86 y z80 respectivamente; es posible construir un compilador para ambas arquitecturas(inicio y final)? Sabiendo que la mquina z80 predomina. Si es as; dibuje el modelo de maquinas. Desarrollo: Notacion_T_desarrollado.odt 48 48 Compilador - Concepto GNU Eiffel 48 49 49 Front End Back End Tabla smbolos Manejo errores Compilador - Fases Programa fuente Anlisis lxico Anlisis sintctico Anlisis semntico TOKENS ARBOL SINTCTICO ARBOL SEMANTICO Generacin cdigo intermedio Optimacin cdigo Generacin cdigo Programa objeto CODIGO INTERMEDIO CODIGO OPTIMADO GNU Eiffel 49 50 50 Programa fuente Analizador lxico Componentes lxicos Representacin intermedia Analizador sintctico Generador de cdigo intermedio Traductor dirigido por la sintaxis Compilador - Etapa inicial GNU Eiffel 50 51 51 Compilador de una pasada Generacin de cdigo intermedio Anlisis sintctico Anlisis lxico Compilador Compilador de una pasada GNU Eiffel 51 52 52 PARSER Analizador Sintctico RASTREADOR Programa fuente CHEQUEO TIPOS GENERACIN CDIGO Programa objeto Fcil implementacin Cdigo mediana eficiencia Requerimiento extenso de memoria Convenientes si es precisa velocidad Compilador De una pasada Caractersticas GNU Eiffel 52 53 53 PARSER Analizador Sintctico RASTREADOR Programa fuente CHEQUEO TIPOS GENERACIN CDIGO Front End Back End Programa objeto OPTIMADOR CDIGO GENERADOR CDIGO Modularidad Bajo requerimiento memoria Mejora velocidad ejecucin (Compilador) Compilador De dos pasadas Caractersticas GNU Eiffel 53 54 54 Lex, Flex Yacc, Bison Assembler Doxygen Compilador - Herramientas GNU Eiffel 54 Construccin de un Traductor Ms. Visual Basic .Net (ver 2008 2010) 55 55 Elimina elementos Tabulacin (\ t) Fin de lnea (tomar en cuenta) (\ n) Comentarios Determina lexemas - tokens Operadores = + - ( ) { } := < > Palabras clave while, for, if Constantes numricas 3, 0x34AF, -1.6e-19 Cadenas caracteres posicin, velocidad Literal caracter x, y Existen generadores Lex, Flex Compilador - Anlisis lxico Caractersticas Analizador lexicogrfico, escner, rastreador GNU Eiffel 55 56 56 Compilador Anlisis lxico Tokenizacin Token = ( Tipo, Valor ) Rastrea lneas de cdigo en busca de lexemas y los clasifica en tokens, cada token tiene un Tipo y un Valor GNU Eiffel 56 57 57 B i e n v e n i d o s a l c u r s o c o m p i l a d o r e s Compilador - Anlisis lxico Adjetivo Preposicin + artculo c u r s o Sustantivo Sustantivo B i e n v e n i d o s a l c o m p i l a d o r e s Ejemplo En lenguaje natural GNU Eiffel 57 58 58 Compilador Anlisis lxico Ejemplo En lenguaje de programacin ( Operador, = ) = ( Literal, 100000 ) 1 0 0 0 0 0 ( Identificador, n_dias ) n _ d i a s ( Operador, x ) x ( Identificador, total_h ) t o t a l _ h ( Puntuacin, ; ) ; GNU Eiffel 58 t o t a l _ h = n _ d i a s x ; / / h o t e l 1 0 0 0 0 0 59 59 Componente lxico Cadena caracteres Significado Identificador Palabra clave Compilador Anlisis lxico GNU Eiffel 59 60 60 Compilador Anlisis lxico Ejercicio GNU Eiffel 60 Sea el siguiente Ejemplo: X1 := a + bb * 12 ; X2 := a / 2 + bb * 12 ; Elaboremos los Tokens Para algunos tipos: -Identificador : Id -Operacin : Op -Literales : Lit -Puntuacin : Punt 61 61 Compilador Anlisis sintctico Ejemplo t o t a l _ h = n _ d i a s x 1 0 0 0 0 0 ; / / h o t e l Sentencia de asignacin Expresin Analizador gramatical o Parser Agrupa tokens en frases gramaticales Genera rbol sintctico o de parser Existen generadores: yacc total_h = n_dias x 1000; // Hotel Caractersticas GNU Eiffel 61 Compilador Anlisis sintctico Analizador gramatical o Parser Construccin de un rbol sintctico rbol gramatical rbol de estructura (GRAMATICA) Consta de un conglomerado de Sentencias Consta de un SentAsig (contiene una Expresin) SentAsig Var := Expresin ; Consta de una Expresin ( [1] ) Expresin Expresin Trmino | Trmino Consta de un Trmino (es un producto) Trmino Trmino^Factor | Trmino*Factor | Trmino/Factor | Factor Consta de un Factor (parte de un producto) Factor (Expresin) [1] | Id Indicaciones GNU Eiffel 63 63 Compilador Anlisis sintctico Sentencia SentAsig Trmino total_h = Expresin ; Trmino x Factor Factor n_dias 1000 Recursividad Ejemplo total_h = n_dias x 1000; // Hotel GNU Eiffel 63 64 64 Compilador Anlisis sintctico Ejemplo X1 := a + bb * 12 ; X2 := a / 2 + bb * 12 ; GNU Eiffel 64 Dibuje un rbol de anlisis gramatical para la lneas de cdigo: Compilador Anlisis sintctico Sentencia SentAsig X2 = Expresin ; GNU Eiffel Sentencia Sentencia Sentencia SentAsig X1 = Expresin ; Expresin + Trmino Trmino * Factor Trmino Factor a Factor bb 12 Expresin + Trmino Trmino / Factor Trmino Factor a 12 Trmino * Factor Factor bb 12 66 66 Compilador Anlisis semntico Determina significado (semntica) del programa Funciones Verificacin esttica del programa Declaracin y uso de variables Compatibilidad de tipos Cantidad y tipo de parmetros en invocaciones Dimensin de arreglos Conversin de tipos cuando sea posible Generacin representacin intermedia rbol abstracto de sintaxis o rbol abstracto de estructura Caractersticas Chequeador de tipos GNU Eiffel 66 67 67 = total_h x n_dias 1000 Compilador Anlisis semntico Ejemplo total_h = n_dias x 1000; // Hotel Ejercicio 2 Dibuje un rbol abstracto sintctico para la lnea de cdigo: SI ( a > 5 ) ENTONCES z := z * 3 GNU Eiffel 67 68 68 Compilador Anlisis semntico Ejercicio 3 Dibuje un rbol abstracto sintctico para la lnea de cdigo: X1 := a + bb * 12 ; X2 := a / 2 + bb * 12 ; GNU Eiffel 68 SI ( A < B ) ENTONCES X := X + 1 SINO X := X - 1 Ejercicio 4 Ejercicio 5 Y en caso de Usar Condicionales anidadas o varias condiciones (SELECT o SWITCH), como sera???? 69 69 Compilador Anlisis semntico Ejercicios DESARROLLAR TALLER: AAG_AAS.pdf GNU Eiffel 69 70 70 Compilador - Generador cdigo intermedio Representacin intermedia del cdigo (RI, sinnimos LI,CI) Cdigo intermedio generado debe ser fcil de generar y de traducir a instrucciones de procesador Tipos de cdigo intermedio Arboles abstractos de sintaxis Grafos Notacin posfija Caractersticas GNU Eiffel 70 71 71 Compilador - Generador cdigo intermedio Grafos GNU Eiffel 71 Del problema anterior (Ejercicios 3): tenemos su RI := X1 + a * bb 12 := X2 + / * bb 12 a 2 Optimizarlo Para un RI Modificado 72 72 Compilador - Generador cdigo intermedio Grafos GNU Eiffel 72 Del problema anterior (Ejercicios 3): tenemos su RI := X1 + a * bb 12 := X2 + / a 2 Entonces el 2do rbol deja de comportase como es y se transforma en un GRAFO 73 73 Compilador - Generador cdigo intermedio GNU Eiffel 73 PROBLEMAS con expresiones 5+((1+2)*4)-3 Forma de entender el problema matemticamente PROBLEMA: y cmo entendrla programablemente??? 74 74 Compilador - Generador cdigo intermedio GNU Eiffel 74 Expresiones infija y posfija La Notacin Polaca Inversa, o notacin de postfijo, (en ingls, Reverse polish notation, o RPN), es un mtodo algebraico alternativo de introduccin de datos. Su nombre viene por analoga con la relacionada notacin polaca, una notacin de prefijo introducida en 1920 por el matemtico polaco Jan Lukasiewicz 75 75 Compilador - Generador cdigo intermedio GNU Eiffel 75 Expresiones infija y posfija Del problema anterior la notacin matemtica se entiende por expresiones INFIJAS Pero una mquina no tiene nuestra lgica por tanto debe darse una apoyo algortmico y es transformar dicha expresin INFIJA a POSTFIJA Por que???? 5+((1+2)*4)-3 76 76 Compilador - Generador cdigo intermedio GNU Eiffel 76 Expresiones infija y posfija COMPLEJIDAD Matemtica: Los parntesis ( ) COMPLEJIDAD Operacional: La aritmtica y la lgica SOLUCIN: Crear un algoritmo que me permita cambiar expresiones INFIJAS a POSTFIJAS, para luego estas evaluarlas con otro algortmo 77 77 GNU Eiffel 77 Pseudocdigo: Conversin infija a posfija ALGORITMO Infija_PostFija INICIO Ingresar expresin Infija a lista E Crear lista de salida L, y TDA Pila P MIENTRAS Pto E != EOF y no ERROR HACER SEGUN SEA E CASO E si es nmero Insertar dato de E al final de L CASO E si es variable Insertar dato de E al final de L CASO E si es PaIZQ Insertar dato de E a P CASO E si es PaDER . . . 78 78 GNU Eiffel 78 Pseudocdigo: Conversin infija a posfija CASO E si es PaDER MIENTRAS P no vacia Y cima != PaIZQ HACER Extraer elemento de P Insertar al final de L FINMIENTRAS SI cima = PaIZQ ENTONCES Eliminar dato de P SINO Error detectado FINSI CASO E si es un operador MIENTRAS P no vacia Y cima != PaIZQ Y Prioridad_Operador (cima) >= Prioridad_Operador (E) HACER Extraer elemento de P Insertar al final de L FINMIENTRAS Insertar E en P FINSEGUN Pto E sig FINMIENTRAS . . . 79 79 GNU Eiffel 79 Pseudocdigo: Conversin infija a posfija MIENTRAS P no vacia HACER Extraer elemento de P Insertar al final de L FINMIENTRAS Eliminar P FIN NOTA: Debe consignarse la prioridad de los operadores tal como: 80 80 GNU Eiffel 80 Pseudocdigo: Conversin infija a posfija Desarrollar graficamente el manejo del algoritmo anterior para los siguientes problemas: 1) A* B / ( A+ C ) 2) 4 * ( 5 + 6 - ( 8 / 2 ^ 3 ) 7 ) - 1 Desarrollo de estos problemas en Ejercicios/notacin InFija y AAS desarrollado.docx 81 81 INFIJA POSFIJA 5+((1+2)*4)-3 5 1 2 + 4 * + 3 - Compilador - Generador cdigo intermedio Expresiones infija y posfija GNU Eiffel 81 Explicacin en Ejercicios/notacin InFija y AAS desarrollado.docx 82 82 INFIJA POSFIJA ((A-C)*D)/(A+(B+D)) Compilador - Generador cdigo intermedio Ejercicios infija y posfija GNU Eiffel 82 Y Si lo expresramos en forma de rbol Notacin PostFija: Su recorrido es Izquierda - Derecha - Raz 83 83 POSFIJA Compilador - Generador cdigo intermedio Ejercicios GNU Eiffel 83 Para su construccin nos guiamos de la notacin Post Fija pero esta debe ser lea de derecha a izquierda y: IDR ahora RDI AC-D*ABD++/ Explicacin en Ejercicios/notacin InFija y AAS desarrollado.docx 84 84 Compilador - Generador cdigo intermedio Ejercicios GNU Eiffel 84 4 / ( 14 + ( 7 * 3 ) 2 ) POSFIJA POSFIJA 4 14 7 3 * + 2 - / AAS -1 b * b 2 ^ 4 a * c * - 1 2 / ^ + 2 / a * 85 85 Ejercicios DESARROLLAR TALLER: Notacion_POSTFIJA_PRIO_AAS.pdf GNU Eiffel 85 Compilador - Generador cdigo intermedio 86 86 Generacin de cdigo Caractersticas Implica una asignacin de registros y memoria La notacin PostFija ayuda a poder manejar operaciones y operandos mediante la estructura de datos: PILA (Memoria) El uso de parntesis se descarta haciendo que la complejidad de una operacin sea ms fcil de manejar en la memoria. Trabajar directamente con registros y memorias garantiza que las operaciones se efecten mucho ms rpido GNU Eiffel 86 87 87 Estructura que contiene para almacenamiento y acceso: Identificador Atributos de identificador Realizan dos operaciones: la insercin y la bsqueda. En la operacin de insercin, esta se realiza cuando se procesa una declaracin. En la bsqueda, se detectan los identificadores que no hayan sido declarados previamente, emitiendo un mensaje de error. Tabla de smbolos Caractersticas GNU Eiffel 87