lex and yacc: Tools Worth Knowing

Today, computers can talk and they can listen—but how often do they do what you want?

This article is about how Linux was used
to program a Sun machine to manipulate well-log recordings to
support finding oil and gas exploration in Western Canada. It will
describe the problem, provide enough background to make the problem
understandable, and then describe how the two fascinating UNIX
utilities lex and
yacc were used to let a user
describe exactly what he wanted to satisfy his particular need.

Some Background

In the fall of 1993, I had been recently downsized and was
approached by a former colleague for assistance. He, and another
former colleague, both of whom were still with my last employer,
were what is known in the industry as well-log analysts.

To understand what a log analyst is requires a little
knowledge of oil and gas exploration methods. Energy companies, as
they like to be known, employ several different categories of
professionals to assist them in finding salable quantities of
hydrocarbons. Chief among these are the geologists and
geophysicists (of which I am one) who study the recordings made in
bore holes, or process and examine seismic recordings to identify
what are popularly known as “plays” or “anomalies”.

Bore holes are simply the holes left when a drill rig moves
off the drilling platform. Generally, these holes are logged by
service companies who lower instruments called
tools into the hole, and who then record on
magnetic tape the readings made by those instruments.

There are many different types of tools, including sonic
(which measures the time needed for a pulse of sound energy to
travel through the rock wall from one end of the tool to the
other), density (a continuous recording of the rock wall density),
and gamma ray (a measure of gamma radiation intensity in the rock).
These are just a few of the types of measurements that are made,
recorded and called logs.

The various logs are examined by geologists to gain an
understanding of what was happening when the rocks forming the bore
hole were laid down, and what has happened to them subsequently as
shallower rocks were created above them.

Geophysicists are more inclined to study seismic recordings
which in essence are indirect measurements of the properties of the
rocks forming the subsurface. Geophysics and Linux will not be
discussed here, but you may find Sid Hellman's “Efficient, User
Friendly Seismology”, Linux Journal, August
1995, Issue 16 of interest.

While seismic recordings provide much greater volumes of
interpretable data over large areas, well logs are definitive
measurements made at single locations, sometimes close together,
and sometimes not. Geologists often correlate adjacent well logs to
create cross sections of the subsurface, much like seismic
recordings would provide. Detailed interpretation of individual
logs, however, is often left to the log specialists.

The Problem

My two acquaintances were log specialists who wanted an
additional tool to assist them in the processing and interpretation
of individual or combinations of logs. Specifically, they wanted to
tell the computer to perform arithmetic operations on individual or
some algebraic combination of logs.

For example, they might need to scale a specific log by an
arbitrary amount, say 1.73. In another case, they might want to
divide one log by another, and then add the result to a third, all
before adding a constant and then raising the resulting values to
some arbitrary power.

Keeping in mind that logs are composed of individual sample
values taken as frequently as every few inches (or centimeters as
they are here in Canada and many other places in the world), these
example requests would mean a reasonable amount of computation,
multiplying every sample of thousands of meters of recorded log
values by 1.73, in the first example. The simple scaling problem
isn't particularly difficult, but identifying the desired log could
be.

The energy company for which my acquaintances worked was
using a simple filing method for all the log curves (a curve
corresponds to all the recorded samples for one tool in one bore
hole) wherein each curve was identified by a name. To this was
added some additional information on units and so on, plus all the
samples for all the curves for the well. All the data were stored
as ASCII. (The file format is known as Log ASCII Standard format,
or LAS version 2.0, and although the names for curves were
generally the same from well to well, that was not
guaranteed.)

As a result, more complicated combinations of curves required
a fairly sophisticated and robust mechanism for arbitrary name
recognition, while the desired algebraic operation was being
described. Given such an interesting challenge, I recognized an
opportunity to put some relatively little-used tools to work:
lex and
yacc.