In the following pages, we implement all
the components of the Jeeves framework. You may find it helpful to
run jeeves
for a sample problem and have a copy of
the output handy.
The AST module is a very simple library, so we will look at only a few of the more interesting procedures below.
An AST node is a container of properties, so a hash table suits the job perfectly. Each node is given a name for ease of debugging:
package Ast;
use strict;
sub new {
my ($pkg, $name) = @_;
bless {'ast_node_name' => $name}, $pkg;
}
new
,
add_prop
, and add_prop_list
are used by all specification parsers to create AST objects:
sub add_prop { my ($node, $prop_name, $prop_value) = @_; $node->{$prop_name} = $prop_value; } sub add_prop_list { my ($node, $prop_name, $node_ref) = @_; if (! exists $node->{$prop_name}) { $node->{$prop_name} = []; } push (@{$node->{$prop_name}}, $node_ref); }
add_prop
simply adds a name-value pair to the AST
object.
add_prop_list
creates a list-valued property. The
property value is an anonymous array that contains references to
other AST nodes. You can have your own list-valued properties, but
you should never use them as an argument to
@foreach
because it assumes that the elements of
that list are AST nodes.
my @saved_values_stack;
sub visit { no strict 'refs'; my $node = shift; package main; my ($var, $val, $old_val, %saved_values); while (($var,$val) = each %{$node}) { if (defined ($old_val = $$var)) { $saved_values{$var} = $old_val; } $$var ...
No credit card required