Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Writing an ODL parser?

by pc88mxer (Vicar)
on Jul 29, 2008 at 19:22 UTC ( #700901=note: print w/ replies, xml ) Need Help??


in reply to Writing an ODL parser?

You might consider writing a parser which is just "good enough" for the files you want to process. Since structures seem to end on line boundaries, you can try something like this:

my $root = {}; my @stack; my $object = $root; use Data::Dumper; while (<DATA>) { if (m{^\s*\/\*}) { next } # assume single line comment elsif (m/^\s*END(_OBJECT)?/) { $object = pop(@stack); } elsif (m/^\s*OBJECT\s*=\s*(\S+)/) { my $new = { parent => $object, type = $1 }; push(@{$object->{children}}, $new); push(@stack, $object); $object = $new; } elsif (m/^\s*(\w+)\s*=\s*(\S*)/) { my $property = $1; my $value = $2; if ($value =~ m/^"/) { while ( (($value =~ tr/"//) % 2 != 0) && defined($_ = <DATA>)) { s/^\s*//; $value .= $_; } } $object->{$property} = $value; } } print Dumper($root);
The string literal parsing is admittedly a little cheesy since I don't know what the rules are for representing literals in ODL files.


Comment on Re: Writing an ODL parser?
Download Code
Re^2: Writing an ODL parser?
by dHarry (Abbot) on Jul 30, 2008 at 14:12 UTC

    Thanks for the effort!

    You might consider writing a parser which is just "good enough" for the files you want to process. Since structures seem to end on line boundaries, you can try something like this: ...

    Writing something just "good enough" was exactly my first approach:-) But now I want to improve and make it more generic. As you can read in my reply to moritz the values can be a bit tricky.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (7)
As of 2014-10-01 22:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    What is your favourite meta-syntactic variable name?














    Results (40 votes), past polls