Hi, All!
Thanks everyone for your tips. Taking bits from each, I created my own parser for the file.
#!/usr/bin/perl -wT
#-*-cperl-*-
use strict;
my (
$laststate,
$state,
$nextstate
);
open(SOURCE, "< $ARGV[0]")
or die "Couldn't open $ARGV[0] for reading: $!\n";
# There are three possible line beginnings (ignoring whitespace): '(',
+ ':', and ')'
# There are three possible line endings (ignoring whitespace): '(', ')
+', and neither one
while (<SOURCE>) {
SWITCH: {
# the first line in the file always starts with '('
# no other line will match this
/^\(/ && do {
$state = $laststate = 0;
$nextstate = 1; # elevate the state
last SWITCH;
};
# lines beginning with ':' always have whitespace before it
# these lines either maintain or elevate the state, never lower th
+e state
/^\s+:/ && do {
$laststate = $state;
$state = $nextstate;
# here is where we analyse the line endings
STATE: {
# if the line ends with '(', elevate the state
/\($/ && do {
$nextstate++;
last STATE;
};
# if the line ends with ')', maintain the state?
/\)$/ && do {
last STATE;
};
# other line endings elevate the state
$nextstate++;
}
last SWITCH;
};
# if the line contains only whitespace and ')', lower the state
/^\s+\)$/ && do {
$laststate = $state;
$state--;
$nextstate--;
last SWITCH;
};
}
# analyse our state
if ( $state != $laststate ) {
# we changed state
print "State Change!\t\t";
}
print "$laststate\t$state\t$nextstate\n";
}
close SOURCE;
I love the idea of DFA::Simple. The documentation for it sux, however. So I rolled my own based upon a review of my source file (which is still in idnopheq's scratchpad. Its just a shell so far. I'll move onto playing with real data now.
THX everone!
--
idnopheq
Apply yourself to new problems without preparation, develop confidence in your ability to to meet situations as they arrise.