http://www.perlmonks.org?node_id=700901


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.

Replies are listed 'Best First'.
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.