[Rio-pm] [Passatempo] Interpretador para BrainFuck

Tiago Peczenyj tiago.peczenyj em gmail.com
Quinta Dezembro 13 09:55:28 PST 2012


IMHO poderiamos abordar um esquema TDD

Eu criaria algo como

my $ret = Parser::parser($code, $stdin, $stdout);

$ret deveria retornar sucesso em caso do code ser valido

$stdout deveria receber a string "hello world" se o codigo brainfuck para
hello world fosse introduzido

Usar o Test::More nesse caso seria bem interessante. Ainda mais se for
usado o Devel::Cover e analisado se o teste realmente exercitou todo o
codigo do parser.

os testes poderiam ser

ok( Parser::parser("", undef, undef),"um script vazio é um codigo valido");
ok( Parser::parser("comentario", undef, undef),"comentarios são qualquer
caracter fora aqueles 8");

para verificar se o stdin ou stdout foram lidos ou escritos, eu usaria o
Test::MockObject do chromatic. entretanto pode ficar um pouco complicado o
teste, talvez um IO::Handler de teste possa ser mais interessante.


2012/12/13 Stanislaw Pusep <creaktive em gmail.com>

> Aureliano, o lexer do brainfuck utilizando given/when ficaria +/- assim:
>
> #!/usr/bin/env perl
> use 5.010;
> use strict;
> use warnings qw(all);
>
> local ($|, $/) = (1, \1);
>
> for my $instr (<DATA>) {
>     given ($instr) {
>         when ('>') { ... }
>         when ('<') { ... }
>         when ('+') { ... }
>         when ('-') { ... }
>         when ('.') { ... }
>         when (',') { ... }
>         when ('[') { ... }
>         when (']') { ... }
>         default { next }
>     }
> }
>
> __DATA__
> +++++++++++
> >+>>>>++++++++++++++++++++++++++++++++++++++++++++
> >++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
> +<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
> <-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
> -]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
> >[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
> +++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
> ++++++++++++++++++++++++++++++++++++++++++++.[-]<<
> <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
> [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
>
> Lição de casa: preencher os espaços dos '...' para que calcule e imprima
> "1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89" (pq "Hello World!" é muito fácil,
> rsss)
>
> ABS()
>
>
>
> 2012/12/12 Aureliano Guedes <guedes_1000 em hotmail.com>
>
>>  Ainda não tinha me aventurado nas novidades do Perl 5.16.
>>
>> o when eu entendi, mas o given não, alguem poderia me explicar o uso do
>> given??
>>
>> O break ja funciona no 5.16?? se sim, como???
>>
>> ------------------------------
>> From: creaktive em gmail.com
>> Date: Wed, 12 Dec 2012 14:06:14 -0200
>>
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> As variáveis @loop e $s não afetam a lógica do seu programa.
>> Isso é, a sua implementação das instruções de ciclo condicional, [ e ],
>> está incompleta.
>> Outra coisa, ao invés de usar if(){}elsif(){}, procure usar given/when,
>> nesse caso seria mais apropriado.
>> Por fim, o I/O do brainfuck é por caractere, então certifique-se de que o
>> buffering de I/O do Perl esteja desligado e que <> retorne 1 caractere de
>> cada vez: local ($|, $/) = (1, \1);
>>
>>  ABS()
>>
>>
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Por isso é passatempo, é pra quem tem tempo. hahaha
>>
>> Valeu
>>
>> ------------------------------
>> From: renato.cron em gmail.com
>> Date: Tue, 11 Dec 2012 21:45:03 -0200
>>
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> pow,
>>
>> se ninguem te ajudar até domingo, até domingo eu do uma olhada! haha #
>> semtempo
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Não so isso, deve ter algo mais.
>>
>> Mesmo trocando $p-- if ($i eq '>'); por  $p-- if ($i eq '<');.
>>
>> Os caracteres que saem são estranhos, não sai o que eu queria.
>>
>> ------------------------------
>> From: renato.cron em gmail.com
>> Date: Tue, 11 Dec 2012 21:36:03 -0200
>>
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> não são essas linhas aqui?
>>
>>
>>    1.         $p++ if ($i eq '>');
>>    2.         $p-- if ($i eq '>');
>>
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  ahsuahuhasuahsuah
>>
>> Da hora mesmo, quando terminar, quem sabe não faço algo do tipo.
>>
>> ------------------------------
>> From: creaktive em gmail.com
>> Date: Tue, 11 Dec 2012 21:15:38 -0200
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>>
>> Dahora, parabéns :D
>> BTW, isso me lembrou de um "dialeto" do brainfuck, o trollscript:
>> https://github.com/caius/trollscript
>> Isso é um "hello world" em trollscript:
>>
>> Trooloolooloolooloolooloolooloolollooooolooloolooloolooloolooooolooloolooloolooloolooloolooloooooloolooloooooloooloolooloololllllooooloololoooooololooolooloolooloolooloololoolooolooloololooooooloololooooloololooloolooloolooloolooloolooloolooloolooloololooooolooolooloololooollollollollollolllooollollollollollollollollloooooololooooolooll
>> É sério.
>>
>> ABS()
>>
>>
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Ola monges,
>>
>> Estou desenvolvendo um novo brinquedo, como forma de passatempo mesmo, um
>> interpretador para BrainFuck.
>>
>> Futuramente pretendo desenvolver um compilador.
>>
>> Se alguem se interessar pelo assunto e puder colaborar e/ou ajudar, o que
>> deesenvolvi ainda não esta funcional, e estou tendo algumas dificuldades.
>>
>> http://pastebin.com/aEppcPKt
>>
>> Para testarem um hello wolrd em BF:
>>
>>
>> ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Os comandos de brainfuck : http://pt.wikipedia.org/wiki/Brainfuck#Comandos
>>
>> Aqui tem um pequeno tutorial tambem: http://wiki.portugal-a-programar.pt/dev_geral:linguagens_esoterica:brainfuck
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Aqui tambem:
>>
>> Basicamente é isso:
>>
>> http://unauthorizedaccess.files.wordpress.com/2011/02/cmds.jpg?w=610
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> Saravá,
>> Renato CRON
>> http://www.renatocron.com/blog/
>> @renato_cron <http://twitter.com/#%21/renato_cron>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> Saravá,
>> Renato CRON
>> http://www.renatocron.com/blog/
>> @renato_cron <http://twitter.com/#%21/renato_cron>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121213/3b7549da/attachment-0001.html>


Mais detalhes sobre a lista de discussão Rio-pm