[Rio-pm] [Passatempo] Interpretador para BrainFuck
Aureliano Guedes
guedes_1000 em hotmail.com
Quinta Dezembro 13 14:18:06 PST 2012
Bom, estou em duvidas quanto ao que fazer no loop, como indicar que [ inicia e ] termina o loop.
ate agora, preencehndo o dever de casa
#!/usr/bin/env perl
use 5.010;
use strict;
use warnings qw(all);
local ($|, $/) = (1, \1);
my $p = 0;
my $lim = 5000;
my @a = (1..$lim);
for my $instr (<DATA>) {
given ($instr) {
when ('>') {$p++;}
when ('<') {$p--}
when ('+') {$a[$p]++;}
when ('-') {$a[$p]--;}
when ('.') {print chr $a[$p];}
when (',') {
chomp (my $in = <>);
$a[$p] = ord(substr($in,0,1));}
when ('[') { ... }
when (']') { ... }
default { next }
}
}
__DATA__
+++++++++++
>+>>>>++++++++++++++++++++++++++++++++++++++++++++
>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
++++++++++++++++++++++++++++++++++++++++++++.[-]<<
<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
So mais uma perguntinha boba: Alguem sabe como colocar um limite de tempo no STDIN?
Exemplo, eu tenho :
my $input = <>;
if ($input == undef){
...
}
else{
...
}
Exemplo, input so tem 10 segundo para receber a entrada ou fica indefinido.
Vi algo como: http://www.perlmonks.org/index.pl?abspart=1;displaytype=displaycode;node_id=282330;part=1
Mas o que digito não aparece no monitor na hora que digito.
From: tiago.peczenyj em gmail.com
Date: Thu, 13 Dec 2012 15:55:28 -0200
To: rio-pm em pm.org
Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
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 perluse 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?
$p++ if ($i eq '>');
$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 :DBTW, 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 CRONhttp://www.renatocron.com/blog/
@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 CRONhttp://www.renatocron.com/blog/
@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
_______________________________________________
Rio-pm mailing list
Rio-pm em pm.org
http://mail.pm.org/mailman/listinfo/rio-pm
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121213/fbcef768/attachment-0001.html>
Mais detalhes sobre a lista de discussão Rio-pm