

/* 
 * GLOSSARY
 *
 * regexp
 * regular expression
 * expression
 * pattern - a `regular' expression.  The expression
 *       need not be formally regular -- it can contain
 *       constructs that don't correspond to purely regular
 *       expressions.
 *
 * buffer
 * string - the string (or strings) being searched or matched.
 *
 * pattern buffer - a structure of type `struct re_pattern_buffer'
 *       This in turn contains a `struct rx', which holds the
 *       NFA compiled from a pattern, as well as some of the state
 *       of a matcher using the pattern.
 *
 * NFA - nondeterministic finite automata.  Some people
 *       use this term to a member of the class of 
 *       regular automata (those corresponding to a regular
 *       language).  However, in this code, the meaning is
 *       more general.  The automata used by Rx are comperable
 *       in power to what are usually called `push down automata'.
 *
 *       Two NFA are built by rx for every pattern.  One is built
 *       by the compiler.  The other is built from the first, on
 *       the fly, by the matcher.  The latter is called the `superstate
 *       NFA' because its states correspond to sets of states from
 *       the first NFA.  (Joe Keane gets credit for the name
 *       `superstate NFA').
 *
 * NFA edges
 * epsilon edges
 * side-effect edges - The NFA compiled from a pattern can have three
 *       kinds of edges.  Epsilon edges can be taken freely anytime
 *       their source state is reached.  Character set edges can be
 *       taken when their source state is reached and when the next 
 *       character in the buffer is a member of the set.  Side effect
 *       edges imply a transition that can only be taken after the
 *       indicated side effect has been successfully accomplished.
 *       Some examples of side effects are:
 *
 *		Storing the current match position to record the
 *              location of a parentesized subexpression.
 *
 *              Advancing the matcher over N characters if they
 *              match the N characters previously matched by a 
 *              parentesized subexpression.
 *
 *       Both of those kinds of edges occur in the NFA generated
 *       by the pattern:  \(.\)\1
 *
 *       Epsilon and side effect edges are similar.  Unfortunately,
 *       some of the code uses the name `epsilon edge' to mean
 *       both epsilon and side effect edges.  For example,  the
 *       function has_non_idempotent_epsilon_path computes the existance
 *       of a non-trivial path containing only a mix of epsilon and
 *       side effect edges.  In that case `nonidempotent epsilon' is being
 *       used to mean `side effect'.
 */



