home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Source Code 1992 March
/
Source_Code_CD-ROM_Walnut_Creek_March_1992.iso
/
usenet
/
altsrcs
/
1
/
1654
/
manual
< prev
next >
Wrap
Text File
|
1990-12-28
|
5KB
|
187 lines
INPUT FILE FORMAT:
The file is a series of class definitions followed by an end
marker. The end marker is a line containing only "%%".
A class definition begins with a line containing '%' followed by a class
name. Class names can be any length and can consist of any combination
of upper and lower case letters, and numbers.
The lines following are instances of the class, one per line. When a
class is invoked, one of these is picked at random. Most characters in
the line are just copied to the output. The newline at the end is not
copied. An instance may be continued onto the next line by ending the
line with '\'. There is a limit of 1000 bytes on the total size of an
instance. An instance may begin with '%' if it is escaped: '\%'. A
newline may be written as '\!'. A backslash may be written as '\\'.
The following is a simple rules-file that prints out either 'foo'
or bar, followed by a carriage-return:
%MAIN
foo\!
bar\!
%%
The program generates a random instance of the class 'MAIN', which in
this case selects 'foo' or 'bar', with a 50-50 chance. A newline is
appended.
WEIGHTS
To give 'foo' a 90% chance of happening, you can assign weights:
%MAIN
(9)foo\!
bar\!
%%
The weight of 'bar' is 1 by default. If an instance is to begin with '('
it must be escaped, or given an explicit weight:
\(animal)
(1)(vegetable)
INVOCATION
Classes are normally invoked by writing their name immediately after a
backslash. Below is a rules-file which is equivalent to the foo-bar
example:
%MAIN
\word\!
%word
(9)foo
bar
%%
In this case, the class 'word' outputs either 'foo' or 'bar', and
the newline is appended after the invocation in 'MAIN'.
If you wish to immediately follow a class invokation by a letter or a number,
you must write it followed by a slash and a space:
%MAIN
\word/ bar\!
%word
foo
bar
%%
The above outputs either 'foobar' or 'barbar'. This method must also
be used if the invokation is to be immediately followed by a slash.
VARIANTS
A class may be defined with variants, and may then be invoked with
variants. The 's' variant defined for the 'fruit' class below
allows correct plurals to be generated:
%fruit{s}
apple{|s}
cherr{y|ies}
pear{|s}
mango{|es}
%MAIN
One \fruit and two \fruit/s.\!
%%
The variant tag is a single letter or number. In an invocation, the
class name is followed by a slash which is followed by the tag. Every
class has a 'null' variant (tagged by a space) by default (thus the "/ "
notation).
In the class definition line, the class name is followed by a list
of variant tags in curly brackets. The order of the tags is
significant.
In an instance definition, variants may be created with the following
notation:
{ <null-variant-text> | <1st-variant-text> | <2nd-variant-text }
When a class is invoked with a null tag, or with a blank tag, the
text before the first '|' is used. If the first tag is used in the
invocation (i.e. the first tag listed in {}'s in the class definition),
the text between the first and second |'s is used, and so forth. All
text not in {}'s is copied regardless of the tag used.
There are normally as many |'s in these as there are tags defined.
If there are too many tags, the excess ones select null strings, and
if there are too many |'s, the excess strings are redundant.
The '{' character, if required literally, must always be escaped
outside the selector construction: '\{', even when no variants are
defined in a class. The '|' and '}' characters must likewise be
escaped inside a constructor.
Invocations may appear in a selector, but cannot span a selector.
I.e. you cannot select between invoking 'catwalk' and 'catfish' by
\cat{walk|fish}
You must use {\catwalk|\catfish}.
Finally, there is the & tag which may be used in an invocation and
selects the same tag letter (or number) which the invoking
class was invoked with:
%food{s}
\fruit/& <--- this is the same as
{\fruit|\fruit/s} <--- this.
MAIN is initially invoked with the null tag (although it can be invoked
recursively with other tags).
Here is a class with multiple tags that generates irregular verbs:
%verb{sd}
{eat|eats|ate}
{be|is|was}
{see|sees|saw}
look{|s|ed}
f{ind|inds|ound}
%%
Thus \verb/d generates a past-tense verb.
PRUNING
There is one "special" pseudo-class, PRUNE. When PRUNE is invoked, no
more output is generated on that line, and control immediately reverts
to the *end* of the last class invoked whose name ended with an '!'.
This is useful when a certain series of choices can suddenly end
the phrase or whatever (such as an abrupt, "startler" terminator to a
joke). Currently prunestops (those classes ending with an '!' which
stop the backtracking after a \PRUNE) can not be nested; a \PRUNE after
an inner prunestop has been exited will cause an error message. This
should probably be fixed sometime, as well as making the prunestop
specification more elegant. Example:
%MAIN
Joe got sick, \THENWHAT!/ .
%THENWHAT!
\MIDDLE \CONVALESCE
%MIDDLE
was sick for a while,
ate some magic herbs,
and died\PRUNE
%CONVALESCE
then got better.
and recovered.
%%
In this case, if "and died" is chosen, text generation will resume
immediately after \THENWHAT!/ , producing "Joe got sick, and died.".
COMMENTS:
At any point, '\*' may appear on a line and the rest of the line
is ignored. Blank lines are ignored completely ( as are lines
beginning in \* ).
Empty instances must therefore be given an explicit weight of one:
%AllOrNothing\* 50% chance, 'All', or nothing.
All
(1)