As software systems evolve, they become more complex
and harder to understand and maintain. Certain
reverse engineering techniques attempt to
reconstruct software models from source code with
the help of a parser for the source language.
Unfortunately a great deal of effort may be required
to build a specialized parser for a legacy
programming language or dialect. On the other hand,
(i) we typically do not need a complete parser that
recognizes all language constructs, and (ii) we have
a rich supply of (legacy) examples. We present an
approach to use these facts to rapidly and
incrementally develop parsers as follows: we specify
mappings from source code examples to model
elements; we use the mappings to generate a parser;
we parse as much code as we can; we use the
exceptional cases to develop new example mappings;
and we iterate. Experiments with Java and Ruby, two
very different languages, suggest that our approach
can be a very efficient and effective way to rapidly
construct software models from legacy code.