challenge BFコンパイラー

「どう書く?」でまだ出ていないのが不思議なお題。それがBF処理系。 ここでは、BFで書かれたソースを、同じ言語に変換するコンパイラーを募集します。

私自身、すでにPerlとJavaScriptに関しては http://blog.livedoor.jp/dankogai/archives/50545151.html でやっているのですが、他の言語バージョンも是非見たいので。

Dan the Brainf.ucker

以下のようにonelinerで可能です。 ただしLanguage::BF 0.03が必要です。 CodeRepos経由 で、

  • svn co svn.coderepos.org/share/lang/perl/Language-BF
  • cd Language-BF/trunk
  • perl Makefile.PL
  • make install

するか、CPANにVersion 0.03が現れるのをお待ち下さい。

Dan the Brainf.cker

1
2
3
4
perl -MLanguage::BF \
  -e 'print Language::BF->new_from_file(shift)->as_perl' t/hello.bf \
  | perl
Hello World!

Posted feedbacks - Perl

以下のようにonelinerで可能です。 ただしLanguage::BF 0.03が必要です。 CodeRepos経由 で、

  • svn co svn.coderepos.org/share/lang/perl/Language-BF
  • cd Language-BF/trunk
  • perl Makefile.PL
  • make install

するか、CPANにVersion 0.03が現れるのをお待ち下さい。

Dan the Brainf.cker

1
2
3
4
perl -MLanguage::BF \
  -e 'print Language::BF->new_from_file(shift)->as_perl' t/hello.bf \
  | perl
Hello World!

正規表現とハッシュの合わせ技で
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use strict;
use warnings;

sub compile {
    my $source = shift;
    my $out = '';

    my $code = 'sub{no warnings;my(@t, $p, @o);';

    my %patterns = (
        '>' => sub { sprintf '$p+=%d;', length $_[0] },
        '<' => sub { sprintf '$p-=%d;', length $_[0] },
        '+' => sub { sprintf '$t[$p]+=%s;', length $_[0] },
        '-' => sub { sprintf '$t[$p]-=%d;', length $_[0] },
        '.' => sub { sprintf 'push @o,$t[$p];' },
        ',' => sub { sprintf '$t[$p] = shift;' },
        '[' => sub { 'while($t[$p]){' },
        ']' => sub { '}' },
    );
    my $re = qr/>+|<+|\++|-+|\.|,|\[|\]/;

    my $tmp = $source;
    $tmp =~ tr/<>+\-,.[]//cd;
    $tmp =~ s/$re/$patterns{substr($&, 0, 1)}->($&)/ge;

    $code .= $tmp;
    $code .= '@o;}';
}

sub main {
    my $source = do { local $/; <> };
    my $code = compile($source);

    my @out = do { eval $code }->();
    print pack('c*', @out);
}

main;

strictもwarningsも通るけど一文。

Dan the Brainf.cker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/local/bin/perl
use strict;
use warnings;
s/(.)/do{no warnings 'syntax';my %c=qw!
< $p--;
> $p++;
+ $d[$p]++;
- $d[$p]--;
. print(chr$d[$p]);
, $d[$p]=getc;
[ while($d[$p]){
] }
!;\%c}->{$1}/egx and print for(<>);

Index

Feed

Other

Link

Pathtraq

loading...