parrotcode: Untitled | |
Contents | Language Implementations | TCL |
This was originally written as a perl5 script. Rather than doing bootstrapping, I foolishly decided it would be fun to write the parser IN parrot assembly, esp. as this would help implementing "eval" and "proc" (Of course, in retrospect, I really wish I had kept with the bootstrapping effort, as I think it would have generated usable results sooner.
This is a from-scratch implementation, based primarily on the tcl man page(s), and the cvs-current test suite for tcl.
Another interesting project would have been to modify the tcl source and have it generate parrot directly. Many people smarter than I am have declared this hard, so I'm rather happy I'm working on it this way. (Apparently Tcl's bytecode engine is very optimized for Tcl (big surprise). So, converting the tcl-specific bytecodes there to parrot would be a big deal.)
When you make tcl, you're generating several files:
compile
opcode.tclsh
- It takes the command line arguments (currently,
the name of the file you wish to parse),
and reads in the file,
and uses the tcl library to parse those contents as tcl.
You can also specify command line options to be used with this bytecode file.PIR
files are generated from their corresponding .tg
and .pg
files.
These grammar files allow us to use PGE's implementation of perl6 rules to more simply specify our parsing rules.
At the moment,
only the [expr] rules are used.
This might eventually be extended to replace the entire parsing system used by tcl,
which was originally hand-rolled in PIR
.The classes are not user-visible,
but are internal helper classes designed to simplify the parser/interpreter.
They are written in PIR and are in src/classes
.
All the helper classes provide a compile
method,
which can be invoked by the top level compiler,
or by a container class.
For example,
in TclConst
,
the compilation is a very straightforward register load,
while TclCommandList
compiles each of the TclCommand
s it contains,
which in turn compile their arguments,
and their method name,
and setup an invocation of the PIR subroutine that corresponds to the tcl proc or builtin.
puts ab$c
TclWord
containing an TclConst
==ab
and a TclVar
==c
. When compiled, a TclWord
compiles each of its elements and concatenates the results.The Tcl PMCs (Parrot Magic Cookies) are the user visible data types. These live in the *.pmc
files in src/pmc/. They are compiled into a dynamically loadable library which is loaded with the .HLL
directive (HLL stands for High Level Language). Most of the functionality associated with these PMCS is derived from the base parrot classes, except as noted below.
.0
.[list]
builtin. Overrides the default stringification provided by parrot Arrays.[array]
builtin.To run the test suite, make test
. If you want to also get output from the TODO tests, make devtest
instead. This is NOT the tcl test suite. Occasional failures are suspected against svn-head; there should be no failures in a released version, however.
To run the tcl test suite, type make tcl-test
. This will checkout the latest cvs copy of the tests from the tcl repository and run them. Warning:
There are examples in the examples
directory that are vaguely more interesting. Change to that directory and type make
for directions.
|