Jeeves Implementation
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.
AST Module
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 ...
Get Advanced Perl Programming now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.