MyBF - Interpretador de BrainFuck
Publicado por Danillo Souza (última atualização em 26/08/2010)
[ Hits: 5.456 ]
Pequeno interpretador da linguagem BrainFuck que eu criei, implementando mais 2 comandos adicionais (a descrição se encontra nos comentários do início). Para quem não conhece BrainFuck: http://pt.wikipedia.org/wiki/Brainfuck
#!/usr/bin/perl -w
# Author: Danillo Souza
# Email: danillo012@gmail.com
# Version: 0.1
#
# This script implements the original syntax of BrainF*ck, with few modifications,
# only two additional commands actually. The first is the '!' serving
# to write the value of the current cell as an integer, and the second is '$'
# used to read a number (actually, one digit) and store your value in the current cell.
#
# If you extend this script with new functionalities, please send me the
# changes via email. I would be happy if I saw someone improving this little
# interpreter and adding new stuff.
#
# And do not forget. if you extend this interpreter, do not use modules not
# are patterns of Perl. The goal is to ensure that the interpreter is 100% portable,
# not force people to install new modules.
use strict;
use diagnostics;
# Opening file
die "Usage: mybf.pl <scriptfile>\n" if scalar(@ARGV) < 1;
open my $file, '<', $ARGV[0] or die "Can't open file.\n";
# Variables
my $top = 30000;
my $ptr = 0;
my $cou = 0;
my $src = '';
my @segment = (1..$top); foreach (@segment){$_ = 0;}
my @loops = ();
# Getting the source code
while (<$file>) {$src .= $_;}
close($file);
# Eliminating non-bf characters
$src =~ s/[^\+\-\.\!\[\],\$<>]//g;
# Verifying the brackets equivalency
my $lbrackets = scalar(grep(/[\[]/g, $src));
my $rbrackets = scalar(grep(/[\]]/g, $src));
print "Missing brackets -> ([: $lbrackets | ]: $lbrackets)\n" if ($lbrackets != $rbrackets);
# Execution loop
while ($cou < length($src)) {
my $ch = substr($src, $cou, 1);$cou++;
if ($ch eq '>') {$ptr++;if ($ptr>256){$ptr=0}}
if ($ch eq '<') {$ptr--;if ($ptr<0){$ptr=256}}
if ($ch eq '+') {$segment[$ptr]++}
if ($ch eq '-') {$segment[$ptr]--}
if ($ch eq '.') {print chr($segment[$ptr]);}
if ($ch eq '!') {print int($segment[$ptr]);}
if ($ch eq ',') {my $y=<STDIN>;$segment[$ptr]=ord(substr($y,0,1));}
if ($ch eq '$') {my $y=<STDIN>;$segment[$ptr]=int(substr($y,0,1));}
if ($ch eq '[') {push(@loops, $cou)}
if ($ch eq ']') {if ($segment[$ptr]!=0){$cou=$loops[$#loops]}else{pop(@loops)}}
}
Diminuir ou aumentar o brilho de notebook
Tirando screenshots facilmente !
Papagaiando o XFCE com temas e recursos
WhatsApp com Chamadas no Linux via Waydroid
XFCE - quase um Gnome ou Plasma mas muito mais leve
LXQT - funcional para máquinas pererecas e usuários menos exigentes
SNMP Scan no OCS Inventory só funciona com HTTPS corretamente configurado
Removendo jogos e bloatware do KDE no Gentoo
Gentoo: Sincronização com Git e Automação via Systemd
Instalação do tema Fluent GTK no Zorin OS
PKI na Prática: Criando CA e Certificado Wildcard (Automatizado)
GOG confirma suporte oficial ao sistema Linux: "o trabalho começo... (1)
Midia de instalação LM-21.3 não inicializa (14)
eu queria saber no lenovo slim, se tem como ver os mhz de memoria e tu... (3)









