Sections and classes
After the basic elements, the grammar defines the section and class rules.
A section is some word characters (we do not statically list the names of
the sections, leaving the door open for easy addition of new sections
during the runtime of cfperl) followed by ":" (a colon). Anything after
the colon is discarded. The key action of a section is to set the global
$current_section to the section name and
reset the global current classes variable
"any." Note that in the "input" rule, a section comes after a compound
class. That's because a section matches a compound class, whose key
marker is the "::" sequence (two colons).
The classes can be detected in two ways: either by themselves, where they
are a compound class name followed by "::" (two colons), or followed by a
line which is to be executed. In either case, the global
$current_classes variable is set to the compound class name.
The purpose of the top-level parser is to produce "cfrun atoms." These
atoms are interpreted in the
cfrun() function. The cfrun atoms are
produced as anonymous hashes (allowing room for more elements than just
"section," "classes," and "line" in the future). The anonymous hashes
grab the current section and compound class from the global variables set
in other parts of the grammar. Thus, the grammar behaves like a
finite-state machine that moves between states to produce cfrun atoms.
Finally, the input()
input() rule is a marvel of ingenuity, destined to end world
hunger and bring about a new era of international cooperation. No, not
really, but it is quite useful! The
input() rule lists alternate input
possibilities in a specific order. For instance, a class could be
interpreted as a section, so it must come before a section. A class with
a line could be interpreted as a class (and the line dropped) if it didn't
come before a class. Thus, the order is important and you should
understand why it is specified that way.
It may seem obvious, but the
input() rule was in fact the most difficult
part of the grammar to write correctly, since it required correct ordering
of all alternate input possibilities and an understanding of all the
possible input the program could get. In fact, the
input() rule is the
top entry point of the top-level grammar, which makes it one of the keys
to the cfperl program itself. Try (on a local copy of the cfperl program,
using the sample configurations from the Resources section) modifying the
input() order and see how it changes the cfperl behavior.