in reply to
Parse::RecDescent grammar that winds its way all the way back to start
You might design your parser to consume only one entry at a time. Pass your data to the parser as scalar reference. This way the scalar will be left with the remaining (unconsumed) text.
$parser->start_rule(\$data) or warn("not a job file"), return;
while( $data ){ $parser->job_statement(\$data) }
Since you're calling the parser anew each time, you won't have a problem with unwinding entries.
This doesn't address the question of how to resync if you encounter a bad entry.