Grail is a collection of programs for processing finite-state machines and regular expressions. At the user level, Grail consists of a set of filters that manipulate machines and expressions. Machines can be minimized, made deterministic, renumbered, reversed, executed (on some target string), enumerated, completed, complemented, reduced to reachable sets, and converted to regular expressions. Regular expressions can be converted to finite-state machines and have their parenthesization minimized. There are also a set of predicate filters that test for conditions such as determinism, completeness, isomorphism, and universality. The use of these filters is described in the User's Guide to Grail and in the associated man pages.
Grail's finite-state machines and regular expressions are parameterizable. It is possible to compile Grail with an input alphabet defined by any valid C++ type or class. Grail as shipped includes the alphabets of ASCII characters, ordered pairs of integers, and regular expressions.
Grail permits multiple start and final states in its machines. A machine with more than one start state is nondeterministic by definition.
Grail is based on a C++ class library that can be called directly from a a C++ program. The use of this class library is described in the Programmer's Guide to Grail.