Você precisa escrever um intérprete para um idioma legal chamado Chicken !
Você deve ler um programa Chicken a partir de um arquivo, entrada padrão, argumentos de programa ou função, ou o que for mais conveniente para o seu idioma, bem como a entrada para o programa.
Você deve imprimir ou retornar o resultado da interpretação do programa de acordo com a especificação do idioma Chicken.
Mais descrição sobre o idioma .
Visão Geral do Programa Chicken
O frango opera em uma única pilha, que compõe todo o seu modelo de memória. À medida que as instruções são executadas, o programa pressiona e pop valores da pilha, mas também existem instruções que permitem ao programa modificar outras partes da pilha à vontade.
Existem três segmentos na pilha:
- Os registros, nos índices 0 e 1. O índice 0 é uma referência à própria pilha e o índice 1 é uma referência à entrada do usuário. Usado principalmente para a instrução 6 (veja abaixo).
- O código carregado: para cada linha de código, há célula neste segmento que contém o número de "galinhas" na linha. Isso é preenchido com um 0 (opcode para encerrar o programa) no final.
- A pilha real do programa, na qual os valores são enviados / atualizados à medida que o programa é executado. Observe que os segmentos não são isolados, o que significa que é possível criar código auto-modificável ou executar código a partir desse segmento do espaço de pilha.
The Chicken ISA
O conjunto de instruções do Chicken é baseado no número de vezes que a palavra "chicken" aparece em cada linha do programa. Uma linha vazia finaliza o programa e imprime o valor mais alto na pilha.
O conjunto de instruções Chicken, pelo número de "chicken" s por linha:
- Empurre a string literal "chicken" para a pilha
- Adicione os dois principais valores da pilha como números naturais e pressione o resultado.
- Subtraia os dois principais valores como números naturais e empurre o resultado.
- Multiplique os dois principais valores como números naturais e pressione o resultado.
- Compare dois valores principais para igualdade, pressione 1 se forem iguais e 0 caso contrário.
- Veja a próxima instrução para determinar de qual fonte carregar: 0 carga da pilha, 1 carga da entrada do usuário. Pontos principais da pilha para endereçar / indexar para carregar da fonte especificada; carregue esse valor e empurre-o para a pilha. Como esta é uma instrução de largura dupla, o ponteiro da instrução ignora a instrução usada para determinar a fonte.
- Pontos principais da pilha para endereçar / indexar para armazenar. O valor abaixo disso será exibido e armazenado na pilha no índice especificado.
- O topo da pilha é um deslocamento relativo para o qual pular. Se o valor abaixo desse valor for verdadeiro, o programa passará pelo deslocamento.
- Interpreta o topo da pilha como ascii e pressiona o caractere correspondente.
- (10 + N) Coloca o número literal n-10 na pilha.
Exemplo
Suponha que o programa seja:
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(an empty line)
(Um programa para gatos. Observe que a linha vazia é necessária devido à linha anterior ter 6 "galinhas".)
Entrada fornecida ao programa Chicken
Chicken
Resultado
Chicken
A implementação de referência Chicken.js .
Detecção de erro
O intérprete deve deixar um erro e terminar quando qualquer palavra que não seja "frango" estiver presente na fonte.
Boa sorte!