[
  [
   ["PushInteger", ["number", "INT"]],
   "Mete la constante numérica dada en la pila."
  ],
  [
   ["PushString", ["string", "STRING"]],
   "Mete la constante de cadena dada en la pila."
  ],
  [
   ["PushVariable", ["variableName", "ID"]],
   "Mete el valor actual de la variable local variableName en la pila. Si variableName no tiene asociado un valor, lanza una excepción GbsRuntimeError."
  ],
  [
   ["SetVariable", ["variableName", "ID"]],
   "Saca el valor del tope de la pila y modifica la variable local variableName para que tome dicho valor. Si la variable no existe en el diccionario de nombres locales, se crea una entrada. Si la variable ya existía, se verifica que el tipo del valor que tenía y el tipo del valor actual sean compatibles."
  ],
  [
   ["UnsetVariable", ["variableName", "ID"]],
   "Elimina la variable local variableName del diccionario de nombres locales. Si la variable no existe en el diccionario de nombres locales, esta instrucción no causa ningún otro efecto más que incrementar el instruction pointer."
  ],
  [
   ["Label", ["label", "LABEL"]],
   "Pseudo-instrucción para definir una etiqueta, es decir un punto en el código que puede ser el destino de un salto o una invocación. No puede haber etiquetas repetidas en todo el código."
  ],
  [
   ["Jump", ["targetLabel", "LABEL"]],
   "Salta incondicionalmente a la etiqueta indicada (debe existir)."
  ],
  [
   ["JumpIfFalse", ["targetLabel", "LABEL"]],
   "Si el tope de la pila es una estructura cuyo constructor es False, salta a la etiqueta indicada, que debe existir. Esta instrucción saca el elemento del tope de la pila. La pila no puede estar vacía."
  ],
  [
   ["JumpIfStructure", ["constructorName", "ID"], ["targetLabel", "LABEL"]],
   "Si el tope de la pila es una estructura cuyo constructor es el indicado por 'constructorName', salta a la etiqueta indicada, que debe existir. No saca el elemento del tope de la pila. La pila no puede estar vacía."
  ],
  [
   ["JumpIfTuple", ["size", "INT"], ["targetLabel", "LABEL"]],
   "Si el tope de la pila es una tupla con la cantidad de componentes indicada por 'size', salta a la etiqueta indicada, que debe existir. No saca el elemento del tope de la pila. La pila no puede estar vacía."
  ],

  [
   ["Call", ["targetLabel", "LABEL"], ["nargs", "INT"]],
   "Hace una invocación a una subrutina. Más precisamente, mete un nuevo stack frame en la pila de llamadas, con el instruction pointer apuntando a la posición del código designada por la etiqueta 'targetLabel'. Saca 'nargs' valores del tope de la pila del stack frame llamador y los apila en la pila del nuevo stack frame. Notar que al desapilarlos y reapilarlos el orden se invierte, de tal manera que el primer parámetro queda en el tope de la pila."
  ],

  [
   ["Return"],
   "Retorna de una invocación a una subrutina. Más precisamente, saca el stack frame del tope de la pila de llamadas. Si la pila de llamadas queda vacía, es el return del programa principal y el programa finaliza. Cuando se ejecuta la instrucción Return, debe haber 0 o 1 valores en la pila. En caso de que haya un valor, se saca de la pila del stack frame actual y se apila en el stack frame del llamador."
  ],

  [
   ["MakeTuple", ["size", "INT"]],
   "Crea una tupla del tamaño indicado. Los elementos se sacan de la pila (el último elemento de la tupla debe encontrarse en el tope de la pila)."
  ],

  [
   ["MakeList", ["size", "INT"]],
   "Crea una lista del tamaño indicado. Los elementos se sacan de la pila (el último elemento de la lista debe encontrarse en el tope de la pila). Los elementos de la lista deben tener tipos compatibles; de lo contrario se lanza una excepción GbsRuntimeError."
  ],

  [
   ["MakeStructure", ["typeName", "ID"], ["constructorName", "ID"], ["fieldNames", ["*", "ID"]]],
   "Crea una estructura usando el constructor indicado ('constructorName') del tipo indicado ('typeName'), con los campos indicados por la lista de nombres 'fieldNames'. Los valores de cada campo se sacan de la pila (el valor del último campo de la lista debe encontrarse en el tope de la pila)."
  ],

  [
   ["UpdateStructure", ["typeName", "ID"], ["constructorName", "ID"], ["fieldNames", ["*", "ID"]]],
   "Actualiza una estructura usando el constructor indicado ('constructorName') del tipo indicado ('typeName'), con los campos indicados por la lista de nombres 'fieldNames'. Los valores de cada campo se sacan de la pila (el valor del último campo de la lista debe encontrarse en el tope de la pila). A continuación se saca de la pila el valor, que debe ser una estructura para actualizar. Si el valor no es una estructura, o si es una estructura pero no está construida con el constructor esperado, se lanza una excepción GbsRuntimeError. Los tipos de los valores contenidos en los campos originales deben ser compatibles con los tipos de los nuevos valores de los respectivos campos; de lo contrario se lanza una excepción GbsRuntimeError."
  ],

  [
   ["ReadTupleComponent", ["index", "INT"]],
   "Mete en la pila la 'index'-ésima componente de la tupla que se encuentra actualmente en el tope de la pila. Los índices empiezan desde 0. Debe haber un valor en el tope de la pila. No se saca dicho valor de la pila (queda como segundo elemento). Si el valor en el tope de la pila no es una tupla, se lanza una excepción GbsRuntimeError. Si el índice está fuera de rango, se lanza una excepción GbsRuntimeError."
  ],

  [
   ["ReadStructureField", ["fieldName", "ID"]],
   "Mete en la pila el valor del campo 'fieldName' de la estructura que se encuentra actualmente en el tope de la pila. Debe haber un valor en el tope de la pila. No se saca dicho valor de la pila (queda como segundo elemento). Si el valor en el tope de la pila no es una estructura, se lanza una excepción GbsRuntimeError. Si el campo 'fieldName' no es uno de los campos presentes en la estructura, se lanza una excepción GbsRuntimeError."
  ],

  [
   ["ReadStructureFieldPop", ["fieldName", "ID"]],
   "Mete en la pila el valor del campo 'fieldName' de la estructura que se encuentra actualmente en el tope de la pila. Debe haber un valor en el tope de la pila. El valor original se saca de la pila. Si el valor en el tope de la pila no es una estructura, se lanza una excepción GbsRuntimeError. Si el campo 'fieldName' no es uno de los campos presentes en la estructura, se lanza una excepción GbsRuntimeError."
  ],

  [
   ["PrimitiveCall", ["primitiveName", "ID"], ["nargs", "INT"]],
   "Invoca a una operación primitiva. Desapila 'nargs' argumentos de la pila (con el último argumento en el tope). A continuación, invoca a la primitiva pasándole como parámetros el estado global, seguido de los 'nargs' argumentos desapilados. La función primitiva puede devolver un valor o 'null'. En caso de que devuelva un valor, se apila dicho resultado en la pila. Si devuelve null, prosigue con la ejecución."
  ],

  [
   ["SaveState"],
   "Crea una copia el estado global actual y lo mete en la pila de estados globales."
  ],

  [
   ["RestoreState"],
   "Saca un estado de la pila de estados globales."
  ],

  [
   ["TypeCheck", ["type", "TYPE"]],
   "Verifica que el tipo del valor del tope de la pila sea compatible con el tipo indicado. La pila no debe estar vacía. Esta operación no saca el elemento del tope de la pila."
  ]

]
