# New Ticket Created by Leon Brocard
# Please include the string: [perl #20786]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=20786 >
Attached is a bf compiler for languages/bf/ and a patch to the
makefile to make and test it.
The actual compiler is a bit slow on large bf programs - the culprit
being concat. Oh well, at least they run fast once compiled.
Cheers, Leon
--
Leon Brocard.............................http://www.astray.com/
scribot.................................http://www.scribot.com/
... I haven't lost my mind -- it's backed up on tape somewhere
-- attachment 1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/50591/38842/9e1900/bf.in.patch
-- attachment 2 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/50591/38843/a7fbdf/bfc.pasm
Index: config/gen/makefiles/bf.in
===================================================================
RCS file: /cvs/public/parrot/config/gen/makefiles/bf.in,v
retrieving revision 1.1
diff -u -r1.1 bf.in
--- config/gen/makefiles/bf.in 9 Dec 2002 04:00:24 -0000 1.1
+++ config/gen/makefiles/bf.in 8 Feb 2003 12:44:38 -0000
@@ -3,14 +3,17 @@
ASSEMBLE=$(PERL) ../../assemble.pl
PARROT=../../parrot
+IMCC=../imcc/imcc
all: build
test: build
$(PARROT) bf.pbc test.bf
+ $(IMCC) -r bfc.pbc test.bf
build: bf.pasm
$(ASSEMBLE) bf.pasm > bf.pbc
+ $(IMCC) -o bfc.pbc bfc.pasm
clean:
$(RM_F) core *.pbc *~
# $Id: bfc.pasm,v 1.1 2002/12/09 04:00:27 sfink Exp $
# A Brainfuck compiler
# By Leon Brocard <[EMAIL PROTECTED]>
#
# See http://www.catseye.mb.ca/esoteric/bf/
# for more information on this silly language
# Get the brainfuck source file into S0
set S0, P0[1]
if S0, SOURCE
set S0, P0[0]
print "usage: ../imcc/imcc -r "
print S0
print " file.bf\n"
end
# Read the file into S1
SOURCE:
open I0, S0
SOURCE_LOOP:
readline S2, I0
concat S1, S2
if S2, SOURCE_LOOP
close I0
length I30, S1
# Initialise
set S3, "set I0, 0 # pc\n"
concat S3, "new P0, .PerlArray # memory\n"
concat S3, "set I1, 0 # pointer\n"
set I0, 0 # pc
set I3, 0 # label count
# The main interpreter loop
INTERP:
substr S0, S1, I0, 1
concat S3, "\nSTEP"
set S4, I0
concat S3, S4
concat S3, ": # "
concat S3, S0
concat S3, "\n"
# concat S3, '#print "STEP'
# concat S3, S4
# concat S3, '\n"'
# concat S3, "\n"
ne S0, "+", NOTPLUS
concat S3, "set I2, P0[I1]\n"
concat S3, "inc I2\n"
concat S3, "set P0[I1], I2\n"
branch NEXT
NOTPLUS:
ne S0, "-", NOTMINUS
concat S3, "set I2, P0[I1]\n"
concat S3, "dec I2\n"
concat S3, "set P0[I1], I2\n"
branch NEXT
NOTMINUS:
ne S0, ">", NOTGT
concat S3, "inc I1\n"
branch NEXT
NOTGT:
ne S0, "<", NOTLT
concat S3, "dec I1\n"
branch NEXT
NOTLT:
ne S0, "[", NOTOPEN
set I2, 0 # "depth"
set I3, I0
OPEN_LOOP:
inc I3
substr S2, S1, I3, 1
ne S2, "[", OPEN_NOTOPEN
inc I2
branch OPEN_LOOP
OPEN_NOTOPEN:
ne S2, "]", OPEN_LOOP
eq I2, 0, OPEN_NEXT
dec I2
branch OPEN_LOOP
OPEN_NEXT:
inc I3
set S4, I3
concat S3, "set I2, P0[I1]\n"
concat S3, "unless I2, STEP"
concat S3, S4
concat S3, "\n"
branch NEXT
NOTOPEN:
ne S0, "]", NOTCLOSE
set I3, I0
set I2, 0 # "height"
CLOSE_LOOP:
dec I3
substr S2, S1, I3, 1
ne S2, "]", CLOSE_NOTCLOSE
inc I2
branch CLOSE_LOOP
CLOSE_NOTCLOSE:
ne S2, "[", CLOSE_LOOP
eq I2, 0, CLOSE_NEXT
dec I2
branch CLOSE_LOOP
CLOSE_NEXT:
set S4, I3
concat S3, "branch STEP"
concat S3, S4
concat S3, "\n"
branch NEXT
NOTCLOSE:
ne S0, ".", NOTDOT
concat S3, "set I2, P0[I1]\n"
concat S3, "chr S31, I2\n"
concat S3, "print S31\n"
branch NEXT
NOTDOT:
ne S0, ",", NEXT
concat S3, "readline S31, 0\n"
concat S3, "ord I2, S31\n"
concat S3, "set P0[I1], I2\n"
branch NEXT
NEXT:
inc I0
le I0, I30, INTERP
concat S3, "end\n"
# print S3
# print "\n"
# Now actually run it
compreg P1, "PASM"
compile P0, P1, S3
invoke
end