Articulo de referencia

Notación de operadores comunes

En lenguajes de programación , calculadoras científicas y similares, la notación de operadores comunes o gramática de operadores es una forma de definir y analizar expresiones m...

En lenguajes de programación , calculadoras científicas y similares, la notación de operadores comunes o gramática de operadores es una forma de definir y analizar expresiones matemáticas y otras expresiones formales. En este modelo, una secuencia lineal de tokens se divide en dos clases: operadores y operandos.

Los operandos son los objetos sobre los que actúan los operadores. Estos incluyen números literales y otras constantes, así como identificadores (nombres) que pueden representar desde variables escalares simples hasta estructuras y objetos agregados complejos, dependiendo de la complejidad y las capacidades del lenguaje y del contexto de uso. Un tipo especial de operando es el grupo de paréntesis. Una expresión encerrada entre paréntesis se evalúa recursivamente para ser tratada como un único operando en el siguiente nivel de evaluación.

A cada operador se le asigna una posición, precedencia y asociatividad. La precedencia del operador es un número (de mayor a menor o viceversa) que define qué operador toma un operando rodeado por dos operadores de diferente precedencia (o prioridad). La multiplicación normalmente tiene mayor precedencia que la suma, [ 1 ] por ejemplo, de modo que 3+4×5 = 3+(4×5) ≠ (3+4)×5.

En cuanto a la posición del operador, este puede ser prefijo, postfijo o infijo. Un operador prefijo precede inmediatamente a su operando, como en −x. Un operador postfijo sucede inmediatamente a su operando, como en x!, por ejemplo. Un operador infijo se sitúa entre un operando izquierdo y uno derecho, como en x+y. Algunos lenguajes, sobre todo la familia de sintaxis C, amplían esta terminología convencional y también hablan de operadores infijos ternarios (a?b:c). Teóricamente, incluso sería posible (aunque no necesariamente práctico) definir la interpolación como una operación bifija unaria.

Asociatividad de operadores

La asociatividad de operadores determina qué sucede cuando un operando está rodeado de operadores de la misma precedencia, como en 1-2-3: Un operador puede ser asociativo por la izquierda , asociativo por la derecha o no asociativo . Los operadores asociativos por la izquierda se aplican a los operandos en orden de izquierda a derecha, mientras que los operadores asociativos por la derecha se aplican en sentido contrario. Los operadores aritméticos básicos son normalmente todos asociativos por la izquierda, [ 1 ] lo que significa que 1-2-3 = (1-2)-3 ≠ 1-(2-3), por ejemplo. Esto no se cumple para operadores de orden superior. Por ejemplo, la exponenciación es normalmente asociativa por la derecha en matemáticas, [ 1 ] pero se implementa como asociativa por la izquierda en algunas aplicaciones informáticas como Excel. En los lenguajes de programación donde la asignación se implementa como un operador, ese operador suele ser asociativo por la derecha. Si es así, una instrucción como a  := b  := c sería equivalente a a := (b := c) , lo que significa que el valor de c se copia a b, que luego se copia a a. Un operador que no es asociativo no puede competir por operandos con operadores de igual precedencia. En Prolog , por ejemplo, el operador infijo :- no es asociativo, por lo que construcciones como a :- b :- c son errores de sintaxis. Los operadores prefijos unarios como − (negación) o sin (función trigonométrica) suelen ser operadores prefijos asociativos. Cuando más de un operador prefijo o postfijo asociativo de igual precede o sucede a un operando, el operador más cercano al operando va primero. Así, −sin x = −(sin x), y sin -x = sin(-x).    

Los lenguajes orientados a las matemáticas (como los de las calculadoras científicas ) a veces permiten la multiplicación implícita con mayor prioridad que los operadores de prefijo (como seno), de modo que sen 2x+1 = (sen(2x))+1, por ejemplo.

Sin embargo, los operadores prefijos (y posfijos) no necesariamente tienen mayor precedencia que todos los operadores infijos. Por ejemplo, un lenguaje de programación (hipotético) podría tener un operador llamado seno con una precedencia menor que × pero mayor que +. En dicho lenguaje, seno 2·x+1 = seno(2·x)+1 sería verdadero, en lugar de (seno 2)·x+1, como suele ser el caso.

Las reglas para la evaluación de expresiones suelen ser triples:

  1. Cualquier subexpresión entre paréntesis debe tratarse como un único operando evaluado recursivamente (aunque puede haber diferentes tipos de paréntesis, con diferentes semánticas).
  2. Asigna primero los operandos a los operadores de mayor precedencia que a los de menor precedencia.
  3. Para que tengan igual precedencia, vincule los operandos a los operadores según la asociatividad de estos.

Algunos ejemplos más:

1-2+3/4*5+6+7 = (((1-2)+((3/4)*5))+6)+7
4 + -x + 3 = (4 + (-x)) + 3

Generalizaciones de la notación de operadores comunes

El uso de clases de precedencia de operadores y asociatividades es solo una forma. Sin embargo, no es la más general: este modelo no puede dar a un operador más precedencia cuando compite con '−' que cuando compite con '+', al tiempo que les da a '+' y '−' precedencias y asociatividades equivalentes. Una versión generalizada de este modelo (en la que a cada operador se le pueden dar precedencias izquierda y derecha independientes) se puede encontrar en.

Véase también

Referencias

  1. 1 2 3 Bronstein, Ilja Nikolaevič; Semendjajew, Konstantin Adolfovič (1987) [1945]. "2.4.1.1." En Grosche, Günter; Ziegler, Víctor; Ziegler, Dorothea (eds.). Taschenbuch der Mathematik (en alemán). vol.  1. Traducido por Ziegler, Viktor. Weiß, Jürgen (23  ed.). Thun y Fráncfort del Meno: Verlag Harri Deutsch (y BG Teubner Verlagsgesellschaft , Leipzig). págs. 115 a 120. ISBN  3-87144-492-8.