Thursday, April 7, 2011

BrainForce

A definição da linguagem:

Acabo de criar uma linguagem, chamada de BrainForce, desenvolvida baseada nas definições da linguagem de Urban Muller.

A linguagem basicamente tem 8 comandos:

  1. '+' : adiciona um à célula na posição do ponteiro
  2. '-' : subtrai um da céluna na posição do ponteiro
  3. '>' : move o ponteiro para a direita uma casa
  4. '<' : move o ponteiro para a esquerda uma casa
  5. '[' : inicia um laço se o valor na posição do ponteiro for diferente de zero, pula o laço caso contrário
  6. ']' : fecha o laço, retornando o controle para o colchete respectivo que o abriu
  7. '.' : imprime um valor na saída padrão
  8. ',' : lê um valor da entrada padrão
Além desses comandos, é possível utilizar um comando de debug '#' que permite imprimir de uma só vez o valor de cada uma das dez primeiras células (na versão 2.0, isso será variável, imprimindo os 11 valores centrados no ponteiro, 5 a sua esquerda e 5 a sua direita, além do próprio).

Nos comentários do arquivo de definição do analisador léxico se encontram essas explicações (o programa foi todo codificado em inglês, para melhor aceitação da comunidade internacional, incluindo comentários e nomes de variáveis):
/*
BrainForce Compiler v.1.0, An esoteric programming language
Author: Ruben Carlo Benante (Dr. Beco)
Email: rcb [at] beco.cc
Creation date: 05/Apr/2011
Project based on the ideas of Urban Muller (http://fi.aminet.net/dev/lang)
WebPage: www.beco.cc/compiler/brainforce
License: CC-3.0 http://creativecommons.org/licenses/by-nc-sa/3.0/

Usage:
./brainforce input_file [-o output_file] [options]

input_file : a input file with source code in BrainForce language (.bf)
output_file : a generated C source code from the input file (.c)

Options:
-zn :
n=0 default behavior
n=1 set zero = '0' for pretty print of chars
n=2 set cells to read/write integers
-d : print the syntax tree of the input_file
-v : verbosity mode. Can pile up till level 10
-q : quiety mode
-E : stop after preprocessor and write output_file.i (not implemented)
-S : stop after assembler and write output_file.s (not implemented)
-C : stop after C generator and write output_file.c (default)
-o file : output file name (default .c)
-h : print this help

BrainForce Source File:
Command Meaning
> increment the data pointer (to point to the next cell to the right).
< decrement the data pointer (to point to the next cell to the left).
+ increment (increase by one) the byte at the data pointer.
- decrement (decrease by one) the byte at the data pointer.
. output a character, the ASCII value of which being the byte at the data pointer.
, accept one byte of input, storing its value in the byte at the data pointer.
[ if the byte at the data pointer is zero, then jump forward to the command after the matching ] command.
] if the byte at the data pointer is nonzero, then jump back to the command after the matching [ command.
# debug: print the first 10 cells
*/


A linha de comando:

O compilador chamado de
 brainforce
é chamado na linha de comando com a syntaxe e opção dos seguintes argumentos:

uso:

$./brainforce arquivoentrada.bf [-o arquivosaida.c] [opções]


As opções disponíveis são:

-zn :
n=0 comportamento padrão compatível com a definição da linguagem original
n=1 faz o zero = '0', valor ASCII 48, para imprimir caracteres de modo mais legível
n=2 usa inteiros nos comandos de ler ',' e imprimir '.'
-d : imprime a árvore de sintaxe gerada pelo compilador
-v : aumenta a saída de mensagens de compilação. Pode ser usada de 1 a 10 vezes
-q : ativa o modo silencioso, diminuindo as mensagens de compilação
-E : roda apenas o preprocessador com arquivo de saída arquivo.i (não implementado)
-S : roda apenas o assembler, dando saída ao código assembly arquivo.s (não implementado)
-C : traduz o código do Brain Force para linguagem C na saída arquivo.c (é o modo padrão)
-o nome_arquivo : nome do arquivo de saída (sem definir, imprime na saída padrão,
-h : imprime esta ajuda


Como se pode ver, são muitas opções. Mas o mais impressionante é que esta pequena linguagem é Turing-Completa. Ou seja, é capaz de fazer qualquer coisa que as atuais linguagens mais poderosas do existentes, basta você ter muito tempo, e não ter vida social nenhuma.

No comments: