Inline::Spew - Inline module for Spew
use Inline Spew => <<'SPEW_GRAMMAR'; START: "the" noun verb noun: "dog" | "cat" | "rat" verb: "eats" | "sleeps" SPEW_GRAMMAR my $sentence = spew();
Inline::Spew is an Inline module for the Spew language. Spew is a random-grammar walker for generating random text strings controlled by a grammar.
Each Inline invocation defines a single subroutine, named spew by default. The subroutine takes a single optional parameter, declaring the "start symbol" within the spew grammar, defaulting to START. The grammar is randomly-walked, and the resulting string is returned.
spew
START
The grammar is very similar to Parse::RecDescent's grammar specification. Each non-terminal provides one or more alternatives, which consist of sequences of non-terminals and/or terminals. An alternative is chosen at random, by default equally weighted. You can set weights for the various alternatives easily: see below. The chosen non-terminals are expanded recursively until the result is a sequence of the remaining terminals.
Parse::RecDescent
For example, the following invocation randomly returns a character from the Flintstones:
use Inline Spew => <<'END'; START: flintstone_character | rubble_character flintstone_character: ("fred" | "barney" | "pebbles") " flintstone" | "dino" rubble_character: ("barney" | "betty" | "bamm bamm") " rubble" END my $character = spew(); my $flint = spew("flintstone_character"); # only flintstone
The cost to compile a grammar is roughly a second on a reasonably speedy machine, so the grammar compilation is cached by the Inline mechanism. As long as the source text is not changed (regardless of the file in which it appears), the compilation can be re-used.
Inline
Parse::RecDescent is required for the compilation. YAML is required for the saving and restoring of the spew grammar data structure (and Inline itself).
YAML
The name of the subroutine defined by the inline invocation. Default is spew in the current package. A name without colons is presumed to be in the current package. A name with colons provides an absolute path.
Part of the Inline interface.
See http://www.stonehenge.com/merlyn/LinuxMag/col04.html for a detailed explanation and examples. Here's the relevent extract:
http://www.stonehenge.com/merlyn/LinuxMag/col04.html
Non-terminals of the random sentence grammar are C-symbols (same as Perl identifiers).
Terminals are Perl-style quoted strings, permitting single-quoted or double-quoted values, even with alternate delimiters, as in qq/foo\n/.
qq/foo\n/
Generally, a rule looks like:
non_terminal: somerule1 | somerule2 | somerule3
A rule may have a subrule (a parenthesized part). For these anonymous subrules, a non-terminal entry is generated for the subrule, but assigned a sequentially increasing integer instead of a real name. In all other respects, the non-terminal acts identical to a user-defined non-terminal. This means that:
foo: a ( b c | d e ) f | g h
is the same as
foo: a 1 f | g h 1: b c | d e
... except that you can't really have a non-terminal named 1.
1
Weights are added by prefixing a choice with a positive floating-point number followed by an @, as in:
@
foo: 5 @ fred | 2 @ barney | 1.5 @ dino | betty
which is five times as likely to pick fred as betty (or a total of 5 out of 9.5 times). This is simpler than repeating a grammar choice multiple times, as I've seen in other similar programs, and makes available fine-grained ratio definitions.
fred
betty
None.
The Linux Magazine article at http://www.stonehenge.com/merlyn/LinuxMag/col04.html.
Double-quoted strings may contain arbitrary Perl code in subscripts, executed when the grammar is compiled. Quoted strings also include `` or qx//, causing shell commands to be executed when the grammar is compiled. Adding Safe would be a good thing, and is in the TODO list.
``
qx//
Safe
Randal L. Schwartz (Stonehenge Consulting Services, Inc.), <merlyn@stonehenge.com>
<merlyn@stonehenge.com>
Copyright 2002, 2003 by Randal L. Schwartz
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Inline::Spew, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Inline::Spew
CPAN shell
perl -MCPAN -e shell install Inline::Spew
For more information on module installation, please visit the detailed CPAN module installation guide.