# New Ticket Created by Jerome Quelin # Please include the string: [perl #19610] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=19610 >
Thanks to our dear summarizer, I'm now known (from a googlism point of view) as 'one of the "let's implement a bunch of languages on parrot" crew'. So, in order to prove him right definitely (and also because orang-utans should also benefit from Parrot's speed), here's a new language supported by Parrot: the Ook! language. For the unlucky who don't know it, Ook! is essentially isomorphic to the well-known brainfsck language. Refer to http://www.dangermouse.net/esoteric/ook.html for more details. Ok, about this implementation: - this is a compiler (and not an interpreter) that spits Parrot assembly code (yes, I'm targeting Parrot). - it implements every Ook! instruction but the "Ook. Ook!" one. I'll work on it later. - currently I'm just printing on stdout the resulting parrot code, I lack an eval instruction in Parrot. Dan, Leo? :-) Disclaimer: it's all of Nicholas Clark's fault. Really. He's the one to take the blame for it. Jerome -- [EMAIL PROTECTED] -- attachment 1 ------------------------------------------------------ url: http://rt.perl.org/rt2/attach/46602/36599/6c9317/ook_first_draft.patch
diff -urbN parrot.old/config/gen/makefiles/ook.in parrot/config/gen/makefiles/ook.in --- parrot.old/config/gen/makefiles/ook.in 1970-01-01 01:00:00.000000000 +0100 +++ parrot/config/gen/makefiles/ook.in 2002-12-30 23:25:20.000000000 +0100 @@ -0,0 +1,18 @@ +RM_F = ${rm_f} +PERL = ${perl} + +ASSEMBLE=$(PERL) ../../assemble.pl +PARROT=../../parrot + +all: build + +test: build + $(PARROT) ook.pbc hello.ook > foo.pasm + $(ASSEMBLE) foo.pasm > foo.pbc + $(PARROT) foo.pbc + +build: ook.pasm + $(ASSEMBLE) ook.pasm > ook.pbc + +clean: + $(RM_F) core *.pbc *~ foo.p* diff -urbN parrot.old/config/gen/makefiles.pl parrot/config/gen/makefiles.pl --- parrot.old/config/gen/makefiles.pl 2002-12-30 23:43:54.000000000 +0100 +++ parrot/config/gen/makefiles.pl 2002-12-30 23:25:02.000000000 +0100 @@ -31,6 +31,8 @@ commentType => '#'); genfile('config/gen/makefiles/befunge.in', 'languages/befunge/Makefile', commentType => '#'); + genfile('config/gen/makefiles/ook.in', 'languages/ook/Makefile', + commentType => '#'); } 1; diff -urbN parrot.old/languages/ook/Changes parrot/languages/ook/Changes --- parrot.old/languages/ook/Changes 1970-01-01 01:00:00.000000000 +0100 +++ parrot/languages/ook/Changes 2002-12-30 23:55:01.000000000 +0100 @@ -0,0 +1,9 @@ +Revision history for a Ook! compiler written in Parrot and targeting Parrot. + +0.0.1 Mon Dec 30 23:46:32 CET 2002 + - thanks to a silly idea of Nicholas Clark, first draft of this + Ook! compiler written in Parrot. + - every Ook! instruction is implemented but the "Ook. Ook!" + one. + - currently spitting Parrot assembly on stdout. + diff -urbN parrot.old/languages/ook/hello.ook parrot/languages/ook/hello.ook --- parrot.old/languages/ook/hello.ook 1970-01-01 01:00:00.000000000 +0100 +++ parrot/languages/ook/hello.ook 2002-12-30 23:46:46.000000000 +0100 @@ -0,0 +1,20 @@ +Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. +Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? +Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. +Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. +Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. +Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! +Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook! +Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. +Ook. Ook. Ook. Ook. Ook! Ook. diff -urbN parrot.old/languages/ook/ook.pasm parrot/languages/ook/ook.pasm --- parrot.old/languages/ook/ook.pasm 1970-01-01 01:00:00.000000000 +0100 +++ parrot/languages/ook/ook.pasm 2002-12-30 23:00:12.000000000 +0100 @@ -0,0 +1,120 @@ +# First, read the file. + set S0, P0[1] # Name of the Ook source. + open P0, S0, "<" # P0 = file descriptor + set S1, "" # S1 = accumulator +READ: + read S2, P0, 256 + length I0, S2 + le I0, 0, EOF + concat S1, S2 + branch READ +EOF: + close P0 + + +# Then, parse it to translate it. + length I0, S1 # Total length of file. + set I1, 0 # Char number in the file. + set I2, 1 # Line number (for error reporting). + set I6, 0 # While-level (iterate). + set I7, 0 # While-level (nested). + set S2, "" # Current char. + set S3, "" # Current instruction. + set S4, "\tnew P0,.PerlArray\n\tset I0,0\n" # Code generated. + branch LOOP_END +LOOP: + length I4, S3 + eq I4, 8, LOOP_CHECK_INSTRUCTION + substr S2, S1, I1, 1 + inc I1 + eq S2, "\n", LOOP_LINEFEED + eq S2, "\t", LOOP_END + eq S2, " ", LOOP_END + concat S3, S2 + branch LOOP_END + +LOOP_CHECK_INSTRUCTION: + ne S3, "Ook.Ook?", LOOP_NOT_MOVER + concat S4, "\tinc I0\n" + set S3, "" + branch LOOP_END +LOOP_NOT_MOVER: + ne S3, "Ook?Ook.", LOOP_NOT_MOVEL + concat S4, "\tdec I0\n" + set S3, "" + branch LOOP_END +LOOP_NOT_MOVEL: + ne S3, "Ook.Ook.", LOOP_NOT_INC + concat S4, "\tset I1,P0[I0]\n\tinc I1\n\tset P0[I0],I1\n" + set S3, "" + branch LOOP_END +LOOP_NOT_INC: + ne S3, "Ook!Ook!", LOOP_NOT_DEC + concat S4, "\tset I1,P0[I0]\n\tdec I1\n\tset P0[I0],I1\n" + set S3, "" + branch LOOP_END +LOOP_NOT_DEC: + ne S3, "Ook!Ook?", LOOP_NOT_WHILE + inc I7 + concat S4, "\tbranch OOK" + set S5, I6 + concat S4, S5 + concat S4, "_" + set S5, I7 + concat S4, S5 + concat S4, "\nKOO" + set S5, I6 + concat S4, S5 + concat S4, "_" + set S5, I7 + concat S4, S5 + concat S4, ":\n" + set S3, "" + branch LOOP_END +LOOP_NOT_WHILE: + ne S3, "Ook?Ook!", LOOP_NOT_ELIHW + concat S4, "OOK" + set S5, I6 + concat S4, S5 + concat S4, "_" + set S5, I7 + concat S4, S5 + concat S4, ":\n\tset I1,P0[I0]\n\tne I1,0,KOO" + set S5, I6 + concat S4, S5 + concat S4, "_" + set S5, I7 + concat S4, S5 + concat S4, "\n" + dec I7 + ne I7, 0, LOOP_NESTING_DONE + inc I6 +LOOP_NESTING_DONE: + set S3, "" + branch LOOP_END +LOOP_NOT_ELIHW: + ne S3, "Ook!Ook.", LOOP_NOT_PRINT + concat S4, "\tset I1,P0[I0]\n\tchr S1,I1\n\tprint S1\n" + set S3, "" + branch LOOP_END +LOOP_NOT_PRINT: + ne S3, "Ook.Ook!", LOOP_NOT_READ + set S3, "" + branch LOOP_END +LOOP_NOT_READ: + print "OOK? " + print S0 + print ":" + print I2 + print " " + print S3 + print "\n" + end +LOOP_LINEFEED: + inc I2 + # Fallthru. +LOOP_END: + le I1, I0, LOOP + concat S4, "\tend\n" + print S4 + end diff -urbN parrot.old/languages/ook/README parrot/languages/ook/README --- parrot.old/languages/ook/README 1970-01-01 01:00:00.000000000 +0100 +++ parrot/languages/ook/README 2002-12-31 00:03:36.000000000 +0100 @@ -0,0 +1,60 @@ +DESCRIPTION +----------- +This is an Ook! compiler written in Parrot assembly, version 0.0.1 + +This is a compiler, and not an interpreter. This means that the code +is read, then compiled into Parrot assembly (yes, the target language +is also Parrot). Then, you can fetch the Parrot assembly generated, +assemble it and interpret it with Parrot just as you would with any +other Parrot assembly file. + +You should compile and test the files with (this will run a hello +world program): + + $ make test + +Then you can compile your Ook! program with: + + $ ../../parrot ook.pbc > foo.pasm + $ perl ../../assemble.pl foo.pasm > foo.pbc + $ ../../parrot foo.pbc + + +FILES +----- +The files are the following: + ook.pasm well, that's pretty much the whole stuff + hello.ook a ook script that greets the world! + + +TODO +---- +* implement the "Ook. Ook!" instruction +* get rid of temp file (Parrot needs an eval thingy) + + +AUTHOR +------ +Jerome Quelin, <[EMAIL PROTECTED]> + + +ACKNOWLEDGEMENTS +---------------- +I would like to thank: +* Nicholas Clark for gaving me this crazy idea. He's the one to take + the blame for it. Really. :-) +* Piers Cawley who unwittingly lead me to write it. +* Dan Sugalski and all the parrot folks (you know who you are) for + providing such a nice toy to play with. + + +COPYRIGHT +--------- +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + + +SEE ALSO +-------- +* http://www.parrotcode.org +* http://www.dangermouse.net/esoteric/ook.html diff -urbN parrot.old/MANIFEST parrot/MANIFEST --- parrot.old/MANIFEST 2002-12-30 23:38:13.000000000 +0100 +++ parrot/MANIFEST 2002-12-30 23:53:09.000000000 +0100 @@ -82,6 +82,7 @@ config/gen/makefiles/jako.in config/gen/makefiles/languages.in config/gen/makefiles/miniperl.in +config/gen/makefiles/ook.in config/gen/makefiles/perl6.in config/gen/makefiles/root.in config/gen/makefiles/scheme.in @@ -1470,6 +1471,10 @@ languages/miniperl/Miniperl/t/003_generator.t languages/miniperl/Miniperl/t/004_combined.t languages/miniperl/mpc +languages/ook/Changes +languages/ook/README +languages/ook/hello.ook +languages/ook/ook.pasm languages/parrot_compiler/Makefile languages/parrot_compiler/gentable.pl languages/parrot_compiler/parrot.pasm