parrotcode: Parrot abstract syntax tree | |
Contents | Compilers |
PAST - Parrot abstract syntax tree
This file implements the various abstract syntax tree nodes for compiling programs in Parrot.
PAST::Node
is the base class for all PAST (and POST) nodes.
It's derived from class Capture
,
so that it has both array and hash components.
The array component is used to maintain a node's children,
while the hash component contains the attributes of the node.
In general we provide and use accessor methods for a node's attributes,
instead of accessing the hash component directly.
Every PAST node predefines name
,
source
,
and pos
attributes.
The name
attribute is the node's name,
if any,
while source
and pos
are used to identify the location in the original source code for the node.
The source
and pos
values are generally set by the node
method below.
Other node attributes are generally defined by subclasses of PAST::Node
.
push
method,
below) and calls the appropriate accessor method for each attribute.
And returns the node.child
to the beginning of the invocant's list of children.child
to the end of the invocant's list of children.class
,
initializes it with the given children and attributes,
and adds it to the end of the invocant's array of children.
Returns the newly created PAST node.source
and pos
attributes to those of val
.
If val
is another PAST node,
then source
and pos
are simply copied from that node,
otherwise val
is assumed to be a Match
object and obtains source/position information from that.name
attribute of the invocant.has_value
is true then set the invocant's value of attrname
to value
.
Returns the (resulting) value of attrname
in the invocant.fmt
is provided,
then it will be used as a prefix to the unique number.name
in a format that can be compiled by PIR.adverbs
.PAST::Val
nodes represent constant values in the abstract syntax tree.
The name
attribute represents the value of the node.
PAST::Var
nodes represent variables within the abstract syntax tree.
The variable name (if any) is given as the node's name
attribute.
isdecl
attribute (for lexical variables) to flag
.
A true value of isdecl
indicates that the variable given by this node is to be created within the current lexical scope.
Otherwise,
the node refers to a lexical variable from an outer scope.isslurpy
attribute (for parameter variables) to flag
.
A true value of isslurpy
indicates that the parameter variable given by this node is to be created as a slurpy parameter (consuming all remaining arguments passed in).type
indicates either the type of the value to create for the node or (future implementation) a PAST tree to create the value.islvalue
attribute,
which indicates whether this variable is being used in an lvalue context.PAST::Op
nodes represent the operations in an abstract syntax tree.
The primary function of the node is given by its pasttype
,
secondary functions may be given by the node's name
,
pirop
,
or other attributes.
PAST::Op
node's pasttype
determines the type of operation to be performed.
Predefined values of pasttype
are:name
attribute,
if the node has no name
attribute then the first child is assumed to evaluate to a callable sub.inline
attribute (a string).
See the inline
method below for details.name
attribute,
then the first child is the invocant and any remaining children are arguments.
If the node doesn't have a name
attribute,
then the first child evaluates to the method to be called,
the second child is the invocant,
and the remaining children are arguments to the method call.pasttype
,
then it assumes "pirop" if its pirop
attribute is set,
otherwise it assumes "call".pasttype
is "inline".
The code
argument is PIR text to be inserted in the final generated code sequence.
Sequences of "%0",
"%1",
"%2",
...
"%9" in code
are replaced with the evaluated results of the first,
second,
third,
...,
tenth children nodes.
(If you need more than ten arguments to your inline PIR,
consider making it a subroutine call instead.)code
string: %r - Generate a unique PMC register for the result.
%t - Generate a unique PMC register for the result,
and initialize it with an object of type C<returns>
before the execution of the inline PIR.
%u - Re-use the first child's PMC (%0) if it's a temporary
result, otherwise same as %t above.
%v - (void) Re-use the first child's PMC (%0) as the result
of this operation.
PAST::Stmts
is a container of PAST::Node
without any specific methods.
PAST::Block
nodes represent lexical scopes within an abstract syntax tree, and roughly translate to individual Parrot subroutines. A PAST::Block
node nested within another PAST::Block
node acts like a nested lexical scope.
If the block has a name
attribute, that becomes the name of the resulting Parrot sub, otherwise a unique name is automatically generated for the block.
if
, while
, and other similar statements).name
in the current block. The HLL is free to select any symbol attributes desired, although the 'scope' attribute is typically used to assist with lexical scoping of PAST::Var nodes.name
.symbol
method above.name
instead of the standard PAST compiler.Patrick Michaud <pmichaud@pobox.com> is the author and maintainer. Please send patches and suggestions to the Parrot porters or Perl 6 compilers mailing lists.
2006-11-20 Patrick Michaud added first draft of POD documentation.
Copyright (C) 2006, The Perl Foundation.
|