¡Tienes que escribir un intérprete para un lenguaje genial llamado Chicken !
Debería leer un programa Chicken de un archivo, entrada estándar, argumentos de programa o función, o lo que sea más conveniente para su idioma, así como la entrada al programa.
Debe imprimir o devolver el resultado de interpretar el programa de acuerdo con las especificaciones del lenguaje Chicken.
Más descripción sobre el idioma .
Descripción general del programa de pollo
Chicken opera en una sola pila, que compone todo su modelo de memoria. A medida que se ejecutan las instrucciones, el programa empujará y extraerá valores de la pila, pero también hay instrucciones que permiten que el programa modifique otras partes de la pila a voluntad.
Hay tres segmentos en la pila:
- Los registros, en los índices 0 y 1. El índice 0 es una referencia a la pila misma, y el índice 1 es una referencia a la entrada del usuario. Principalmente utilizado para la instrucción 6 (ver más abajo).
- El código cargado: para cada línea de código hay una celda en este segmento que contiene el número de "gallinas" en la línea. Esto se rellena con un 0 (código de operación para terminar el programa) al final.
- La pila de programas real, donde los valores se empujan / reventan a medida que se ejecuta el programa. Tenga en cuenta que los segmentos no están aislados, lo que significa que es posible crear código auto modificable o ejecutar código desde este segmento del espacio de la pila.
El pollo ISA
El conjunto de instrucciones de Chicken se basa en la cantidad de veces que aparece la palabra "pollo" en cada línea del programa. Una línea vacía termina el programa e imprime el valor más alto en la pila.
El conjunto de instrucciones Chicken, por número de "pollo" por línea:
- Empuje la cadena literal "pollo" a la pila
- Agregue los dos valores superiores de la pila como números naturales y empuje el resultado.
- Resta los dos valores superiores como números naturales y empuja el resultado.
- Multiplique los dos valores superiores como números naturales y presione el resultado.
- Compare dos valores superiores para la igualdad, presione 1 si son iguales y 0 en caso contrario.
- Mire la siguiente instrucción para determinar desde qué fuente cargar: 0 cargas de la pila, 1 cargas de la entrada del usuario. Parte superior de los puntos de pila para direccionar / indexar para cargar desde la fuente dada; cargar ese valor y empujarlo a la pila. Como se trata de una instrucción de doble ancho, el puntero de instrucción omite la instrucción utilizada para determinar la fuente.
- Parte superior de los puntos de la pila a la dirección / índice para almacenar. El valor a continuación aparecerá y se almacenará en la pila en el índice dado.
- La parte superior de la pila es un desplazamiento relativo para saltar. Si el valor debajo de eso es verdadero, entonces el programa salta por el desplazamiento.
- Interpreta la parte superior de la pila como ascii y empuja el personaje correspondiente.
- (10 + N) Inserta el número literal n-10 en la pila.
Ejemplo
Suponga que el programa es:
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(an empty line)
(Un programa de gato. Tenga en cuenta que la línea vacía es necesaria debido a que la línea anterior tiene 6 "pollo").
Aporte proporcionado al programa Chicken
Chicken
Salida
Chicken
La implementación de referencia de Chicken.js .
Detección de errores
El intérprete debe dejar un error y finalizar cuando cualquier palabra que no sea "pollo" esté presente en la fuente.
¡Buena suerte!