Chefe

Introdução

Este projeto foi criado como trabalho da matéria de compiladores. Chefe é uma linguagem de programação esotérica, onde os programas se parecem com receitas de culinária. Criada originalmente por David Morgan-Mar (disponível em http://www.dangermouse.net/esoteric/chef.html). A sintaxe e a especificação da linguagem foram traduzidas para o português.

Princípios de design

Conceitos da linguagem

Ingredientes

Todas as receitas possuem ingredientes! Ingredientes armazenam valores individuais. Ingredientes líquidos serão interpretados como caracteres Unicode, enquanto ingredientes secos ou não especificados serão interpretados como números.

Tigelas e assadeiras

Chefe tem acesso a um estoque ilimitado de tigelas e assadeiras. Estas podem conter ingredientes. Ingredientes numa tigela ou numa assadeira são ordenados como uma pilha de panquecas. Novos ingredientes são inseridos no topo, e se ingredientes são removidos, serão também removidos do topo. Note que se o valor de um ingrediente muda, o valor na tigela ou assadeira continua igual.

Múltiplas tigelas ou assadeiras são referencias com um identificador ordinal (a 2ª tigela, por exemplo). Se nenhum identificador é utilizado, então a receita só possui um deste utensílio. Identificadores ordinais devem ser seguidos de uma terminação, ª ou º, para indicar o gênero.

Elementos sintáticos

Os itens a seguir aparecem numa receita de Chefe. Alguns são opcionais. Itens devem aparecer na ordem mostrada abaixo, com uma linha em branco (duas quebras de linha) entre itens.

Título da receita

O título da receita descreve, em poucas palavras, o que o programa faz. Por exemplo: “Suflê de Olá Mundo” ou “Números Fibonacci com Caramelo”. O título é sempre a primeira linha de uma receita, seguida de um ponto final.

titulo-da-receita.

Comentários

Comentários são constituídos de um parágrafo após o título da receita. Comentários são opcionais.

Lista de ingredientes

Lista os ingredientes que serão usados pelo programa. A sintaxe é descrita abaixo.

Ingredientes.
[valor-inicial] [medida [tipo-da-medida]] nome-do-ingrediente
[valor-inicial] [medida [tipo-da-medida]] nome-do-ingrediente

Cada ingrediente é listado em uma linha. O valor inicial é um número, e é opcional. Tentar utilizar um ingrediente sem um valor definido é um erro de tempo de execução. A medida pode ser qualquer uma das seguintes medidas:

O nome do ingrediente pode ser qualquer frase, e pode incluir espaços em branco. A lista de ingredientes é opcional. Se um ingrediente é repetido, o novo valor é usado e os valores antigos são descartados.

Tempo de preparo

Tempo de preparo: tempo (hora[s] | minuto[s]).

O tempo de preparo é opcional. O tempo é um número.

Temperatura do forno

Pré-aqueça o forno a temperatura °C.

Algumas receitas requerem aquecimento. A temperatura do forno é opcional.

Modo de preparo

Modo de preparo.
métodos de preparação

O modo de preparo contém as instruções para a receita. Estas são escritas em sentenças. Quebras de linha são ignoradas no modo de preparo de uma receita. Instruções válidas são:

Rendimento

A última frase de uma receita é a quantidade de porções que ela rende, ou, a quantidade de pessoas que ela serve.

Rendimento: número-de-porções (porções | pessoas).

Este comando escreve para o STDOUT o conteúdo das primeiras número-de-porções assadeiras. Começa pela 1ª assadeira, removendo os valores do topo um por um e os imprimindo, até que a assadeira fique vazia. Então, progride para a próxima assadeira, até que todas sejam impressas.

O rendimento é opcional numa receita, mas é necessário se o programa tiver qualquer saída!

Receitas auxiliares

Algumas receitas pequenas podem ser necessárias para produzir ingredientes especializados para a receita principal (como molhos, ou caldas). Eles são listados na receita principal. Receitas auxiliares são feitas por sous-chefs, então eles têm o próprio conjunto de tigelas e assadeiras que o Chefe principal nunca vê, mas pode copiar todas as tigelas e assadeiras em uso pelo chef que o chamou. Mudanças nessas tigelas e assadeiras não interferem nas tigelas e assadeiras do chef que o chamou. Quando a receita auxiliar termina, os ingredientes na 1ª tigela são passados para a 1ª tigela do chefe que o chamou.

Uma receita auxiliar pode ter todos os itens de uma receita principal.

Receitas de exemplo