Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^3: Parsing a macro language

by simonm (Vicar)
on Jul 09, 2005 at 03:31 UTC ( #473639=note: print w/ replies, xml ) Need Help??


in reply to Re^2: Parsing a macro language
in thread Parsing a macro language

You could decouple the parsing and building steps, as nothingmuch suggested:

sub parse_brackets { my @out; foreach my $line ( @_ ) { $line_no ++; $line =~ s/\A\s+//; $line =~ s/\s+\Z//; if ( $line !~ /\S/ ) { next; } elsif ( $line =~ s/\s*\{$// ) { push @out, 'open' => [ split ' ', $line ]; } elsif ( $line eq '}' ) { push @out, 'close' => 1; } else { push @out, 'line' => $line; } } return @out; } sub build_brackets { my @parse; my @stack = \@parse; while ( scalar @_ ) { my ( $type, $value ) = splice( @_, 0, 2 ); if ( $type eq 'open' ) { my %node = ( type => shift(@$value), ( @$value ? ( name => shift +(@$value) ) : () ) ); push @{ $stack[0] }, \%node; unshift @stack, do { $node{contents} = [] }; } elsif ( $type eq 'close' ) { shift @stack; scalar @stack or die("Too many right brackets"); } else { push @{ $stack[0] }, $value; } } scalar @stack == 1 or die("Too few right brackets"); return @parse; } use Data::Dumper; print Dumper( build_brackets( parse_brackets( @lines ) ) );

I'm not sure this is a big win for your case, but if you need the extra flexiblity...


Comment on Re^3: Parsing a macro language
Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://473639]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (10)
As of 2015-07-31 07:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (275 votes), past polls