miércoles, 13 de mayo de 2009

HERRAMIENTAS PARA LA CONSTRUCCION DE UN COMPILADOR

Herramientas

Utilidades y Generadores de Compiladores

A continuación se muestran algunas de las herramientas disponibles que pueden utilizarse para la realización del Proyecto de Compiladores. Todas estas herramientas funcionan bajo Windows.





Ensambladores Simbólicos ENS

Los ensambladores simbólicos ENS permiten ensamblar, ejecutar y depurar el código ensamblador generado por el compilador. Dentro de los ficheros comprimidos que se pueden obtener en la tabla, se encuentra información sobre su uso, su sintaxis y algún ejemplo de funcionamiento. El compilador construido en el Proyecto de Compiladores tiene que generar como código objeto uno de estos ensambladores.




GENERACION DE MEMORIA EN TIEMPO DE EJECUCION

ORGANIZACIÓN DE LA MEMORIA

Tiempo de ejecución

Se denomina Tiempo de ejecución (Runtime en inglés) al intervalo de tiempo en el que un programa de computadora se ejecuta en un sistema operativo. Este tiempo se inicia con la puesta en memoria principal del programa, por lo que el sistema operativo comienza a ejecutar sus instrucciones.

El intervalo finaliza en el momento en que éste envía al sistema operativo la señal de terminación, sea ésta una terminación normal, en que el programa tuvo la posibilidad de concluir sus instrucciones satisfactoriamente, o una terminación anormal, en el que el programa produjo algún error y el sistema debió forzar su finalización.

La memoria durante el momento de ejecución debe estar subdividida de modo que pueda almacenar los siguientes elementos:

1. La tabla de símbolos.
2. Código objeto generado.
3. Espacio para la realización de operaciones o procedimiento.

El código objeto tiene un tamaño fijo determinado en el momento de la compilación, de este modo la asignación de memoria para éste elemento resulta estática y se deja un lugar en el cual no se efectúe el uso de la memoria. La razón de asignación estática es que las direcciones no van a estar en constante cambio.
De manera similar se puede conocer el tamaño de algunos datos en el momento de la compilación y por lo tanto estos pueden ir colocados en una zona estática.
Los datos cuyas direcciones están contenidas en la activación de un procedimiento se pueden asociar y colocar en una pila.
Un área distinta de la memoria para el monumento de la ejecución se llama montículo.

REGISTROS DE ACTIVACION

La información necesaria para usar una sola ejecución de un procedimiento se consigue utilizando un bloque contigo de memoria llamado registro de activación o marco, que consta del conjunto de campos listados a continuación:

TEMPORALES, los valores temporales como los que surgen en la evaluación de expresiones es almacenada en seta posición.
DATOS LOCALES, guardan los datos locales a una ejecución de un procedimiento.
ESTADO DE LA MAQUINA GUARDADO, contiene información sobre el estado de la maquina justo antes de que sea llamado el procedimiento. La información incluye los valores del contador del programa y los registro de la maquina que debe reponerse cuando el control regrese del procedimiento.

ENLACE DE ACCESO OPCIONAL,se utiliza para hacer referencia a los datos no locales guardados en otros registros de activación.
ENLACE DE CONTROL, apunta al registro de activación del autor de la llamada.
PARAMETROS ACTUALES, es utilizado por el procedimiento autor de la llamada para proporcionar parámetros al procedimiento que recibe la llamada. Existe espacio para los parámetros en el registro de activación, pero en la practica los parámetros se pasan en los registros de la maquina para una mayor eficiencia.
VALOR DEVUELTO, este campo es utilizado por el procedimiento que recibe la llamada para devolver un valor al procedimiento autor de la llamada. En la practica este valor se suele trasladar en un registro para mayor eficiencia.
Los tamaños de cada uno de estos campos se pueden determinar en el momento que es llamado un procedimiento; de hecho se pueden determinar en el momento de la compilación. Existe una excepción cuando un procedimiento tiene una matriz local cuyo tamaño venga determinando por el valor de un parámetro actual, disponible únicamente cuando el procedimiento sea llamado durante la ejecución.

DISPOSICION ESPACIAL DE LOS DATOS LOCALES

La cantidad de memoria necesaria para una variable viene determinada por su tipo. Un tipo de datos elemental, como un carácter, un entero o un real, se puede almacenar en un número entero de bytes. La memoria para un agregado como una matriz o un registro, debe ser lo suficientemente grande como para dar cabida a todos sus componentes.
Para acceder fácilmente a los componentes, la memoria para los agregados se coloca en un bloque contiguo de bytes.
El campo para los datos locales se perfila conforme se examinen las declaraciones en un procedimiento durante la compilación. Los datos de longitud variable se mantienen fuera de este campo. Se hace un recuento de las posiciones de memoria asignadas a declaraciones anteriores. Según el resultado se determina una dirección relativa de la memoria para un valor local con respecto a una posición, como el comienzo del registro de activación. La dirección relativa o desplazamiento es la diferencia entre las direcciones de esa posición y los objetos de datos.
La disposición de la memoria para los datos seta muy influida por las limitaciones de direccionamiento de la maquina objeto. El espacio que no se usa por consideraciones de alineación se llama relleno. Cuando este espacio es muy pequeño, un compilador puede empaquetar datos de modo que no queda ningún relleno; entonces puede ser necesario practicar instrucciones adicionales durante la ejecución para situar los datos empaquetados de modo que se puedan manipular como si estuvieran alineados en forma apropiada.

ESTRATEGIA PARA LA ASIGNACION DE MEMORIA.

1. ASIGNACION ESTATICA.- Dispone la memoria para todo los objetos de datos durante la compilación
2. ASIGNACION POR MEDIO DE UNA PILA.- Trata la memoria en ejecución como una pila.
3. ASIGNACION POR MEDIO DE UN MONTICULO.- Asigna y desasigna la memoria conforme se necesita durante la ejecución a partir de un área de datos llamada montículo.

ASIGNACION ESTATICA

Las variables se ligan a la memoria durante la compilación del programa. Como a los enlaces, no cambian durante la ejecución, cada vez que se activa un procedimiento, sus nombres se enlazan a las mismas posiciones de memoria. Está propiedad permite que los valores de los nombre locales sean retenidas durante la activación de un procedimiento. Es decir, cuando el control regresa a un procedimiento, los valores de los variables locales son los mismos que cuando el control salió por última vez.
Según el tipo de la variable, el compilador determina la cantidad de memoria que debe reservarse para dicha variable. La dirección de está memoria consta de un desplazamiento desde un extremo del registro de activación del procedimiento el compilador debe decir a donde van los registros de activación. Durante la compilación se pueden proporcionar las direcciones en las que el código objeto pueden encontrar los datos con los que opera.

LIMITACIONES

1. El tamaño de unos objetos de datos y las limitaciones en cuanto su posición en la memoria deben conocerse en el momento de la compilación.
2. Los procedimientos recursivos son escasos porque todas las actividades de un procedimiento utilizan los mismos enlaces para los nombres locales.
3. Las estructuras de datos no se pueden crea dinámicamente. Ya que no hay un mecanismo para la asignación de memoria durante la ejecución.

ASIGNACIÓN POR MEDIO DE UNA PILA

La asignación por medio de una pila se basa en la idea de una pila de control; la memoria se organiza como una pila, y los registros de activación se introducen y se sacan cuando las activaciones comienzan y terminan respectivamente. La memoria para las variables locales en cada llamada de un procedimiento está contenida en el registro de activación de dicha llamada. De este modo en cada activación, las variables locales se enlazan a una memoria nueva, puesto que se introducen a un nuevo registro de activación en la pila al realizar una llamada. Además, los valores de las variables locales se borran cuando finaliza la activación; es decir, los valores se pierden por que la memoria para las variables locales desaparecen cuando se extrae el registro de activación.

SECUENCIA DE LLAMADAS

Las llamadas a procedimientos se implantan mediante la generación de lo que se conoce como secuencia de llamadas en el código objeto. Una secuencia de llamada asigna un registro de activación e introduce información dentro de sus campos. Una secuencia de retorno restablece el estado de la máquina para que el procedimiento que efectúa la llamada pueda continuar con su ejecución.
La secuencia de llamadas y los registros de activación son diferentes, incluso para implementaciones del mismo lenguaje. El código en una secuencia de llamada esta dividido en el procedimiento que hace la llamada y el procedimiento que recibe la llamada. No hay una división exacta entre el llamador y el llamado de las tareas de ejecución (el lenguaje fuente, la máquina objeto y el S.O. impone requisitos que puedan hacer prevalecer una solución sobre la otra).
Un principio que ayuda al diseño de secuencia de llamadas y registros de activación es que los campos cuyos tamaños se fijan primero se colocan en el medio. En el registro de activación general, los campos de enlace de control, enlace de acceso y estado de la máquina aparecen en el medio. La decisión de utilizar o no los enlace de control de acceso es parte del diseño del compilador, de modo que estos campos se pueden fijar durante la construcción del compilador si se guarda exactamente la misma cantidad de información sobre el estado de la máquina, entonces el mismo código puede almacenar y restablecer para todas las activaciones.
Aunque el tamaño del campo para los valores temporales se fija en un determinado momento de la compilación este tamaño puede o no conocerse en la etapa inicial. La generación u optimización cuidadosa del código puede reducir el número temporal de variables que necesita el procedimiento. Por tanto en el registro de activación temporal, se muestra éste campo después de aquel para datos locales, donde los cambios en su tamaño no afectarán a los desplazamientos de los objetos de datos relativos a los cambios de en medio.

GENERACION DE CODIGO INTERMEDIO

El generador de código toma como entrada una representación intermedia del programa fuente y produce como salida un programa objeto equivalente; Es posible producir o no una fase de optimización antes de la generación de código. Dicha fase intente transformar el código intermedio en una forma de la que se pueda producir código objeto más eficiente.
El código intermedio es un código abstracto independiente de la máquina para la que se generará el código objeto. El código intermedio ha de cumplir dos requisitos importantes: ser fácil de producir a partir del análisis sintáctico, y ser fácil de traducir al lenguaje objeto. Esta fase puede no existir si se genera directamente código máquina, pero suele ser conveniente emplearla.

Ejemplo:

Consideremos, por ejemplo, un código intermedio de tercetos, llamado así porque en cada una de sus instrucciones aparecen como máximo tres operandos. La sentencia traducida a este código intermedio quedaría2:
temp1 := inttoreal (2)temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3


El analizador sintáctico va generando acciones que valida el analizador semántico y que se convierten en tercetos. Esta conversión en tercetos constituye el generador de código intermedio.
Dado que el lenguaje puede presentar distintas funciones anidadas, los tercetos los generamos por orden del parser y son almacenados en un sitio u otro dependiendo del contexto en que nos encontremos. Es decir, se almacenan en una lista de tercetos dependiente de la Tabla de Símbolos. Hay tantas listas de tercetos como funciones haya en el código fuente más una lista de tercetos asociada a la Tabla de Símbolos Global
No obstante una vez finalizado el análisis, todos estos tercetos repartidos en distintas listas se vuelcan a una sola lista de tercetos global. Esta será la que finalmente se optimice y a partir de la que se generará el programa en ensamblador.
El problema de tener que manejar tercetos indirectos fue resuelto modificando el método de inserción sobre la lista de tercetos utilizada en cada momento, de manera que se realiza previamente una búsqueda de algún terceto que sea exactamente igual al que estamos insertando. En caso afirmativo, insertamos en la lista no un terceto nuevo, sino un puntero al ya existente, y marcamos dicho terceto como terceto indirecto. Son tercetos indirectos aquellos marcados con un asterisco después del índice en los volcados de la lista de tercetos.

Ventajas:

• Permite abstraer la máquina, separar operaciones de alto nivel de su implementación a bajo nivel.
• Permite la reutilización de los front-ends y back-ends.
• Permite optimizaciones generales
• El código objeto es abstraído para una maquina virtual. esta abstracción ayuda a separar operaciones de alto nivel y realizar dependientes de la maquina.
• La generación de código y el asignamiento de registros temporales son separados de las rutinas semánticas, los cuales solo trabajan con la abstracción presentada por la representación intermedia. las dependencias del código objeto son aisladas de las rutinas de generación de código.
• La abstracción puede ser hecha en el nivel de representación intermedia. esta organización ayuda a hacer una optimización completamente independiente del código objeto, con lo que hace que las rutinas de optimización complejas sean más transportables. debido a que las representaciones intermedias son por diseño mas abstracta y uniforme, las rutinas de optimización puede ser más simples.

Desventajas:

• Implica una pasada más para el compilador (no se puede utilizar el modelo de una pasada, conceptualmente simple).
• Dificulta llevar a cabo optimizaciones específicas de la arquitectura destino.
• Suele ser ortogonal a la máquina destino, la traducción a una arquitectura específica será más larga e ineficiente


Formas de Representación Intermedia

En la historia de los compiladores han sido utilizadas una amplia variedad de representaciones intermedias sin embargo la forma más simple es la notación posfija, la cual también es conocida en matemáticas como notación libre de paréntesis para expresiones aritméticas que han sido utilizadas mucho tiempo antes que los compiladores. Como su nombre lo implica la notación posfija es una representación en la cual los operadores aparecen después que los operandos para los cuales se aplican.
Una de las atracciones principales de la notación posfija es la simplicidad en la traducción de los procesos, y la consistencia de la representación. Estos factores hacen de esta notación la más usual como una representación intermedia para el manejo de intérpretes. de hecho la notación posfija no es muy efectiva como entrada para un optimizador a un generador de código, a menos que el código objeto a generar tenga una arquitectura en forma de pila.

La siguiente clase de representación de código intermedio se refiere a un árbol de 3 direcciones, 2 para los operandos y una para la ubicación del resultado. Esta clase incluye un amplio número de representaciones diferentes entre las cuales encontramos cuádruplos y triples. la principal diferencia entre estas notaciones y la notación posfija es que ellos incluyen referencias explicitas para los resultados de los cálculos intermedios. Mientras que la notación posfija los resultados son implícitos al representarlos en una pila.
La diferencia entre triples y cuádruplos es que con los triples es referenciado el valor intermedio hacia el número del triple que lo creo, pero en los cuádruplos requiere que ellos tengan nombre implícitos.
Los triples tienen una ventaja obvia de ser más consistente, pero ellos dependen de su posición, y hacen que la optimización presente cambios de código mucho más compleja.

Aspectos de Diseño de un Generador de Código

Entrada al generador de código

La entrada para la generación de código consta de una representación intermedia del programa fuente, junto con la información de la tabla de símbolos que se utiliza para determinar las direcciones durante la ejecución de los datos denotados por los nombres de la representación intermedia. El código se puede generar desde el punto de vista del código de 3 direcciones, notación posfija, cuádruplos, triples, etc.
Se asume que antes de la generación de código la etapa inicial a hecho los análisis léxico, semántico, sintáctico y se ha traducido el programa fuente a una representación intermedia razonablemente detallada, así que los valores de los nombres que aparecen en el lenguaje intermedio pueden ser representados por cantidades que la maquina objeto puede manipular directamente. Por lo tanto, la fase de generación de código puede proseguir con la hipótesis de que su entrada no contiene errores.
Programas objeto: La salida del generador de código es el programa objeto. Al igual que el código intermedio esta salida puede adoptar una variedad de formas: Lenguajes de maquina absoluto, lenguaje de maquina relocalizable o lenguaje ensamblador

Lenguaje Máquina Absoluto


Para producir como salida un programa en lenguaje absoluto tiene la ventaja de que se puede colocar en una posición fija de memoria y ejecutarse inmediatamente. Un programa pequeño se puede compilar y ejecuta.

Lenguaje Máquina Relocalizable


Producir como salida un lenguaje maquina relocalizable (modulo objeto) permiten que los programas se compilen por separado .Un conjunto de módulos objeto relocalizables se pueden enlazar. Aunque se tenga que pagar costo de enlazar y cargar si se producen módulos objetos relocalizables, se gana mucha flexibilidad al poder compilar subrutinas por separado y llamar desde el modulo objeto a otros programas previamente compilados.

Lenguaje Ensamblador


Producir Como la salida un programa en lenguaje ensamblador facilita la generación de código. Se pueden generar instrucciones simbólicas y utilizar las macros del ensamblador para ayudar a generar el código, el precio que se paga es el paso de ensamble después de la generación de código.
Como producir código ensamblador no duplica la tarea completa del compilador esta elección es otra alternativa razonable, especialmente para una maquina con memoria pequeña, donde un compilador debe utilizar varias pasadas.

lunes, 11 de mayo de 2009

NUEVOS COMPILADORES LANZADOS POR INTEL

Intel ha lanzado dos nuevos compiladores compatibles con Mac OS X, uno para crear software C++ y otro para producir programas Fortran, diseñados para crear aplicaciones más fiables, de alto rendimiento que aceleran el grado de reacción de un ordenador.
Intel C++ Compiler y Fortran Professional Editions están ampliamente optimizados con bibliotecas de interpretación y el Intel Threading Building Blocks. Ambos compiladores ya están disponibles por desde 600 dólares a 1600 dólares, con actualizaciones a las ediciones profesionales de las versiones previas o bibliotecas disponibles a través de distribuidores.

Ambos compiladores presentan nuevo soporte automático para acelerar el rendimiento del programa en los últimos procesadores multinúcleo de Intel, y aceleran automáticamente el software que contiene gráficos 3D o vídeo a través del uso de vectores vía Streaming SIMD Extensions (SSE), incluyendo las últimas instrucciones SSE 4.

Windows 7 se estrenará a finales del 2009


Microsoft prepara el lanzamiento de Windows 7 para finales de este 2009. La compañía de Redmond espera lanzar su próximo sistema operativo el próximo mes de octubre, concretamente a finales, según las últimas informaciones publicadas en la red. Windows 7 es el siguiente paso dentro de la familia de sistemas operativos Windows. En esta ocasión, la prioridad de Microsoft es aunar la estabilidad de Windows XP, aún vigente en muchos ordenadores, y la interfaz multimedia de Windows Vista, que no terminó de convencer al público.

Windows 7 se prevé como el nuevo centro multimedia de la familia. Adaptado a los ordenadores que disponen de pantallas táctiles, este sistema operativo incluye mejoras en el rendimiento y en la ejecución de tareas, así como novedades en el sistema de navegación de carpertas. Actualmente está disponible la versión beta de Windows 7, que puede descargarse gratuitamente desde la página de Microsoft, donde se obtiene un serial para su registro y utilización hasta comienzos del 2010.

viernes, 8 de mayo de 2009

COMPILADORES ( COLAS DE PRIORIDAD)

Cola de prioridades (estructura de datos)

Una cola de prioridades es una estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen.

Características generales

Este tipo especial de colas tienen las mismas operaciones que las colas FIFO, pero con la condición de que los elementos se atienden en orden de prioridad.

Ejemplos de la vida diaria serían la sala de urgencias de un hospital, ya que los enfermos se van atendiendo en función de la gravedad de su enfermedad.

Entendiendo la prioridad como un valor numérico y asignando a altas prioridades valores pequeños, las colas de prioridad nos permiten añadir elementos en cualquier orden y recuperarlos de menor a mayor.


Implementación

Hay 2 formas de implementación:

Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.
Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.

Tipos

Colas de prioridades con ordenamiento ascendente: en ellas los elementos se insertan de forma arbitraria, pero a la hora de extraerlos, se extrae el elemento de menor prioridad.

Colas de prioridades con ordenamiento descendente: son iguales que la colas de prioridad con ordenamiento ascendente, pero al extraer el elemento se extrae el de mayor prioridad.

Operaciones

Las operaciones de las colas de prioridad son las mismas que las de las colas genéricas:

Crear: se crea la cola vacía.
Encolar: se añade un elemento a la cola, con su correspondiente prioridad.
Desencolar: se elimina el elemento frontal de la cola.
Frente: se devuelve el elemento frontal de la cola.

MAS INFORMACION VISITA ESTAS PAGINAS

http://es.wikipedia.org/wiki/Cola_de_prioridades_(estructura_de_datos)

COMPILADORES ( NOTACION POLACA INVERSA )

Notación polaca inversa


Notación Polaca Inversa (RPN)La Notación Polaca Inversa (RPN en inglés, Reverse polish notation) es un método de introducción de datos alternativo al algebraico. Fue creado por el matemático polaco Jan Łukasiewicz en 1920.

En la década de 1960 ese método fue introducido en las computadoras. Posteriormente, Hewlett-Packard lo aplicó por primera vez en la calculadora de sobremesa HP-9100A en 1968.

Su principio es el de evaluar los datos directamente cuando se introducen y manejarlos dentro de una estructura LIFO (Last In First Out), lo que optimiza los procesos a la hora de programar.

Básicamente la diferencias con el método algebraico son que, al evaluar los datos directamente al introducirlos, no es necesario ordenar la evaluación de los mismos, y que para ejecutar un comando, primero se deben introducir todos sus argumentos, así, para hacer una simple suma 'a+b=c' el RPN lo manejaría a b +, dejando el resultado 'c' directamente.

Nótese que la notación polaca inversa no es literalmente la imagen especular de la notación polaca: con operadores no-conmutativos (como la resta o la división), el orden de los operandos ha de permanecer constante. Así pues, "6/2" se traduce a la notación polaca como "/ 6 2" y a la notación polaca inversa como "6 2 /". Con números superiores a 9, también se sigue la costumbre de escribirlos de izquierda a derecha.

Ventajas

Los cálculos se realizan secuencialmente según se van introduciendo operadores, en vez de tener que esperar a escribir la expresión al completo. Debido a esto, se cometen menos errores al procesar cálculos complejos.
El proceso de apilación permite guardar resultados intermedios para un uso posterior. Esta característica permite que las calculadoras RPN computen expresiones de complejidad muy superior a la que alcanzan las calculadoras algebraicas.
No requiere paréntesis ni reglas de preferencia, al contrario que la notación algebraica, ya que el proceso de apilamiento permite calcular la expresión por etapas.
En las calculadoras RPN, el cálculo se realiza sin tener que apretar la tecla "=" (aunque se requiere pulsar la tecla "Enter" para añadir cifras a la pila).
El estado interno de la calculadora siempre consiste en una pila de cifras sobre las que se puede operar. Dado que no se pueden introducir operadores en la pila, la notación polaca inversa es conceptualmente más sencilla y menos dada a errores que otras notaciones.
En términos educativos, la notación polaca inversa requiera que el estudiante comprenda la expresión que se está calculando. Copiar una expresión algebraica directamente a una calculadora sin comprender la aritmética dará un resultado erróneo.

Desventajas

La adopción casi universal de la notación algebraica en los sistemas educativos hace que no haya muchas razones prácticas inmediatas para que los alumnos aprendan la notación polaca inversa. No obstante, muchos estudiantes afirman que, una vez aprendida, la notación polaca inversa simplifica en gran manera el cálculo de expresiones complejas.
Es difícil usar la notación polaca inversa al escribir a mano, dada la importancia de los espacios para separar operandos. Se requiere un caligrafía muy clara para evitar confundir, por ejemplo, 12 34+ (=46) de 123 4+ (=127) o 1 234+ (=235).
Las calculadoras RPN son relativamente raras. Forzado a usar una calculadora algebraica, el usuario de una calculadora RPN típicamente comete más errores de lo normal debido a sus hábitos de uso normales. No obstante, esto no es un problema tan grave en la actualidad, debido a que muchos sistemas operativos pueden emular calculadoras RPN.

El algoritmo RPN

El algoritmo que utilizan las calculadoras RPN es relativamente simple:

Si hay elementos en la bandeja de entrada
Leer el primer elemento de la bandeja de entrada.
Si el elemento es un operando.
Poner el operando en la pila.
Si no, el elemento es una funcion (los operadores, como "+", no son más que funciones que toman dos argumentos).
Se sabe que la función x toma n argumentos.
Si hay menos de n argumentos en la pila
(Error) El usuario no ha introducido suficientes argumentos en la expresión.
Si no, tomar los últimos n operandos de la pila.
Evaluar la función con respecto a los operandos.
Introducir el resultado (si lo hubiere) en la pila.
Si hay un sólo elemento en la pila
El valor de ese elemento es el resultado del cálculo.
Si hay más de un elemento en la pila
(Error) El usuario ha introducido demasiados elementos.

VISITA ESTE SITIO PARA VER MAS INFORMACION

http://es.wikipedia.org/wiki/Notaci%C3%B3n_polaca_inversa

http://www.fagro.edu.uy/~topografia/docs/El%20sistema%20RPN.pdf

http://upsg01.foroactivo.com/tema-2-estructura-de-datos-paralelo-21-f9/notaciones-prefijainfija-y-posfija-t199.htm

http://lml.ls.fi.upm.es/ftp/pd/www/Problemas/problemas/node33.html

COMPILADORES (NOTACIONES)

NOTACIONES

Las notaciones son una forma especial en la que se pueden expresar una expresión matemática y puedan ser de 3 formas: infija, prefija y posfija. Los prefijos, Pre - Pos - In se refieren a la posición relativa del operador con respecto a los dos operandos.

Operandos

1 + 5

Operador

INFIJA PREFIJA POSFIJA

+15 1+5 15+

NOTACIÓN PREFIJA

Nos indica que el operador va antes de los operandos sus características principales son:

-Los operandos conservan el mismo orden que la notación infija equivalente.

-No requiere de paréntesis para indicar el orden de precedencia de operadores ya que el es una operación.

-Se evalúa de izquierda a derecha hasta que encontrémosle primer operador seguido inmediatamente de un par de operandos.

-Se evalúa la expresión binaria y el resultado se cambia como un nuevo operando. Se repite este hasta que nos quede un solo resultado.

* +A B C (A+B)*C



NOTACION POSFIJA


Como su nombre lo indica se refiere a que el operador ocupa la posición después de los operandos sus características principales son: el orden de los operandos se conserva igual que la expresión infija equivalente no utiliza paréntesis ya que no es una operación ambigua.

-La operación posfija no es exactamente lo inverso a la operación prefija equivalente:

(A+B)*C AB+C*

NOTACION INFIJA

Es la forma mas común que utilizamos para escribir expresiones matemáticas, estas notaciones se refiere a que el operador esta entre los operandos. La notación infija puede estar completamente parentizada o puede basarse en un esquema de precedencia de operadores así como el uso de paréntesis para invalidar los arreglos al expresar el orden de evaluación de una expresión:


3*4=12


3*4+2=14


3*(4+2)=18

ESTA INFORMACION LA VAS A ENCONTRAR EN LA SIGUIENTE PAGINA:

http://boards4.melodysoft.com/app?ID=2005AEDI0303&msg=46