#!/usr/bin/perl package SexprNode; use strict; use warnings; sub new { my $class = shift; my $sexprnode = {_succ => [], _pred => undef, _label => shift, _start => -1, _end=> -1}; bless $sexprnode, $class; return $sexprnode; } sub label { my $sexrpn = shift; return $sexrpn->{_label}; } sub attachsexprn { my $predn = shift; my $succn = shift; push @{$predn->{_succ}}, $succn; $succn->{_pred} = $predn; } sub DESTROY { my $sexprn = shift; foreach my $n (@{$sexprn->{_succ}}){ $n->DESTROY; } $sexprn->{_succ} = undef; $sexprn->{_pred} = undef; } sub dfs { my $sexprn = shift; if (defined($sexprn->{_succ})){ return ($sexprn, map { $_->dfs } @{$sexprn->{_succ}}); }else{ return $sexprn; } } sub prettystring { my $sexprn = shift; my $indent = shift; my $prettys; if (!@{$sexprn->{_succ}}){ $prettys .= '(' . $sexprn->{_label} . ') '; }else{ $prettys = '(' . $sexprn->{_label} . ' '; my $whitespace = ''; foreach my $n (@{$sexprn->{_succ}}){ if (!@{$n->{_succ}}){ $prettys .= $whitespace . $n->prettystring(''); $whitespace = ''; }else{ $whitespace = "\n" . $indent; $prettys .= $whitespace . $n->prettystring($indent . ' '); } } $prettys .= ')'; } return $prettys; } 1;