#!/usr/bin/perl $firstline = ; # ignore the first line. @stack = (); # our processing stack @stack_u = (0); # our unnamed stack @stack_ue = (0); # our unnamed element stack %tree = (); $cur = \%tree; $unnamed = 0; $unnamed_ele = 0; $pos = 1; while() { $pos++; $line = $_; # an element # $1 = element name # $2 = element value (may not exist) if ( $line =~ /\s*:\s*([\w\-]+)*\s*(\((.*)\))*\s*$/) { # print "$pos: '".strip($line)."' is an element "; if($1) { $elename = $1; } else { $elename = "__unnamed__$unnamed_ele"; $unnamed_ele++; } if($3 || $3 == 0) { $value = $3; } else { $value = ""; } # print "elename: '$elename' value: '$value'\n"; $cur->{$elename} = $value; $cur->{"__type__$elename"} = 0; next; } # a new object # $1 = object name, may or may not exist # $2 = assumed title, may or may not exist if ( $line =~ /^\s*:\s*([\w\-]+)*\s*\(([a-zA-Z0-9\ \-_:%\.\&\[\]\/\\\"]+)*\s*$/ ) { # print "$pos: '".strip($line)."' is a new object "; if($1) { $objname = $1; } else { $objname = "__unnamed__$unnamed"; $unnamed++; } if($2) { $objtitle = $2; } else { $objtitle = ''; } # print "objname: '$objname' objtitle = '$objtitle'\n"; if($objtitle) { $cur->{$objname} = ("__assumed_title__" => $objtitle); } else { $cur->{$objname} = (); } $cur->{"__type__$objname"} = 1; $cur2 = $cur->{$objname}; # print "$pos: pushing '".$cur."'\n"; push(@stack, $cur); push(@stack_u, $unnamed); push(@stack_ue, $unnamed_ele); $cur = $$cur2; next; } if ( $line =~ /\s*\)\s*$/ ) { # print "$pos: object brace closed\n"; $cur = pop(@stack); # print "$pos: poping '". $cur ."'\n\n"; $unnamed = pop(@stack_u); $unnamed_ele = pop(@stack_ue); next; } print "$pos: WARNING Dont know how to handle '".strip($line)."'\n"; } print "tree: ".%tree."\n"; print "lines: $pos\n"; disptree(\%tree, 0); sub strip { my $str = shift; $str =~ s/^\s+|\s+$//g; return $str; }; sub disptree { my $t = shift; my $d = shift; while(my ($key, $value) = each(%$t)) { print "key: '$key' value: '$value'\n"; if ( $key =~ /__type__.*/ ) { next; } else { print "key '__type__$key' value: '".$t{"__type__$key"}."'\n"; } if ( $key =~ /__unnamed__[0-9]+/ ) { $keyprint = ""; } else { $keyprint = $key; } if($t->{"__type__$key"} == 1) { if($t->{'__assumed_title__'} ) { print ":$keyprint ( ".$t->{'__assumed_title__'}."\n"; } else { print ": (\n"; } disptree($value, $d+1); print " )\n"; next; } for($i=0;$i<$d;$i++) { print "\t"; } print ":$keyprint ($value)\n"; } }