Secuenciamiento con expresiones aritméticas, Representación de estructura de árbol, Sintaxis para expresiones, Notación posfija(sufija o polaca inversa), Notación infija, Semántica para expresiones, Evaluación prefija, Evaluación infija, Jerarquía de oper
Control implícito y explícito de secuencias.
Las estructuras de secuencias se pueden
clasificar en 3 grupos:
-
Estructuras
que se usan en expresiones, como reglas de precedencia y paréntesis;
-
Estructuras
que se usan entre enunciados o grupos de enunciados, como enunciados
condicionales e iterativos; y
-
Estructuras
que se usan entre subprogramas, como llamadas de subprogramas y corrutinas.
Las estructuras de control de secuencias
pueden ser implícitas o explícitas. Las estructuras de control de secuencias
implícitas (o por omisión) son las que el lenguaje define que están en
operación, a menos que sea modificado por alguna estructura explícita. Dentro
de estas expresiones existen una jerarquía de operación definidas por el
lenguaje, que controla el orden de ejecución de las operaciones de la expresión
cuando no existe paréntesis.
Las estructuras explícitas de control de
secuencias son las que el programa puede optar para modificar el orden
implícito definido por el lenguaje; ejemplo, usando paréntesis dentro de las
expresiones y etiquetas de enunciados.
Secuenciamiento con expresiones
aritméticas.
Consideremos la formula siguiente:
Raiz=
-b ± Ö b2 - 4´a´c
2´a
Un lenguaje ensamblador o de maquina
requiere al menos 15 instrucciones para obtener el resultado. Sin embargo el
lenguaje FORTRAN, puede codificarlo en una sola expresión.
ROOT= (-b +
SQRT (b**2-4*a*c)) / (2*a)
Estas expresiones son un dispositivo
poderoso y natural para representar series de operaciones aunque se plantean
nuevos problemas, el programador entiende el orden de las operaciones pero ¿qué
hay con las expresiones?, en la expresión en FORTRAN es correcta, pero como
saber que la sustracción tiene lugar después de la multiplicación (b**2-4*a*c),
los mecanismo de control de secuencias que determinan el orden de las
operaciones son bastantes complejas y sutiles
Figura 1. Representación de árbol
de la formula cuadratura
Representación de estructura de
árbol.
Las
expresiones se han considerado como entidades únicas, sin tomar en cuenta la sintaxis
de una expresión dada, al considerar las operaciones dentro de una expresión,
llamaremos OPERANDOS a los argumentos de una operación.
El
mecanismo del control de secuencias en expresiones es la composición funcional,
se especifica una operación y sus operandos. La composición final confiere a la
expresión la estructura característica de un árbol, donde la raíz es la
operación principal y las hojas los referentes de datos.
La representación de árbol aclara la
estructura de control de la expresión. Los niveles más bajos en el árbol sirven
como operandos para operaciones a nivel mas altos en el mismo, estas
referencias de datos y operaciones se deben evaluar primero.
Figura 2. Forma de árbol para la
expresión simple: (a+b)´(c-a).
En la fig 1 no esta claro si -b se debe
evaluar antes o después de b**2, ni tampoco si b se puede conbinarse en una
sola referencia. En una definición de lenguaje; es común definir el orden de
evaluación de la expresión sólo al nivel de la representación de árbol y
permitir que el implementador del lenguaje decida el orden de evaluación en
detalle.
Antes de examinar el problema es apropiado
chequear la representación sintáctica para expresiones que están en uso.
Sintaxis
para expresiones.
Si las expresiones son representadas
característicamente por arboles, entonces, usar expresiones dentro de
programas, sé requierelinealizar los arboles, es decir, se debe disponer de
notaciones para escribir los arboles como series lineales de símbolos.
Notación
prefija(polaca prefija): Se escribe primero el símbolo de la
operación seguido de operandos en orden de izquierda a derecha, si un operando
a su ves es una operación con operandos. Se aplica el mismo criterio, en la
figura anterior, el árbol se convierte en x + a b - c a. Puesto que el signo +
es un operador diádico, los argumentos para + son a y b, y similar los
argumentos para x son +y-, no se necesita paréntesis para especificar como
evaluar la expresión.
Una variante es el LISP(designada como
polaca de Cambridge). En esta, un operador y sus argumentos están rodeados por
paréntesis. Una expresión se ve, por tanto, como un conjunto anidado de lista,
donde cada lista comienza con un símbolo de operandos. En polaca de Cambridge
la fig. anterior se convierte en:
(x(+ab)(-ca))
Considerando la formula de la figura 1 en
notación prefija (usando para exponenciación, Ö para sqrt y _ para menos unaria)
/+_bÖ-b2xx4acx2a
(polaca)
(/(+(_b)(Ö(-(b2)(x(x4a)c))))(x2a))
(polaca de Cambridge)
Notación posfija(sufija o polaca
inversa): Esta notación es similar a la
notación prefija excepto que el símbolo de operación sigue a la lista de
operandos. Ej la figura anterior se representa como ab+ca-x.
Notación infija: esta notación es mas adecuada para operaciones binarias, en esta
notación el símbolo operador se escribe entre dos operandos, la notación para
estas operaciones ha sido adaptada en lenguaje de programación. La forma infija
para el árbol de la figura anterior es (a+b)x(c-a).
Semántica
para expresiones.
Cada una de las 3 notaciones prefija,
posfija e infija, tiene cierto atributo que son útiles en el diseño de lenguaje
de programación. Difieren en la manera de calcular el valor para cada
expresión. Proporcionan algoritmos para evaluar cada formato de expresión, para
hacer más fácil la evaluación de expresiones.
Evaluación prefija: Con notación prefija se puede evaluar cada expresión en un solo
examen, sin embargo es necesario conocer el numero de argumentos para cada
operación, por esto es necesario utilizar signos especiales para sustracciones
diadicas(-) y menos unarias(_), para distinguir las operaciones.
Además del ahorro de paréntesis, tiene un
valor en el diseño de lenguaje de programación.
1.-
La llamada de función usual ya está escrita en notación prefija.
2.- La notación prefija se puede usar para
representar operaciones con cualquier numero de operandos y es, por tanto,
completamente general
3.-
Es relativamente fácil decodificar mecánicamente; por esto se consigue
con facilidad expresiones prefijas a secuencias de código simple.
Evaluación posfija: en esta notación el operador sigue a sus operandos, cuando se examina
un operador sus operandos ya fueron evaluados. La evaluación de una expresión
pos fija P usando una pila, ahora tiene lugar, como sigue:
1.- Si el elemento siguiente de P es un
operando, colocarlo en la pila.
2.- Si el elemento siguiente de P es un
operador n-ario, entonces sus n argumentos deben ser los n elementos superiores
en la pila. Reemplazar estos n elementos por el resultado de aclarar esta
operación usando los n elementos como argumento.
La evaluación es directa y fácil de
implementar el generador de códigos usara el algoritmo antes mencionado para
determinar el orden del código de generación para contar el valor de la
expresión.
|
|
|
|
|
|
|
 |
|
td align=left valign=top>
 |
|
(A)
(B)
Figura 3. Orden de evaluacion de
operadores.
Evaluación infija: Aunque estas notaciones común, su uso en un lenguaje de programación
conduce a varios problemas siguientes.
1.- Puesto que la notación infija se
adecua solo para operadores binarios, es necesario conbinarlo con otra notación
ya sea prefija o posfija. La mezcla hace que la traducción sea más complejas,
los operadores unarios y las funciones con argumento múltiples deben ser
excepciones a la propiedad infija general.
2.- Cuando aparece mas de un operador
infijo en una expresión, la notación en inherentemente ambigua a menos que se
utilicen paréntesis.
En este ultimo punto se demuestra que el
valor de la expresión 2x3+4,la expresión significa 10, pero con la misma
facilidad puede ser 14. En la figura 3 (A) se hace la multiplicación antes que
la suma y el figura 3 (B) es la suma antes que la multiplicación.
Se puede usar paréntesis para eliminar la
ambigüedad de cualquier expresión indicando explícitamente el agrupamiento de
operadores y operandos, como en (AxB)+C o Ax(b+C), pero la expresión complejas
los nidos profundos de paréntesis que
resultan se vuelven confusas.
Jerarquía de operaciones: los operadores de una expresión están puestas en una jerarquía u
orden de precedencia. La jerarquía de ADA es representativa (Tabla 1). En la
expresión donde intervienen operadores de mas de un nivel en la jerarquía, la
regla implica que los operadores de mayor precedencia se ejecutan primero, así,
en axb+c, x esta arriba de + en la jerarquía por eso se ejecuta primero.
Nivel de precedencia
Operadores Operaciones
Precedencia
mas alta ** abs not Exp,valor abs., negación
*/
mod rem Multiplicación,
división
+- Adición,
sustracción unaria
+-& Adición, sustracción
binaria
=£<>³
Relacionales
precedencia
más baja and or xor Operaciones booleanas
Tabla 1. Jerarquía de operaciones
en Ada.
Precedencia Operadores Nombres de operadores