package neb::Parser; use strict; use neb::Tree::Container; use neb::Tree::Sub; use neb::Tree::Tag; use neb::Tree::Stuff; use neb::Tree::Perl; use neb::Tree::Block; use neb::Tree::Vars; my %classes = ( Perl => 1, Block => 1, Vars => 1 ); sub Init { my $expat = shift; $expat->{TREE} = $expat->{PTR} = neb::Tree::Container->new; } sub Start { my $expat = shift; my $name = shift; my $obj; if ($name =~ m'^neb:(.*)$'i) { $obj = ($classes{$1} ? "neb::Tree::$1" : "neb::Tree::Sub")->new($name); } else { $obj = neb::Tree::Tag->new($name); } $obj->bind_parent($expat->{PTR}); $obj->attributes(@_); $expat->{PTR} = $obj; } sub End { my $expat = shift; my $name = shift; $expat->{PTR} = $expat->{PTR}->parent; } sub Default { my $expat = shift; my $stuff = shift; my $obj = neb::Tree::Stuff->new($stuff); $obj->bind_parent($expat->{PTR}); } sub Final { my $expat = shift; delete $expat->{PTR}; return $expat->{TREE}; } 1;