MÉTODOS DE EVALUACIÓN DE EXPRESIONES COMPUTACIONALES
A: NOTACIÓN INFIJA o terrestre, es la notación natural o la que aprendemos en el colegio, por ejemplo, A + B, los operadores en casi su totalidad están en el MEDIO de los operandos.
B: NOTACIÓN INVERSA o marciana, notación desconocida pero muy poderosa en sistemas computacionales, ejemplo A B +, los operadores en su totalidad están DESPUÉS de los operandos, usada en las calculadoras serie hp48/49/50 y parcialmente en la HP-PRIME
C: NOTACIÓN PREFIJA o alienígena, desconocida también pero muy poderosa, + A B, los operadores en su totalidad están ANTES de los operandos, se considera esta notación también como inversa
Algunos parser (analizador sintáctico de expresiones) para poder interpretar una expresión infija, convierten dicha expresión a RPN/NPI, Notación Polaca Inversa,
Ejemplo #1 de conversión y evaluación de notación infija a inversa.
La siguiente expresión en notación infija
a * (b + (c/d) / ee) * (f - g MOD h)
convertida en RPN es la siguiente lista de entrada ( note que no hay paréntesis curvos =) )
{ a b c d / ee / + * f g h MOD - * }
La lista anterior es una secuencia de 15 pasos, que se interpreta como un programa, ahora veamos la lista anterior como una lista vertical o pila de elementos o filas enumeradas (E#), inician con la letra E de Entrada
E1: a
E2: b
E3: c
E4: d
E5: /
E6: ee
E7: /
E8: +
E9: *
E10: f
E11: g
E12: h
E13: mod
E14: -
E15: *
el evaluador ejecuta línea por línea para obtener el resultado final
E1: 2, Primer línea de la pila o lista de entrada anterior, que tiene un objeto (a) que es una variable: la variable a se evalúa a 2 y es colocada en un nuevo stack o pila de salida (S#), la primera fila tendría entonces el número 2, como es un número y no un operador o función, prácticamente no hace nada, sino que solo hace una copia
S1: 2
E2: -7.5, Segunda línea de la lista de entrada, objeto (b) : la variable b se evalúa a -7.5 y es colocado el valor en la 2da posición de la nueva pila
S2: -7.5
E3: 25, Tercer línea, objeto (c) : la variable c se evalúa a 25 y es colocado el valor en la 3ra posición de la nueva pila
S3: 25
E4: -5, Cuarta línea, objeto (d) : la variable d se evalúa a -5 y es colocado el valor en la 4ta posición de la nueva pila
S4: -5
E5: /, Quinta línea, objeto (/) : el operador binario DIVISIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son los dos últimos de la lista de salida E3 y E4, entonces evalúa 25/-5, retornando -5 y este valor es colocado en la 3ra posición de la nueva pila, ya que la 3ra (S3) y 4ta (S4) ya se utilizaron y la última no utilizada S2, el siguiente valor se almacena en S3
S3: -5
E6: ee, Sexta línea, objeto (ee) : la variable ee se evalúa a 2 y es colocado el valor en la 4ta posición de la nueva pila
S4: 2
E7: /, Séptima línea, objeto (/) : el operador binario DIVISIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son la S3 y S4, entonces evalúa -5/2, retornando -2.5 y este valor es colocado en la 3ra posición de la nueva pila, ya que S3 y S4 ya se utilizaron
S3: -2.5
E8: +, Octava línea, objeto (+) : el operador binario SUMA actúa sobre dos argumentos o líneas de la pila, en este caso son la S2 y S3, entonces se evalúa -7.5+-2.5, retornando -10 y este valor es colocado en la 2da posición de la nueva pila, ya que S2 y S3 ya se utilizaron
S2: -10
E8: , Novena línea, objeto () : el operador binario MULTIPLICACIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son la S1 y S2, entonces evalúa 2-10, retornando -20 y este valor es colocado en la 1ra posición de la nueva pila, ya que S1y S2 ya se utilizaron
S1: -20
E10: f, E11: g, E12: h Desde la Décima hasta la 12ava línea tienen como salida
S2: 7
S3: 23
S4: 5
E13: mod, la 13ava entrada requiere dos argumentos para el operador binario MODULO, en este caso son los dos últimos de la lista de salida de salida (S3, S4) 23 MOD 5 retornando 3, ahora S3 es 3
S3: 3
E14: -, la 14ava entrada requiere dos argumentos para el operador binario RESTA, en este caso son los dos últimos de la lista de salida (S2, S3) 7-3 retornando 3, ahora S2 es 4
S2: 4
E15: , la 15ava entrada requiere dos argumentos para el operador binario MULTIPLICACIÓN, en este caso son los dos últimos de la lista de salida (S1, S2) -20*4 retornando -80, ahora S1 es -80, valor final de evaluación
Ejemplo #2 una segunda expresión
+a * -(b + -(c/+d) / -ee) * (f - g MOD h ) * -ii
en RPN es
{ a b c d / NEG ee NEG / + NEG * POSITIVO f g h MOD - * ii NEG * }
Observen que aparece el operador NEG (NEGATIVO) y POS (POSITIVO) no afecta la expresión, en mi caso una expresión en RPN es más fácil evaluarla manualmente que una expresión en notación natural ya que esta última sino tiene paréntesis de ayuda se puede cometer error de evaluación, QUE EN RPN NUNCA SUCEDE
Otra forma de interpretar una expresión RPN, es evaluar de izquierda a derecha, detenerse hasta encontrar un operador
{ a b c d / NEG ee NEG / + NEG * POSITIVO f g h MOD - * ii NEG * }
Coloca a, b, c, d luego divide luego saca el negativo, luego vuelve a dividir, suma, otra vez negativo, multiplica, coloca f, g, h saca el modulo, resta, luego multiplica, coloca ii, luego negativo, y luego multiplica.
a b c d / ->
2 -7.5 25 -5 /
2 -7.5 -5
2 -7.5 -5 NEG ->
2 -7.5 5
2 -7.5 5 ee ->
2 -7.5 5 2
2 -7.5 5 2 NEG ->
2 -7.5 5 -2
2 -7.5 5 -2 / ->
2 -7.5 -2.5
2 -7.5 -2.5 + ->
2 -10
2 10 NEG ->
2 10
2 10 * ->
20 ->
20 POSITIVO ->
20
f g h MOD ->
7 23 5 MODULO
7 3
7 3 - ->
4
20 4 * ->
80
80 ii NEG->
80 1 NEG
-80 -1
80 -1 *
-81
Last edit: Compsystems 2016-09-23
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola, Zascar
los operadores unarios (-) & (+) fallan ejemplo
Last edit: Compsystems 2016-09-22
MÉTODOS DE EVALUACIÓN DE EXPRESIONES COMPUTACIONALES
A: NOTACIÓN INFIJA o terrestre, es la notación natural o la que aprendemos en el colegio, por ejemplo, A + B, los operadores en casi su totalidad están en el MEDIO de los operandos.
B: NOTACIÓN INVERSA o marciana, notación desconocida pero muy poderosa en sistemas computacionales, ejemplo A B +, los operadores en su totalidad están DESPUÉS de los operandos, usada en las calculadoras serie hp48/49/50 y parcialmente en la HP-PRIME
C: NOTACIÓN PREFIJA o alienígena, desconocida también pero muy poderosa, + A B, los operadores en su totalidad están ANTES de los operandos, se considera esta notación también como inversa
Algunos parser (analizador sintáctico de expresiones) para poder interpretar una expresión infija, convierten dicha expresión a RPN/NPI, Notación Polaca Inversa,
Ejemplo #1 de conversión y evaluación de notación infija a inversa.
La siguiente expresión en notación infija
a * (b + (c/d) / ee) * (f - g MOD h)
convertida en RPN es la siguiente lista de entrada ( note que no hay paréntesis curvos =) )
{ a b c d / ee / + * f g h MOD - * }
La lista anterior es una secuencia de 15 pasos, que se interpreta como un programa, ahora veamos la lista anterior como una lista vertical o pila de elementos o filas enumeradas (E#), inician con la letra E de Entrada
E1: a
E2: b
E3: c
E4: d
E5: /
E6: ee
E7: /
E8: +
E9: *
E10: f
E11: g
E12: h
E13: mod
E14: -
E15: *
el evaluador ejecuta línea por línea para obtener el resultado final
E1: 2, Primer línea de la pila o lista de entrada anterior, que tiene un objeto (a) que es una variable: la variable a se evalúa a 2 y es colocada en un nuevo stack o pila de salida (S#), la primera fila tendría entonces el número 2, como es un número y no un operador o función, prácticamente no hace nada, sino que solo hace una copia
S1: 2
E2: -7.5, Segunda línea de la lista de entrada, objeto (b) : la variable b se evalúa a -7.5 y es colocado el valor en la 2da posición de la nueva pila
S2: -7.5
E3: 25, Tercer línea, objeto (c) : la variable c se evalúa a 25 y es colocado el valor en la 3ra posición de la nueva pila
S3: 25
E4: -5, Cuarta línea, objeto (d) : la variable d se evalúa a -5 y es colocado el valor en la 4ta posición de la nueva pila
S4: -5
E5: /, Quinta línea, objeto (/) : el operador binario DIVISIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son los dos últimos de la lista de salida E3 y E4, entonces evalúa 25/-5, retornando -5 y este valor es colocado en la 3ra posición de la nueva pila, ya que la 3ra (S3) y 4ta (S4) ya se utilizaron y la última no utilizada S2, el siguiente valor se almacena en S3
S3: -5
E6: ee, Sexta línea, objeto (ee) : la variable ee se evalúa a 2 y es colocado el valor en la 4ta posición de la nueva pila
S4: 2
E7: /, Séptima línea, objeto (/) : el operador binario DIVISIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son la S3 y S4, entonces evalúa -5/2, retornando -2.5 y este valor es colocado en la 3ra posición de la nueva pila, ya que S3 y S4 ya se utilizaron
S3: -2.5
E8: +, Octava línea, objeto (+) : el operador binario SUMA actúa sobre dos argumentos o líneas de la pila, en este caso son la S2 y S3, entonces se evalúa -7.5+-2.5, retornando -10 y este valor es colocado en la 2da posición de la nueva pila, ya que S2 y S3 ya se utilizaron
S2: -10
E8: , Novena línea, objeto () : el operador binario MULTIPLICACIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son la S1 y S2, entonces evalúa 2-10, retornando -20 y este valor es colocado en la 1ra posición de la nueva pila, ya que S1y S2 ya se utilizaron
S1: -20
E10: f, E11: g, E12: h Desde la Décima hasta la 12ava línea tienen como salida
S2: 7
S3: 23
S4: 5
E13: mod, la 13ava entrada requiere dos argumentos para el operador binario MODULO, en este caso son los dos últimos de la lista de salida de salida (S3, S4) 23 MOD 5 retornando 3, ahora S3 es 3
S3: 3
E14: -, la 14ava entrada requiere dos argumentos para el operador binario RESTA, en este caso son los dos últimos de la lista de salida (S2, S3) 7-3 retornando 3, ahora S2 es 4
S2: 4
E15: , la 15ava entrada requiere dos argumentos para el operador binario MULTIPLICACIÓN, en este caso son los dos últimos de la lista de salida (S1, S2) -20*4 retornando -80, ahora S1 es -80, valor final de evaluación
Ejemplo #2 una segunda expresión
+a * -(b + -(c/+d) / -ee) * (f - g MOD h ) * -ii
en RPN es
{ a b c d / NEG ee NEG / + NEG * POSITIVO f g h MOD - * ii NEG * }
Observen que aparece el operador NEG (NEGATIVO) y POS (POSITIVO) no afecta la expresión, en mi caso una expresión en RPN es más fácil evaluarla manualmente que una expresión en notación natural ya que esta última sino tiene paréntesis de ayuda se puede cometer error de evaluación, QUE EN RPN NUNCA SUCEDE
Otra forma de interpretar una expresión RPN, es evaluar de izquierda a derecha, detenerse hasta encontrar un operador
{ a b c d / NEG ee NEG / + NEG * POSITIVO f g h MOD - * ii NEG * }
Coloca a, b, c, d luego divide luego saca el negativo, luego vuelve a dividir, suma, otra vez negativo, multiplica, coloca f, g, h saca el modulo, resta, luego multiplica, coloca ii, luego negativo, y luego multiplica.
a b c d / ->
2 -7.5 25 -5 /
2 -7.5 -5
2 -7.5 -5 NEG ->
2 -7.5 5
2 -7.5 5 ee ->
2 -7.5 5 2
2 -7.5 5 2 NEG ->
2 -7.5 5 -2
2 -7.5 5 -2 / ->
2 -7.5 -2.5
2 -7.5 -2.5 + ->
2 -10
2 10 NEG ->
2 10
2 10 * ->
20 ->
20 POSITIVO ->
20
f g h MOD ->
7 23 5 MODULO
7 3
7 3 - ->
4
20 4 * ->
80
80 ii NEG->
80 1 NEG
-80 -1
80 -1 *
-81
Last edit: Compsystems 2016-09-23
Una solucion previa es crear una funcion de nombre cambioDeSigno() en muchos lenguajes la denotan como change of sign CHS() otros NEG() de negativo
http://dreiartikel.de/dictionary/?q=change%20of%20sign%20/chs/&ddir=ed
de esta manera se facilita al interprete pues no tiene que chequear las combinaciones del operador unario CHS (-) con el operador binario resta (-)
otros lenguges como el HP-PPL o TI_BASIC usan un cracter diferente para CHS y otro para resta
−- observen que la raya media esta en difernte posición
¿Tengo o no la razon, si se agrega la funcion NEGATIVO() se facilita la interpretacion?
ejemplos
1:
imprimir a*-b
con la nueva funcion NEGATIVO() se debe escribir como
imprimir a*negativo(b)
2:
imprimir a/-b
con la nueva funcion NEGATIVO() se debe escribir como
imprimir a/negativo(b)
3:
imprimir a−-b
con la nueva funcion NEGATIVO() se debe escribir como
imprimir a−negativo(b)
4: imprimir a−+b
como + no afecta el signo se debe interpretar como
imprimir a−b