Index: trunk/lib/Text/FormBuilder.html
===================================================================
--- trunk/lib/Text/FormBuilder.html	(revision 1)
+++ trunk/lib/Text/FormBuilder.html	(revision 1)
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Text::FormBuilder - Parser for a minilanguage describing web forms</title>
+<link rev="made" href="mailto:" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+	<li><a href="#name">NAME</a></li>
+	<li><a href="#synopsis">SYNOPSIS</a></li>
+	<li><a href="#description">DESCRIPTION</a></li>
+	<ul>
+
+		<li><a href="#new">new</a></li>
+		<li><a href="#parse">parse</a></li>
+		<li><a href="#build">build</a></li>
+		<li><a href="#write">write</a></li>
+	</ul>
+
+	<li><a href="#language">LANGUAGE</a></li>
+	<ul>
+
+		<li><a href="#directives">Directives</a></li>
+		<li><a href="#fields">Fields</a></li>
+		<li><a href="#comments">Comments</a></li>
+	</ul>
+
+	<li><a href="#see_also">SEE ALSO</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>Text::FormBuilder - Parser for a minilanguage describing web forms</p>
+<p>
+</p>
+<hr />
+<h1><a name="synopsis">SYNOPSIS</a></h1>
+<pre>
+    my $parser = Text::FormBuilder-&gt;new;
+    $parser-&gt;parse($src_file);
+    
+    # returns a new CGI::FormBuilder object with the fields
+    # from the input form spec
+    my $form = $parser-&gt;build_form;</pre>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p>
+</p>
+<h2><a name="new">new</a></h2>
+<p>
+</p>
+<h2><a name="parse">parse</a></h2>
+<p>
+</p>
+<h2><a name="build">build</a></h2>
+<p>
+</p>
+<h2><a name="write">write</a></h2>
+<p>
+</p>
+<hr />
+<h1><a name="language">LANGUAGE</a></h1>
+<pre>
+    name[size]|descriptive label[hint]:type=default{option1(display string),option2(display string),...}//validate
+    
+    !title ...
+    
+    !pattern name /regular expression/
+    !list name {
+        option1(display string),
+        option2(display string),
+        ...
+    }</pre>
+<p>
+</p>
+<h2><a name="directives">Directives</a></h2>
+<dl>
+<dt><strong><a name="item__21pattern"><code>!pattern</code></a></strong><br />
+</dt>
+<dt><strong><a name="item__21list"><code>!list</code></a></strong><br />
+</dt>
+<dt><strong><a name="item__21title"><code>!title</code></a></strong><br />
+</dt>
+</dl>
+<p>
+</p>
+<h2><a name="fields">Fields</a></h2>
+<p>Form fields are each described on a single line.
+
+</p>
+<p>
+</p>
+<h2><a name="comments">Comments</a></h2>
+<pre>
+    # comment ...
+
+</pre>
+<p>Any line beginning with a <code>#</code> is considered a comment.
+
+</p>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><a href="/CGI/FormBuilder.html">the CGI::FormBuilder manpage</a>
+
+</p>
+
+</body>
+
+</html>
Index: trunk/lib/Text/FormBuilder.pm
===================================================================
--- trunk/lib/Text/FormBuilder.pm	(revision 97)
+++ trunk/lib/Text/FormBuilder.pm	(revision 1)
@@ -4,335 +4,102 @@
 use warnings;
 
-use base qw(Exporter Class::ParseText::Base);
-use vars qw($VERSION @EXPORT);
-
-$VERSION = '0.14';
-@EXPORT = qw(create_form);
-
-use Carp;
+our $VERSION = '0.01';
+
 use Text::FormBuilder::Parser;
 use CGI::FormBuilder;
-
-use Data::Dumper;
-$Data::Dumper::Terse = 1;           # don't dump $VARn names
-$Data::Dumper::Quotekeys = 0;       # don't quote simple string keys
-
-# the static default options passed to CGI::FormBuilder->new
-my %DEFAULT_OPTIONS = (
-    method => 'GET',
-    keepextras => 1,
-);
-
-# the built in CSS for the template
-my $DEFAULT_CSS = <<END;
-table { padding: 1em; }
-td table { padding: 0; } /* exclude the inner checkbox tables */
-#author, #footer { font-style: italic; }
-caption h2 { padding: .125em .5em; background: #ccc; text-align: left; }
-fieldset { margin: 1em 0; border: none; border-top: 2px solid #999; }
-legend { font-size: 1.25em; font-weight: bold; background: #ccc; padding: .125em .25em; border: 1px solid #666; }
-th { text-align: left; }
-th h2 { padding: .125em .5em; background: #eee; font-size: 1.25em; }
-.label { font-weight: normal; text-align: right; vertical-align: top; }
-td ul { list-style: none; padding-left: 0; margin-left: 0; }
-.note { background: #eee; padding: .5em 1em; }
-.sublabel { color: #999; }
-.invalid { background: red; }
-END
-
-# default messages that can be localized
-my %DEFAULT_MESSAGES = (
-    text_author   => 'Created by %s',
-    text_madewith => 'Made with %s version %s',
-    text_required => 'Fields that are <strong>highlighted</strong> are required.',
-    text_invalid  => 'Missing or invalid value.',
-);
-
-my $DEFAULT_CHARSET = 'iso-8859-1';
-
-# options to clean up the code with Perl::Tidy
-my $TIDY_OPTIONS = '-nolq -ci=4 -ce';
-
-my $HTML_EXTS   = qr/\.html?$/;
-my $MODULE_EXTS = qr/\.pm$/;
-my $SCRIPT_EXTS = qr/\.(pl|cgi)$/;
-
-# superautomagical exported function
-sub create_form {
-    my ($source, $options, $destination) = @_;
-    my $parser = __PACKAGE__->parse($source);
-    $parser->build(%{ $options || {} });
-    if ($destination) {
-        if (ref $destination) {
-            croak '[' . (caller(0))[3] . "] Don't know what to do with a ref for $destination";
-            #TODO: what DO ref dests mean?
-        } else {
-            # write webpage, script, or module
-            if ($destination =~ $MODULE_EXTS) {
-                $parser->write_module($destination, 1);
-            } elsif ($destination =~ $SCRIPT_EXTS) {
-                $parser->write_script($destination, 1);
-            } else {
-                $parser->write($destination);
+use YAML;
+
+sub new {
+    my $invocant = shift;
+    my $class = ref $invocant || $invocant;
+    my $self = {
+        parser => Text::FormBuilder::Parser->new,
+    };
+    return bless $self, $class;
+}
+
+sub parse {
+    my ($self, $filename) = @_;
+    
+    # so it can be called as a class method
+    $self = $self->new unless ref $self;
+    
+    local $/ = undef;
+    open SRC, "< $filename";
+    my $src = <SRC>;
+    close SRC;
+    
+    return $self->parse_text($src);
+}
+
+sub parse_text {
+    my ($self, $src) = @_;
+    # so it can be called as a class method
+    $self = $self->new unless ref $self;
+    $self->{form_spec} = $self->{parser}->form_spec($src);
+    return $self;
+}
+
+sub build {
+    my ($self, %options) = @_;
+    
+    # substitute in custom pattern definitions for field validation
+    if (my %patterns = %{ $self->{form_spec}{patterns} }) {
+        foreach (@{ $self->{form_spec}{fields} }) {
+            if ($$_{validate} and exists $patterns{$$_{validate}}) {
+                $$_{validate} = $patterns{$$_{validate}};
             }
         }
-    } else {
-        defined wantarray ? return $parser->form : $parser->write;
-    }
-}
-
-# subclass of Class::ParseText::Base
-sub init {
-    my $self = shift;
-    $self->{parser}         = Text::FormBuilder::Parser->new;
-    $self->{start_rule}     = 'form_spec';
-    $self->{ensure_newline} = 1;
-    return $self;
-}
-
-# this is where a lot of the magic happens
-sub build {
-    my ($self, %options) = @_;
-    
-    # our custom %options:
-    # form_only: use only the form part of the template
-    my $form_only = $options{form_only};
-    
-    # css, extra_css: allow for custom inline stylesheets
-    #   neat trick: css => '@import(my_external_stylesheet.css);'
-    #   will let you use an external stylesheet
-    #   CSS Hint: to get multiple sections to all line up their fields,
-    #   set a standard width for th.label
-    # external_css: scalar for a single external stylesheet; array for
-    #   multiple sheets; prepended to the beginning of the CSS as @import
-    #   statetments
-    my $css;
-    $css = $options{css} || $DEFAULT_CSS;
-    if ($options{external_css}) {
-        my $ref = ref $options{external_css};
-        if ($ref eq 'ARRAY') {
-            # loop over the list of external sheets
-            my $external_sheets = join("\n", map { "\@import url($_);" } @{ $options{external_css} });
-            $css = "$external_sheets\n$css";
-        } elsif ($ref) {
-            croak '[' . (caller(0))[3] . "] Don't know how to handle $ref reference as an argument to external_css";
-        } else {
-            $css = "\@import url($options{external_css});\n$css";
+    }
+    
+    # so we don't get all fields required
+    foreach (@{ $self->{form_spec}{fields} }) {
+        delete $$_{validate} unless $$_{validate};
+    }
+    
+    # substitute in list names
+    if (my %lists = %{ $self->{form_spec}{lists} }) {
+        foreach (@{ $self->{form_spec}{fields} }) {
+            next unless $$_{list};
+            
+            $$_{list} =~ s/^\@//;   # strip leading @ from list var name
+            
+            # a hack so we don't get screwy reference errors
+            if (exists $lists{$$_{list}}) {
+                my @list;
+                push @list, { %$_ } foreach @{ $lists{$$_{list}} };
+                $$_{options} = \@list;
+            }
+        } continue {
+            delete $$_{list};
         }
     }
-    $css .= $options{extra_css} if $options{extra_css};
-    
-    # messages
-    # code pulled (with modifications) from CGI::FormBuilder
-    if ($options{messages}) {
-        # if its a hashref, we'll just pass it on to CGI::FormBuilder
-        
-        if (my $ref = ref $options{messages}) {
-            # hashref pass on to CGI::FormBuilder
-            croak "[Text::FormBuilder] Argument to 'messages' option must be a filename or hashref" unless $ref eq 'HASH';
-            while (my ($key,$value) = each %DEFAULT_MESSAGES) {
-                $options{messages}{$key} ||= $DEFAULT_MESSAGES{$key};
-            }
-        } else {
-            # filename, just *warn* on missing, and use defaults
-            if (-f $options{messages} && -r _ && open(MESSAGES, "< $options{messages}")) {
-                $options{messages} = { %DEFAULT_MESSAGES };
-                while(<MESSAGES>) {
-                    next if /^\s*#/ || /^\s*$/;
-                    chomp;
-                    my($key,$value) = split ' ', $_, 2;
-                    ($options{messages}{$key} = $value) =~ s/\s+$//;
-                }
-                close MESSAGES;
-            } else {
-                carp '[' . (caller(0))[3] . "] Could not read messages file $options{messages}: $!";
-            }
-        }
-    } else {
-        $options{messages} = { %DEFAULT_MESSAGES };
-    }
-    
-    # character set
-    my $charset = $options{charset};
-    
-    # save the build options so they can be used from write_module
-    $self->{build_options} = { %options };
-    
-    # remove our custom options before we hand off to CGI::FormBuilder
-    delete $options{$_} foreach qw(form_only css extra_css charset);
-    
-    # expand groups
-    if (my %groups = %{ $self->{form_spec}{groups} || {} }) {        
-        for my $section (@{ $self->{form_spec}{sections} || [] }) {
-            foreach (grep { $$_[0] eq 'group' } @{ $$section{lines} }) {
-                $$_[1]{group} =~ s/^\%//;       # strip leading % from group var name
-                
-                if (exists $groups{$$_[1]{group}}) {
-                    my @fields; # fields in the group
-                    push @fields, { %$_ } foreach @{ $groups{$$_[1]{group}} };
-                    for my $field (@fields) {
-                        $$field{label} ||= ucfirst $$field{name};
-                        $$field{name} = "$$_[1]{name}_$$field{name}";                
-                    }
-                    $_ = [
-                        'group',
-                        {
-                            label => $$_[1]{label} || ucfirst(join(' ',split('_',$$_[1]{name}))),
-                            comment => $$_[1]{comment},
-                            group => \@fields,
-                        },
-                    ];
-                }
-            }
-        }
-    }
-    
-    # the actual fields that are given to CGI::FormBuilder
-    # make copies so that when we trim down the sections
-    # we don't lose the form field information
-    $self->{form_spec}{fields} = [];
-    
-    for my $section (@{ $self->{form_spec}{sections} || [] }) {
-        for my $line (@{ $$section{lines} }) {
-            if ($$line[0] eq 'group') {
-                push @{ $self->{form_spec}{fields} }, { %{$_} } foreach @{ $$line[1]{group} };
-            } elsif ($$line[0] eq 'field') {
-                #die $$line[1] unless ref $$line[1];
-                push @{ $self->{form_spec}{fields} }, { %{$$line[1]} };
-            }
-        }
-    }
-    
-    # substitute in custom validation subs and pattern definitions for field validation
-    my %patterns = %{ $self->{form_spec}{patterns} || {} };
-    my %subs = %{ $self->{form_spec}{subs} || {} };
-    
-    foreach (@{ $self->{form_spec}{fields} }) {
-        if ($$_{validate}) {
-            if (exists $patterns{$$_{validate}}) {
-                $$_{validate} = $patterns{$$_{validate}};
-            # TODO: need the Data::Dumper code to work for this
-            # for now, we just warn that it doesn't work
-            } elsif (exists $subs{$$_{validate}}) {
-                warn '[' . (caller(0))[3] . "] validate coderefs don't work yet";
-                delete $$_{validate};
-##                 $$_{validate} = $subs{$$_{validate}};
-            }
-        }
-    }
-    
-    # get user-defined lists; can't make this conditional because
-    # we need to be able to fall back to CGI::FormBuilder's lists
-    # even if the user didn't define any
-    my %lists = %{ $self->{form_spec}{lists} || {} };
-    
-    # substitute in list names
-    foreach (@{ $self->{form_spec}{fields} }) {
-        next unless $$_{list};
-        
-        $$_{list} =~ s/^\@//;   # strip leading @ from list var name
-        
-        # a hack so we don't get screwy reference errors
-        if (exists $lists{$$_{list}}) {
-            my @list;
-            push @list, { %$_ } foreach @{ $lists{$$_{list}} };
-            $$_{options} = \@list;
-        } else {
-            # assume that the list name is a builtin 
-            # and let it fall through to CGI::FormBuilder
-            $$_{options} = $$_{list};
-        }
-    } continue {
-        delete $$_{list};
-    }
-    
-    # special case single-value checkboxes
-    foreach (grep { $$_{type} && $$_{type} eq 'checkbox' } @{ $self->{form_spec}{fields} }) {
-        unless ($$_{options}) {
-            $$_{options} = [ { $$_{name} => $$_{label} || ucfirst join(' ',split(/_/,$$_{name})) } ];
-        }
-    }
-    
-    # use columns for displaying checkbox fields larger than 2 items
-    foreach (@{ $self->{form_spec}{fields} }) {
-        if (ref $$_{options} and @{ $$_{options} } >= 3) {
-            $$_{columns} = int(@{ $$_{options} } / 8) + 1;
-        }
-    }
-    
-    # remove extraneous undefined values
-    # also check for approriate version of CGI::FormBuilder
-    # for some advanced options
-    my $FB_version = CGI::FormBuilder->VERSION;
-    for my $field (@{ $self->{form_spec}{fields} }) {
-        defined $$field{$_} or delete $$field{$_} foreach keys %{ $field };
-        
-        unless ($FB_version >= '3.02') {
-            for (qw(growable other)) {
-                if ($$field{$_}) {
-                    warn '[' . (caller(0))[3] . "] '$_' fields not supported by FB $FB_version (requires 3.02)";
-                    delete $$field{$_};
-                }
-            }
-        }
-    }
-    
-    # assign the field names to the sections
-    foreach (@{ $self->{form_spec}{sections} }) {
-        for my $line (@{ $$_{lines} }) {
-            if ($$line[0] eq 'field') {
-                $$line[1] = $$line[1]{name};
-            }
-        }
-    }
-    
-    my %fb_params;
-    if ($self->{form_spec}->{fb_params}) {
-        require YAML;
-        eval { %fb_params = %{ YAML::Load($self->{form_spec}->{fb_params}) } };
-        if ($@) {
-            warn '[' . (caller(0))[3] . "] Bad !fb parameter block:\n$@";
-        }
-    }
-    
-    # gather together all of the form options
-    $self->{form_options} = {
-        %DEFAULT_OPTIONS,
-        # need to explicity set the fields so that simple text fields get picked up
-        fields   => [ map { $$_{name} } @{ $self->{form_spec}{fields} } ],
-        required => [ map { $$_{name} } grep { $$_{required} } @{ $self->{form_spec}{fields} } ],
+
+##     #TODO: option switch for this
+##     #TODO: goes with CGI::FormBuilder 2.13
+##     foreach (@{ $self->{form_spec}{fields} }) {
+##         $$_{ulist} = 1 if $$_{type} and $$_{type} =~ /checkbox|radio/ and @{ $$_{options} } >= 3;
+##     }
+    
+    $self->{form} = CGI::FormBuilder->new(
+        method => 'GET',
+        javascript => 0,
+        keepextras => 1,
         title => $self->{form_spec}{title},
-        text  => $self->{form_spec}{description},
-        # use 'defined' so we are able to differentiate between 'submit = 0' (no submit button)
-        # and 'submit = undef' (use default submit button)
-        ( defined $self->{form_spec}{submit} ? (submit => $self->{form_spec}{submit}) : () ),
-        reset => $self->{form_spec}{reset},
+        fields => [ map { $$_{name} } @{ $self->{form_spec}{fields} } ],
         template => {
             type => 'Text',
             engine => {
                 TYPE       => 'STRING',
-                SOURCE     => $form_only ? $self->_form_template : $self->_template($css, $charset),
-                DELIMITERS => [ qw(<% %>) ],
+                SOURCE     => $self->_template,
+                DELIMETERS => [ qw(<% %>) ],
             },
             data => {
-                #TODO: make FB aware of sections
-                sections    => $self->{form_spec}{sections},
-                author      => $self->{form_spec}{author},
-                description => $self->{form_spec}{description},
+                author => $self->{form_spec}{author},
             },
         },
-        #TODO: fields in fb_params are not getting recognized
-        %fb_params,     # params from the formspec file
-        %options,       # params from this method invocation
-    };
-    
-    # create the form object
-    $self->{form} = CGI::FormBuilder->new(%{ $self->{form_options} });
-    
-    # ...and set up its fields
+        %options,
+    );
     $self->{form}->field(%{ $_ }) foreach @{ $self->{form_spec}{fields} };
-    
-    # mark structures as built
-    $self->{built} = 1;
     
     return $self;
@@ -341,9 +108,4 @@
 sub write {
     my ($self, $outfile) = @_;
-    
-    # automatically call build if needed to
-    # allow the new->parse->write shortcut
-    $self->build unless $self->{built};
-    
     if ($outfile) {
         open FORM, "> $outfile";
@@ -355,293 +117,34 @@
 }
 
-# dump the form options as eval-able code
-sub _form_options_code {
-    my $self = shift;
-    my $d = Data::Dumper->new([ $self->{form_options} ], [ '*options' ]);
-    return keys %{ $self->{form_options} } > 0 ? $d->Dump : '';    
-}
-# dump the field setup subs as eval-able code
-# pass in the variable name of the form object
-# (defaults to '$form')
-# TODO: revise this code to use the new 'fieldopts'
-# option to the FB constructor (requires FB 3.02)
-sub _field_setup_code {
-    my $self = shift;
-    my $object_name = shift || '$form';
-    return join(
-        "\n", 
-        map { $object_name . '->field' . Data::Dumper->Dump([$_],['*field']) . ';' } @{ $self->{form_spec}{fields} }
-    );
-}
-
-sub as_module {
-    my ($self, $package, $use_tidy) = @_;
-
-    croak '[' . (caller(0))[3] . '] Expecting a package name' unless $package;
-    
-    # remove a trailing .pm
-    $package =~ s/\.pm$//;
-
-    # auto-build
-    $self->build unless $self->{built};
-
-    my $form_options = $self->_form_options_code;
-    my $field_setup = $self->_field_setup_code('$self');
-    
-    # old style of module
-    # TODO: how to keep this (as deprecated method)
-    my $old_module = <<END;
-package $package;
-use strict;
-use warnings;
-
-use CGI::FormBuilder;
-
-sub get_form {
-    my \$q = shift;
-
-    my \$self = CGI::FormBuilder->new(
-        $form_options,
-        \@_,
-    );
-    
-    $field_setup
-    
-    return \$self;
-}
-
-# module return
-1;
-END
-
-    # new style of module
-    my $module = <<END;
-package $package;
-use strict;
-use warnings;
-
-use base qw(CGI::FormBuilder);
-
-sub new {
-    my \$invocant = shift;
-    my \$class = ref \$invocant || \$invocant;
-    
-    my \$self = CGI::FormBuilder->new(
-        $form_options,
-        \@_,
-    );
-    
-    $field_setup
-    
-    # re-bless into this class
-    bless \$self, \$class;
-}
-
-# module return
-1;
-END
-
-    $module = _tidy_code($module, $use_tidy) if $use_tidy;
-    
-    return $module;
-}
-
-sub write_module {
-    my ($self, $package, $use_tidy) = @_;
-    
-    my $module = $self->as_module($package, $use_tidy);
-    
-    my $outfile = (split(/::/, $package))[-1];
-    $outfile .= '.pm' unless $outfile =~ /\.pm$/;
-    _write_output_file($module, $outfile);
-    return $self;
-}
-
-sub as_script {
-    my ($self, $use_tidy) = @_;
-    
-    # auto-build
-    $self->build unless $self->{built};
-    
-    my $form_options = $self->_form_options_code;
-    my $field_setup = $self->_field_setup_code('$form');
-
-    my $script = <<END;
-#!/usr/bin/perl
-use strict;
-use warnings;
-
-use CGI::FormBuilder;
-
-my \$form = CGI::FormBuilder->new(
-    $form_options
-);
-
-$field_setup
-    
-unless (\$form->submitted && \$form->validate) {
-    print \$form->render;
-} else {
-    # do something with the entered data
-}
-END
-    $script = _tidy_code($script, $use_tidy) if $use_tidy;
-    
-    return $script;
-}
-    
-sub write_script {
-    my ($self, $script_name, $use_tidy) = @_;
-
-    croak '[' . (caller(0))[3] . '] Expecting a script name' unless $script_name;
-
-    my $script = $self->as_script($use_tidy);
-    
-    _write_output_file($script, $script_name);   
-    return $self;
-}
-
-sub _tidy_code {
-    my ($source_code, $use_tidy) = @_;
-    eval 'use Perl::Tidy';
-    carp '[' . (caller(0))[3] . "] Can't tidy the code: $@" and return $source_code if $@;
-    
-    # use the options string only if it begins with '_'
-    my $options = ($use_tidy =~ /^-/) ? $use_tidy : undef;
-    
-    my $tidy_code;
-    Perl::Tidy::perltidy(source => \$source_code, destination => \$tidy_code, argv => $options || $TIDY_OPTIONS);
-    
-    return $tidy_code;
-}
-
-
-sub _write_output_file {
-    my ($source_code, $outfile) = @_;    
-    open OUT, "> $outfile" or croak '[' . (caller(1))[3] . "] Can't open $outfile for writing: $!";
-    print OUT $source_code;
-    close OUT;
-}
-
-
-sub form {
-    my $self = shift;
-    
-    # automatically call build if needed to
-    # allow the new->parse->write shortcut
-    $self->build unless $self->{built};
-
-    return $self->{form};
-}
-
-sub _form_template {
-    my $self = shift;
-    my $msg_required = $self->{build_options}{messages}{text_required};
-    my $msg_invalid = $self->{build_options}{messages}{text_invalid};
-    return q{<% $description ? qq[<p id="description">$description</p>] : '' %>
-<% (grep { $_->{required} } @fields) ? qq[<p id="instructions">} . $msg_required . q{</p>] : '' %>
-<% $start %>
-<%
-    # drop in the hidden fields here
-    $OUT = join("\n", map { $$_{field} } grep { $$_{type} eq 'hidden' } @fields);
-%>} .
+sub form { shift->{form} }
+
+sub _template {
 q[
-<%
-    SECTION: while (my $section = shift @sections) {
-        $OUT .= qq[<fieldset>\n];
-        $OUT .= qq[  <legend>$$section{head}</legend>] if $$section{head};
-        $OUT .= qq[<table id="] . ($$section{id} || '_default') . qq[">\n];
-        #$OUT .= qq[  <caption><h2 class="sectionhead">$$section{head}</h2></caption>] if $$section{head};
-        TABLE_LINE: for my $line (@{ $$section{lines} }) {
-            if ($$line[0] eq 'head') {
-                $OUT .= qq[  <tr><th class="subhead" colspan="2"><h2>$$line[1]</h2></th></tr>\n]
-            } elsif ($$line[0] eq 'note') {
-                $OUT .= qq[  <tr><td class="note" colspan="2">$$line[1]</td></tr>\n]
-            } elsif ($$line[0] eq 'field') {
-                local $_ = $field{$$line[1]};
-                
-                # skip hidden fields in the table
-                next TABLE_LINE if $$_{type} eq 'hidden';
-                
-                $OUT .= $$_{invalid} ? qq[  <tr class="invalid">] : qq[  <tr>];
-                
-                # special case single value checkboxes
-                if ($$_{type} eq 'checkbox' && @{ $$_{options} } == 1) {
-                    $OUT .= qq[<td></td>];
-                } else {
-                    $OUT .= '<td class="label">' . ($$_{required} ? qq[<strong class="required">$$_{label}</strong>] : "$$_{label}") . '</td>';
-                }
-                
-                # mark invalid fields
-                if ($$_{invalid}) {
-                    $OUT .= qq[<td>$$_{field} <span class="comment">$$_{comment}</span> $$_{error}</td>];
-                } else {
-                    $OUT .= qq[<td>$$_{field} <span class="comment">$$_{comment}</span></td>];
-                }
-                
-                $OUT .= qq[</tr>\n];
-                
-            } elsif ($$line[0] eq 'group') {
-                my @group_fields = map { $field{$_} } map { $$_{name} } @{ $$line[1]{group} };
-                $OUT .= (grep { $$_{invalid} } @group_fields) ? qq[  <tr class="invalid">\n] : qq[  <tr>\n];
-                
-                $OUT .= '    <td class="label">';
-                $OUT .= (grep { $$_{required} } @group_fields) ? qq[<strong class="required">$$line[1]{label}</strong>] : "$$line[1]{label}";
-                $OUT .= qq[</td>\n];
-                
-                $OUT .= qq[    <td><span class="fieldgroup">];
-                $OUT .= join(' ', map { qq[<small class="sublabel">$$_{label}</small> $$_{field} $$_{comment}] } @group_fields);
-                if (my @invalid = grep { $$_{invalid} } @group_fields) {
-                    $OUT .= ' ' . join('; ', map { $$_{error} } @invalid);
-                }                
-                $OUT .= qq[ <span class="comment">$$line[1]{comment}</span></span></td>\n];
-                $OUT .= qq[  </tr>\n];
-            }   
-        }
-        # close the table if there are sections remaining
-        # but leave the last one open for the submit button
-        if (@sections) {
-            $OUT .= qq[</table>\n];
-            $OUT .= qq[</fieldset>\n];
-        }
-    }
-%>
-  <tr><th></th><td style="padding-top: 1em;"><% $submit %> <% $reset %></td></tr>
-</table>
-</fieldset>
-<% $end %>
-];
-}
-
-# usage: $self->_pre_template($css, $charset)
-sub _pre_template {
-    my $self = shift;
-    my $css = shift || $DEFAULT_CSS;
-    my $charset = shift || $DEFAULT_CHARSET;
-    my $msg_author = 'sprintf("' . quotemeta($self->{build_options}{messages}{text_author}) . '", $author)';
-    return 
-q[<html>
+<html>
 <head>
-  <meta http-equiv="Content-Type" content="text/html; charset=] . $charset . q[" />
   <title><% $title %><% $author ? ' - ' . ucfirst $author : '' %></title>
   <style type="text/css">
-] . $css . q[  </style>
-  <% $jshead %>
+    #author, #footer { font-style: italic; }
+    th { font-weight: normal; text-align: right; vertical-align: top; }
+  </style>
 </head>
 <body>
 
 <h1><% $title %></h1>
-<% $author ? qq[<p id="author">] . ] . $msg_author . q{ . q[</p>] : '' %>
-};
-}
-
-sub _post_template {
-    my $self = shift;
-    my $msg_madewith = 'sprintf("' . quotemeta($self->{build_options}{messages}{text_madewith}) .
-        '", q[<a href="http://formbuilder.org/">CGI::FormBuilder</a>], CGI::FormBuilder->VERSION)';
-    
-    return qq[<hr />
+<% $author ? qq[<p id="author">Created by $author</p>] : '' %>
+<p id="instructions">(Required fields are marked in <strong>bold</strong>.)</p>
+<% $start %>
+<table>
+<% foreach (@fields) {
+    $OUT .= qq[  <tr>];
+    $OUT .= '<th>' . ($$_{required} ? qq[<strong class="required">$$_{label}:</strong>] : "$$_{label}:") . '</th>';
+    $OUT .= qq[<td>$$_{field} $$_{comment}</td></tr>\n]
+} %>
+  <tr><th></th><td style="padding-top: 1em;"><% $submit %></td></tr>
+</table>
+<% $end %>
+<hr />
 <div id="footer">
-  <p id="creator"><% $msg_madewith %></p>
+  <p id="creator">Made with <a href="http://formbuilder.org/">CGI::FormBuilder</a> version <% $CGI::FormBuilder::VERSION %>.</p>
 </div>
 </body>
@@ -650,18 +153,5 @@
 }
 
-# usage: $self->_template($css, $charset)
-sub _template {
-    my $self = shift;
-    return $self->_pre_template(@_) . $self->_form_template . $self->_post_template;
-}
-
-sub dump { 
-    eval "use YAML;";
-    unless ($@) {
-        print YAML::Dump(shift->{form_spec});
-    } else {
-        warn '[' . (caller(0))[3] . "] Can't dump form spec structure using YAML: $@";
-    }
-}
+sub _dump { print YAML::Dump(shift->{form_spec}); }
 
 
@@ -671,672 +161,56 @@
 =head1 NAME
 
-Text::FormBuilder - Create CGI::FormBuilder objects from simple text descriptions
+Text::FormBuilder - Parser for a minilanguage describing web forms
 
 =head1 SYNOPSIS
 
-    use Text::FormBuilder;
-    
     my $parser = Text::FormBuilder->new;
     $parser->parse($src_file);
     
-    # returns a new CGI::FormBuilder object with
-    # the fields from the input form spec
-    my $form = $parser->form;
-    
-    # write a My::Form module to Form.pm
-    $parser->write_module('My::Form');
-
-=head1 REQUIRES
-
-L<Parse::RecDescent>,
-L<CGI::FormBuilder>,
-L<Text::Template>,
-L<Class::Base>
-
-You will also need L<YAML>, if you want to use the L<C<dump>|/dump>
-method, or the L<C<!fb>|/!fb> directive in your formspec files.
+    # returns a new CGI::FormBuilder object with the fields
+    # from the input form spec
+    my $form = $parser->build_form;
 
 =head1 DESCRIPTION
 
-This module is intended to extend the idea of making it easy to create
-web forms by allowing you to describe them with a simple langauge. These
-I<formspecs> are then passed through this module's parser and converted
-into L<CGI::FormBuilder> objects that you can easily use in your CGI
-scripts. In addition, this module can generate code for standalone modules
-which allow you to separate your form design from your script code.
-
-A simple formspec looks like this:
-
-    name//VALUE
-    email//EMAIL
-    language:select{English,Spanish,French,German}
-    moreinfo|Send me more information:checkbox
-    interests:checkbox{Perl,karate,bass guitar}
-
-This will produce a required C<name> text field, a required C<email> text
-field that must look like an email address, an optional select dropdown
-field C<language> with the choices English, Spanish, French, and German,
-an optional C<moreinfo> checkbox labeled ``Send me more information'', and
-finally a set of checkboxes named C<interests> with the choices Perl,
-karate, and bass guitar.
-
-=head1 METHODS
-
 =head2 new
 
-    my $parser = Text::FormBuilder->new;
-
 =head2 parse
 
-    # parse a file (regular scalar)
-    $parser->parse($filename);
-    
-    # or pass a scalar ref to parse a literal string
-    $parser->parse(\$string);
-    
-    # or an array ref to parse lines
-    $parser->parse(\@lines);
-
-Parse the file or string. Returns the parser object. This method,
-along with all of its C<parse_*> siblings, may be called as a class
-method to construct a new object.
-
-=head2 parse_file
-
-    $parser->parse_file($src_file);
-    
-    # or as a class method
-    my $parser = Text::FormBuilder->parse($src_file);
-
-=head2 parse_text
-
-    $parser->parse_text($src);
-
-Parse the given C<$src> text. Returns the parser object.
-
-=head2 parse_array
-
-    $parser->parse_array(@lines);
-
-Concatenates and parses C<@lines>. Returns the parser object.
-
 =head2 build
 
-    $parser->build(%options);
-
-Builds the CGI::FormBuilder object. Options directly used by C<build> are:
+=head2 write
+
+=head1 LANGUAGE
+
+    name[size]|descriptive label[hint]:type=default{option1(display string),option2(display string),...}//validate
+    
+    !title ...
+    
+    !pattern name /regular expression/
+    !list name {
+        option1(display string),
+        option2(display string),
+        ...
+    }
+
+=head2 Directives
 
 =over
 
-=item C<form_only>
-
-Only uses the form portion of the template, and omits the surrounding html,
-title, author, and the standard footer. This does, however, include the
-description as specified with the C<!description> directive.
-
-=item C<css>, C<extra_css>
-
-These options allow you to tell Text::FormBuilder to use different
-CSS styles for the built in template. A value given a C<css> will
-replace the existing CSS, and a value given as C<extra_css> will be
-appended to the CSS. If both options are given, then the CSS that is
-used will be C<css> concatenated with C<extra_css>.
-
-If you want to use an external stylesheet, a quick way to get this is
-to set the C<css> parameter to import your file:
-
-    css => '@import(my_external_stylesheet.css);'
-
-=item C<external_css>
-
-If you want to use multiple external stylesheets, or an external stylesheet
-in conjunction with the default styles, use the C<external_css> option:
-
-    # single external sheet
-    external_css => 'my_styles.css'
-    
-    # mutliple sheets
-    external_css => [
-        'my_style_A.css',
-        'my_style_B.css',
-    ]
-
-=item C<messages>
-
-This works the same way as the C<messages> parameter to 
-C<< CGI::FormBuilder->new >>; you can provide either a hashref of messages
-or a filename.
-
-The default messages used by Text::FormBuilder are:
-
-    text_author       Created by %s
-    text_madewith     Made with %s version %s
-    text_required     (Required fields are marked in <strong>bold</strong>.)
-    text_invalid      Missing or invalid value.
-
-Any messages you set here get passed on to CGI::FormBuilder, which means
-that you should be able to put all of your customization messages in one
-big file.
-
-=item C<charset>
-
-Sets the character encoding for the generated page. The default is ISO-8859-1.
+=item C<!pattern>
+
+=item C<!list>
+
+=item C<!title>
 
 =back
 
-All other options given to C<build> are passed on verbatim to the
-L<CGI::FormBuilder> constructor. Any options given here override the
-defaults that this module uses.
-
-The C<form>, C<write>, and C<write_module> methods will all call
-C<build> with no options for you if you do not do so explicitly.
-This allows you to say things like this:
-
-    my $form = Text::FormBuilder->new->parse('formspec.txt')->form;
-
-However, if you need to specify options to C<build>, you must call it
-explictly after C<parse>.
-
-=head2 form
-
-    my $form = $parser->form;
-
-Returns the L<CGI::FormBuilder> object. Remember that you can modify
-this object directly, in order to (for example) dynamically populate
-dropdown lists or change input types at runtime.
-
-=head2 write
-
-    $parser->write($out_file);
-    # or just print to STDOUT
-    $parser->write;
-
-Calls C<render> on the FormBuilder form, and either writes the resulting
-HTML to a file, or to STDOUT if no filename is given.
-
-=head2 as_module
-
-    my $module_code = $parser->as_module($package, $use_tidy);
-
-=head2 write_module
-
-I<B<Note:> The code output from the C<write_*> methods may be in flux for
-the next few versions, as I coordinate with the B<FormBuilder> project.>
-
-    $parser->write_module($package, $use_tidy);
-
-Takes a package name, and writes out a new module that can be used by your
-CGI script to render the form. This way, you only need CGI::FormBuilder on
-your server, and you don't have to parse the form spec each time you want 
-to display your form. The generated module is a subclass of L<CGI::FormBuilder>,
-that will pass along any constructor arguments to FormBuilder, and set up
-the fields for you.
-
-First, you parse the formspec and write the module, which you can do as a one-liner:
-
-    $ perl -MText::FormBuilder -e"Text::FormBuilder->parse('formspec.txt')->write_module('My::Form')"
-
-And then, in your CGI script, use the new module:
-
-    #!/usr/bin/perl -w
-    use strict;
-    
-    use CGI;
-    use My::Form;
-    
-    my $q = CGI->new;
-    my $form = My::Form->new;
-    
-    # do the standard CGI::FormBuilder stuff
-    if ($form->submitted && $form->validate) {
-        # process results
-    } else {
-        print $q->header;
-        print $form->render;
-    }
-
-If you pass a true value as the second argument to C<write_module>, the parser
-will run L<Perl::Tidy> on the generated code before writing the module file.
-
-    # write tidier code
-    $parser->write_module('My::Form', 1);
-
-If you set C<$use_tidy> to a string beginning with `-' C<write_module> will
-interpret C<$use_tidy> as the formatting option switches to pass to Perl::Tidy.
-
-=head2 as_script
-
-    my $script_code = $parser->as_script($use_tidy);
-
-=head2 write_script
-
-    $parser->write_script($filename, $use_tidy);
-
-If you don't need the reuseability of a separate module, you can have
-Text::FormBuilder write the form object to a script for you, along with
-the simplest framework for using it, to which you can add your actual
-form processing code.
-
-The generated script looks like this:
-
-    #!/usr/bin/perl
-    use strict;
-    use warnings;
-    
-    use CGI::FormBuilder;
-    
-    my $form = CGI::FormBuilder->new(
-        # lots of stuff here...
-    );
-    
-    # ...and your field setup subs are here
-    $form->field(name => '...');
-        
-    unless ($form->submitted && $form->validate) {
-        print $form->render;
-    } else {
-        # do something with the entered data
-    }
-
-Like C<write_module>, you can optionally pass a true value as the second
-argument to have Perl::Tidy make the generated code look nicer.
-
-=head2 dump
-
-Uses L<YAML> to print out a human-readable representation of the parsed
-form spec.
-
-=head1 EXPORTS
-
-There is one exported function, C<create_form>, that is intended to ``do the
-right thing'' in simple cases.
-
-=head2 create_form
-
-    # get a CGI::FormBuilder object
-    my $form = create_form($source, $options, $destination);
-    
-    # or just write the form immediately
-    create_form($source, $options, $destination);
-
-C<$source> accepts any of the types of arguments that C<parse> does. C<$options>
-is a hashref of options that should be passed to C<build>. Finally, C<$destination>
-is a simple scalar that determines where and what type of output C<create_form>
-should generate.
-
-    /\.pm$/             ->write_module($destination)
-    /\.(cgi|pl)$/       ->write_script($destination)
-    everything else     ->write($destination)
-
-For anything more than simple, one-off cases, you are usually better off using the
-object-oriented interface, since that gives you more control over things.
-
-=head1 DEFAULTS
-
-These are the default settings that are passed to C<< CGI::FormBuilder->new >>:
-
-    method => 'GET'
-    keepextras => 1
-
-Any of these can be overriden by the C<build> method:
-
-    # use POST instead
-    $parser->build(method => 'POST')->write;
-
-=head1 LANGUAGE
-
-    # name field_size growable label hint type other default option_list validate
-    
-    field_name[size]|descriptive label[hint]:type=default{option1[display string],...}//validate
-    
-    !title ...
-    
-    !author ...
-    
-    !description {
-        ...
-    }
-    
-    !pattern NAME /regular expression/
-    
-    !list NAME {
-        option1[display string],
-        option2[display string],
-        ...
-    }
-    
-    !group NAME {
-        field1
-        field2
-        ...
-    }
-    
-    !section id heading
-    
-    !head ...
-    
-    !note {
-        ...
-    }
-    
-    !submit label, label 2, ...
-    
-    !reset label
-
-=head2 Directives
-
-All directives start with a C<!> followed by a keyword. There are two types of
-directives:
-
-=over
-
-=item Line directives
-
-Line directives occur all on one line, and require no special punctuation. Examples
-of line directives are L<C<!title>|/!title> and L<C<!section>|/!section>.
-
-=item Block directives
-
-Block directives consist of a directive keyword followed by a curly-brace delimited
-block. Examples of these are L<C<!group>|/!group> and L<C<!description>|/!description>.
-Some of these directives have their own internal structure; see the list of directives
-below for an explanation.
-
-=back
-
-And here is the complete list of directives
-
-=over
-
-=item C<!pattern>
-
-Defines a validation pattern.
-
-=item C<!list>
-
-Defines a list for use in a C<radio>, C<checkbox>, or C<select> field.
-
-=item C<!group>
-
-Define a named group of fields that are displayed all on one line. Use with
-the C<!field> directive.
-
-=item C<!field>
-
-B<DEPRECATED> Include a named instance of a group defined with C<!group>. See
-L<Field Groups|/Field Groups> for an explanation of the new way to include
-groups.
-
-=item C<!title>
-
-Line directive containing the title of the form.
-
-=item C<!author>
-
-Line directive naming the author of the form.
-
-=item C<!description>
-
-A block directive containing a brief description of the form. Appears at the top of the form. Suitable for 
-special instructions on how to fill out the form. All of the text within the
-block is folded into a single paragraph. If you add a second !description, it will override the first.
-
-=item C<!section id Your section text goes here>
-
-A line directive that starts a new section. Each section has its own heading
-and id, which by default are rendered into separate tables.
-
-=item C<!head>
-
-A line directive that inserts a heading between two fields. There can only be
-one heading between any two fields; the parser will warn you if you try to put
-two headings right next to each other.
-
-=item C<!note>
-
-A block directive containing a text note that can be inserted as a row in the
-form. This is useful for special instructions at specific points in a long form.
-Like L<C<!description>|/!description>, the text content is folded into a single
-paragraph.
-
-=item C<!submit>
-
-A line directive with  one or more submit button labels in a comma-separated list.
-Each label is a L<string|/Strings>. Multiple instances of this directive may be
-used; later lists are simply appended to the earlier lists. All the submit buttons
-are rendered together at the bottom of the form. See L<CGI::FormBuilder> for an
-explanation of how the multiple submit buttons work together in a form.
-
-To disable the display of any submit button, use C<!submit 0>
-
-=item C<!reset>
-
-Line directive giving a label for the a reset button at the end of the form. No 
-reset button will be rendered unless you use this directive.
-
-=item C<!fb>
-
-The C<!fb> block directive allows you to include any parameters you want passed
-directly to the CGI::FormBuilder constructor. The block should be a hashref of
-parameters serialized as L<YAML>. Be sure to place the closing of the block on
-its own line, flush to the left edge, and to watch your indentation. Multiple
-C<!fb> blocks are concatenated, and the result is interpeted as one big chunk
-of YAML code.
-
-    !fb{
-    method: POST
-    action: '/custom/action'
-    javascript: 0
-    }
-
-=back
-
-=head2 Strings
-
-Anywhere that it says that you may use a multiword string, this means you can
-do one of two things. For strings that consist solely of alphanumeric characters 
-(i.e. C<\w+>) and spaces, the string will be recognized as is:
-
-    field_1|A longer label
-
-If you want to include non-alphanumerics (e.g. punctuation), you must 
-single-quote the string:
-
-    field_2|'Dept./Org.'
-
-To include a literal single-quote in a single-quoted string, escape it with
-a backslash:
-
-    field_3|'\'Official\' title'
-
-Quoted strings are also how you can set the label for a field to be blank:
-
-    unlabeled_field|''
-
 =head2 Fields
 
-Form fields are each described on a single line. The simplest field is
-just a name (which cannot contain any whitespace):
-
-    color
-
-This yields a form with one text input field of the default size named `color'.
-The generated label for this field would be ``Color''. To add a longer or more
-descriptive label, use:
-
-    color|Favorite color
-
-The descriptive label can be a multiword string, as described above. So if you
-want punctuation in the label, you should single quote it:
-
-    color|'Fav. color'
-
-To add a descriptive hint that should appear to the right of the form field,
-put the hint in square brackets after the label, but before the field type:
-
-    # hint for a field without a label
-    color[select from a list]
-
-    # hint together with a label
-    color|Favorite color[select from this list]
-
-To use a different input type:
-
-    color|Favorite color:select{red,blue,green}
-
-Recognized input types are the same as those used by CGI::FormBuilder:
-
-    text        # the default
-    textarea
-    password
-    file
-    checkbox
-    radio
-    select
-    hidden
-    static
-
-For multi-select fields, append a C<*> to the field type:
-
-    colors:select*
-
-To change the size of the input field, add a bracketed subscript after the
-field name (but before the descriptive label):
-
-    # for a single line field, sets size="40"
-    title[40]:text
-    
-    # for a multiline field, sets rows="4" and cols="30"
-    description[4,30]:textarea
-
-To also set the C<maxlength> attribute for text fields, add a C<!> after
-the size:
-
-    # ensure that all titles entered are 40 characters or less
-    title[40!]:text
-
-This currently only works for single line text fields.
-
-To create a growable field, add a C<*> after the name (and size, if
-given). Growable fields have a button that allows the user to add a
-copy of the field input. Currently, this only works for C<text> and
-C<file> fields, and you must have L<CGI::FormBuilder> 3.02 or higher.
-Growable fields also require JavaScript to function correctly.
-
-    # you can have as many people as you like
-    person*:text
-
-To set a limit to the maximum number of inputs a field can grow to, add
-a number after the C<*>:
-
-    # allow up to 5 musicians
-    musician*5:text
-
-To create a C<radio> or C<select> field that includes an "other" option,
-append the string C<+other> to the field type:
-
-    position:select+other
-
-Or, to let FormBuilder decide whether to use radio buttons or a dropdown:
-
-    position+other
-
-Like growable fields, 'other' fields require FormBuilder 3.02 or higher.
-
-For the input types that can have options (C<select>, C<radio>, and
-C<checkbox>), here's how you do it:
-
-    color|Favorite color:select{red,blue,green}
-
-Values are in a comma-separated list of single words or multiword strings
-inside curly braces. Whitespace between values is irrelevant.
-
-To add more descriptive display text to a value in a list, add a square-bracketed
-``subscript,'' as in:
-
-    ...:select{red[Scarlet],blue[Azure],green[Olive Drab]}
+Form fields are each described on a single line.
 
 If you have a list of options that is too long to fit comfortably on one line,
-you should use the C<!list> directive:
-
-    !list MONTHS {
-        1[January],
-        2[February],
-        3[March],
-        # and so on...
-    }
-    
-    month:select@MONTHS
-
-If you want to have a single checkbox (e.g. for a field that says ``I want to
-recieve more information''), you can just specify the type as checkbox without
-supplying any options:
-
-    moreinfo|I want to recieve more information:checkbox
-
-In this case, the label ``I want to recieve more information'' will be
-printed to the right of the checkbox.
-
-You can also supply a default value to the field. To get a default value of
-C<green> for the color field:
-
-    color|Favorite color:select=green{red,blue,green}
-
-Default values can also be either single words or multiword strings.
-
-To validate a field, include a validation type at the end of the field line:
-
-    email|Email address//EMAIL
-
-Valid validation types include any of the builtin defaults from L<CGI::FormBuilder>,
-or the name of a pattern that you define with the C<!pattern> directive elsewhere
-in your form spec:
-
-    !pattern DAY /^([1-3][0-9])|[1-9]$/
-    
-    last_day//DAY
-
-If you just want a required value, use the builtin validation type C<VALUE>:
-
-    title//VALUE
-
-By default, adding a validation type to a field makes that field required. To
-change this, add a C<?> to the end of the validation type:
-
-    contact//EMAIL?
-
-In this case, you would get a C<contact> field that was optional, but if it
-were filled in, would have to validate as an C<EMAIL>.
-
-=head2 Field Groups
-
-You can define groups of fields using the C<!group> directive:
-
-    !group DATE {
-        month:select@MONTHS//INT
-        day[2]//INT
-        year[4]//INT
-    }
-
-You can also use groups in normal field lines:
-
-    birthday|Your birthday:DATE
-
-This will create a line in the form labeled ``Your birthday'' which contains
-a month dropdown, and day and year text entry fields. The actual input field
-names are formed by concatenating the C<!field> name (e.g. C<birthday>) with
-the name of the subfield defined in the group (e.g. C<month>, C<day>, C<year>).
-Thus in this example, you would end up with the form fields C<birthday_month>,
-C<birthday_day>, and C<birthday_year>.
-
-The only (currently) supported pieces of a fieldspec that may be used with a
-group in this notation are name, label, and hint.
-
-The old method of using field groups was with the C<!field> directive:
-
-    !field %DATE birthday
-
-This format is now B<deprecated>, and although it still works, the parser will
-warn you if you use it.
+consider using the C<!list> directive.
 
 =head2 Comments
@@ -1344,77 +218,9 @@
     # comment ...
 
-Any line beginning with a C<#> is considered a comment. Comments can also appear
-after any field line. They I<cannot> appear between items in a C<!list>, or on
-the same line as any of the directives.
-
-=head1 TODO
-
-=head2 Documentation/Tests
-
-Document use of the parser as a standalone module
-
-Make sure that the docs match the generated code.
-
-Better tests!
-
-=head2 Language/Parser
-
-Pieces that wouldn't make sense in a group field: size, row/col, options,
-validate. These should cause C<build> to emit a warning before ignoring them.
-
-C<!include> directive to include external formspec files
-
-Better recovery from parse errors
-
-=head2 Code generation/Templates
-
-Revise the generated form constructing code to use the C<fieldopts>
-option to C<< FB->new >>; will require FB 3.02 to run.
-
-Better integration with L<CGI::FormBuilder>'s templating system; rely on the
-FB messages instead of trying to make our own.
-
-Allow for custom wrappers around the C<form_template>
-
-Maybe use HTML::Template instead of Text::Template for the built in template
-(since CGI::FormBuilder users may be more likely to already have HTML::Template)
-
-=head1 BUGS
-
-Placing C<fields> in a C<!fb> directive does not behave as expected (i.e. they
-don't show up). This is not a big issue, since you should be defining your fields
-in the body of the formspec file, but for completeness' sake I would like to get
-this figured out.
-
-I'm sure there are more in there, I just haven't tripped over any new ones lately. :-)
-
-Suggestions on how to improve the (currently tiny) test suite would be appreciated.
+Any line beginning with a C<#> is considered a comment.
 
 =head1 SEE ALSO
 
-L<CGI::FormBuilder>, L<http://formbuilder.org>
-
-=head1 THANKS
-
-Thanks to eszpee for pointing out some bugs in the default value parsing,
-as well as some suggestions for i18n/l10n and splitting up long forms into
-sections.
-
-To Ron Pero for a documentation patch, and for letting me know that software
-I wrote several years ago is still of use to people.
-
-And of course, to Nathan Wiger, for giving us CGI::FormBuilder in the
-first place. Thanks Nate!
-
-=head1 AUTHOR
-
-Peter Eichman C<< <peichman@cpan.org> >>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright E<copy>2004-2005 by Peter Eichman.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
+L<CGI::FormBuilder>
 
 =cut
Index: trunk/lib/Text/FormBuilder/Examples.pod
===================================================================
--- trunk/lib/Text/FormBuilder/Examples.pod	(revision 97)
+++ 	(revision )
@@ -1,225 +1,0 @@
-=head1 NAME
-
-Examples - Sample uses of Text::FormBuilder
-
-=head1 EXAMPLES
-
-=head2 Event Form
-
-This is the formspec for an input form for an event calendar. It exercises many
-of the features of the formspec language. This is close to a real world project
-that I have been developing.
-
-    !title Add Event
-    !author Peter Eichman
-    !description {
-        Start and end times are not required, but are recommended. If you leave 
-        both of them blank, the event will be considered an all day event.
-    }
-    
-    !pattern TIME /^\s*\d{1,2}(:\d{2})?(\s*[ap]m)?\s*$/
-    !pattern DAY  /^\s*(([1-3][0-9])|[1-9])\s*$/
-    !pattern YEAR /^\s*\d{4}\s*$/
-    
-    !list MONTHS {
-        1[January],    2[February], 3[March],     4[April],
-        5[May],        6[June],     7[July],      8[August],
-        9[September], 10[October], 11[November], 12[December]
-    }
-    
-    !group DATE {
-        month@MONTHS//VALUE
-        day[2]//DAY
-        year[4]//YEAR
-    }
-    
-    !group TIME {
-        start[8]|' '//TIME?
-        end[8]|''[(hh:mm am/pm)]//TIME?
-    }
-    
-    !group SERIES {
-        old|Existing:select
-        new[40]|or New
-    }
-    
-    # input fields start here
-    
-    event_type:select//VALUE
-    
-    title[60]//VALUE
-    
-    !field %DATE date
-    !field %TIME time
-    
-    series_old|Existing series:select
-    series_new[60]|New series
-    
-    description[6,60]:textarea
-    contact[60]
-    email[40]//EMAIL?
-    location[60]
-    url[60]|Website
-
-Both of the fields C<event_type> and C<series_old> get filled in
-from a database in the actual CGI script. The relevant bits of 
-the CGI script which uses this form go something like this:
-
-    # the module containing the FormBuilder-building code
-    use Calendar::Forms::AddEvent;
-    my $form = Calendar::Forms::AddEvent::get_form($q);
-    
-    # now we have a CGI::FormBuilder object in $form
-    
-    # fill in dropdown lists
-    $form->field(name => 'event_type', values => \@event_types);
-    $form->field(name => 'series_old', values => \@existing_series);
-    
-    unless ($form->submitted && $form->validate) {
-        print $q->header;
-        print $form->render;
-    } else {
-        # process the data ...
-    }
-
-=head1 CGI::FormBuilder EXAMPLES
-
-Here are some of L<CGI::FormBuilder>'s examples, translated into
-Text::FormBuilder's terms.
-
-=head2 Ex1: order.cgi
-
-Formspec F<example1>:
-
-    !title Order Info
-    
-    !list STATES {
-        AL, AK, AZ, AR, CA, CO, CT, DE, DC, FL, GE, HI, ID, IL, IN, IA, KS,
-        KY, LA, ME, MD, MA, MI, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC,
-        ND, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VT, VA, WA, WV, WI, WY
-    }
-    
-    first_name
-    last_name
-    email//EMAIL
-    address
-    state@STATES
-    zipcode//ZIPCODE
-    credit_card//CARD
-    details[10,50]:textarea
-
-Parse and create F<Example1.pm>:
-
-    $ perl -MText::FormBuilder \
-        -e'Text::FormBuilder->parse("example1")->build(method => "POST") \
-        ->write_module("MyForms::Example1")'
-
-Script:
-
-    #!/usr/bin/perl -w
-    use strict;
-    
-    use CGI;    # you have to use CGI.pm explicitly
-    use MyForms::Example1;
-    
-    my $q = CGI->new;
-    
-    my $form = MyForms::Example1::get_form($q);
-    
-    # try to validate it first
-    if ($form->submitted && $form->validate) {
-        # ... more code goes here to do stuff ...
-        print $form->confirm;
-    } else {
-        print $form->render;
-    }
-
-=head2 Ex2: order_form.cgi
-
-You can also include the formspec in your script; the only downside to this 
-is that your script has to parse the spec every time it gets called, so this
-method is definitely I<not> recommended for high-traffic forms.
-
-Script F<order_form.cgi>:
-
-    #!/usr/bin/perl -w
-    use strict;
-    
-    use CGI;    # you have to use CGI.pm explicitly
-    use Text::FormBuilder;
-    
-    my $parser = Text::FormBuilder->parse_text(q[
-    first_name
-    last_name
-    email
-    address
-    state@STATE
-    zipcode
-    credit_card
-    details[10,50]:textarea
-    ]);
-    
-    my $q = CGI->new;
-    $parser->build(params => $q, method => 'POST', smartness => 2, debug => 2);
-    
-    my $form = $parser->form;
-    
-    # try to validate it first
-    if ($form->submitted && $form->validate) {
-        # ... more code goes here to do stuff ...
-        print $form->confirm;
-    } else {
-        print $form->render;
-    }
-
-=head2 Ex4: user_info.cgi
-
-    #!/usr/bin/perl -w
-    use strict;
-    
-    use Text::FormBuilder;
-    use CGI;
-    use DBI;
-    
-    my $dbh = DBI->connect('dbi:Oracle:db', 'user', 'pass');
-    
-    my $parser = Text::FormBuilder->parse_text(q[
-    username
-    password
-    confirm_password
-    first_name
-    last_name
-    email
-    ]);
-    
-    
-    my $q = CGI->new;
-    my $form = $parser->build(params => $q)->form;
-    
-    # Now get the value of the username from our app
-    my $user = $form->cgi_param('user');
-    my $sth = $dbh->prepare("select * from user_info where user = '$user'");
-    $sth->execute;
-    my $default_hashref = $sth->fetchrow_hashref;
-    # Render our form with the defaults we got in our hashref
-    print $form->render(values => $default_hashref,
-                        title  => "User information for '$user'",
-    );
-
-=head1 SEE ALSO
-
-L<Text::FormBuilder>,
-L<CGI::FormBuilder>
-
-=head1 AUTHOR
-
-Peter Eichman, C<< <peichman@cpan.org> >>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright E<copy>2004 by Peter Eichman.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-=cut
Index: trunk/lib/Text/FormBuilder/Makefile
===================================================================
--- trunk/lib/Text/FormBuilder/Makefile	(revision 1)
+++ trunk/lib/Text/FormBuilder/Makefile	(revision 1)
@@ -0,0 +1,3 @@
+# pre-compile the parser from the grammar
+Parser.pm: grammar
+	perl -MParse::RecDescent - grammar Text::FormBuilder::Parser
Index: trunk/lib/Text/FormBuilder/Parser.pm
===================================================================
--- trunk/lib/Text/FormBuilder/Parser.pm	(revision 1)
+++ trunk/lib/Text/FormBuilder/Parser.pm	(revision 1)
@@ -0,0 +1,7629 @@
+package Text::FormBuilder::Parser;
+use Parse::RecDescent;
+
+{ my $ERRORS;
+
+
+package Parse::RecDescent::Text::FormBuilder::Parser;
+use strict;
+use vars qw($skip $AUTOLOAD  );
+$skip = '\s*';
+ my ($title, $author, %lists, %patterns, @fields, $type, @options, $list_var, $size, $rows, $cols); ;
+
+
+{
+local $SIG{__WARN__} = sub {0};
+# PRETEND TO BE IN Parse::RecDescent NAMESPACE
+*Parse::RecDescent::Text::FormBuilder::Parser::AUTOLOAD	= sub
+{
+	no strict 'refs';
+	$AUTOLOAD =~ s/^Parse::RecDescent::Text::FormBuilder::Parser/Parse::RecDescent/;
+	goto &{$AUTOLOAD};
+}
+}
+
+push @Parse::RecDescent::Text::FormBuilder::Parser::ISA, 'Parse::RecDescent';
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::row_col
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"row_col"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [row_col]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{row_col},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/\\d+/ /,\\s*/ /\\d+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{row_col});
+		%item = (__RULE__ => q{row_col});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/\\d+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:\d+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/,\\s*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/,\\s*/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:,\s*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN2__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/\\d+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/\\d+/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:\d+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN3__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $rows = $item[1]; $cols = $item[3] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/\\d+/ /,\\s*/ /\\d+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{row_col},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{row_col},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{row_col},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{row_col},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::options
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"options"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [options]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{options},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['\{' <leftop: option /,\\s*/ option> '\}']},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{options});
+		%item = (__RULE__ => q{options});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['\{']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\{//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying operator: [<leftop: option /,\\s*/ option>]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{options},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{<leftop: option /,\\s*/ option>})->at($text);
+
+		$_tok = undef;
+		OPLOOP: while (1)
+		{
+		  $repcount = 0;
+		  my  @item;
+		  
+		  # MATCH LEFTARG
+		  
+		Parse::RecDescent::_trace(q{Trying subrule: [option]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{options},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{option})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::option($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [option]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{options},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [option]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{option}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		  $repcount++;
+
+		  my $savetext = $text;
+		  my $backtrack;
+
+		  # MATCH (OP RIGHTARG)(s)
+		  while ($repcount < 100000000)
+		  {
+			$backtrack = 0;
+			
+		Parse::RecDescent::_trace(q{Trying terminal: [/,\\s*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/,\\s*/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:,\s*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+			pop @item;
+			if (defined $1) {push @item, $item{'option(s)'}=$1; $backtrack=1;}
+			
+		Parse::RecDescent::_trace(q{Trying subrule: [option]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{options},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{option})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::option($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [option]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{options},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [option]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{option}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+			$savetext = $text;
+			$repcount++;
+		  }
+		  $text = $savetext;
+		  pop @item if $backtrack;
+
+		  unless (@item) { undef $_tok; last }
+		  $_tok = [ @item ];
+		  last;
+		} 
+
+		unless ($repcount>=1)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match operator: [<leftop: option /,\\s*/ option>]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{options},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched operator: [<leftop: option /,\\s*/ option>]<< (return value: [}
+					  . qq{@{$_tok||[]}} . q{]},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+
+		push @item, $item{'option(s)'}=$_tok||[];
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['\}']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{'\}'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\}//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING2__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['\{' <leftop: option /,\\s*/ option> '\}']<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{options},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{options},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{options},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{options},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::list_def
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"list_def"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [list_def]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{list_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['!list' list_name '\{' <leftop: option /,\\s*/ option> /,?/ '\}']},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{list_def});
+		%item = (__RULE__ => q{list_def});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['!list']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\!list//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying subrule: [list_name]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{list_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{list_name})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::list_name($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [list_name]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{list_def},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [list_name]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{list_name}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['\{']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{'\{'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\{//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING2__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying operator: [<leftop: option /,\\s*/ option>]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{list_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{<leftop: option /,\\s*/ option>})->at($text);
+
+		$_tok = undef;
+		OPLOOP: while (1)
+		{
+		  $repcount = 0;
+		  my  @item;
+		  
+		  # MATCH LEFTARG
+		  
+		Parse::RecDescent::_trace(q{Trying subrule: [option]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{list_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{option})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::option($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [option]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{list_def},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [option]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{option}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		  $repcount++;
+
+		  my $savetext = $text;
+		  my $backtrack;
+
+		  # MATCH (OP RIGHTARG)(s)
+		  while ($repcount < 100000000)
+		  {
+			$backtrack = 0;
+			
+		Parse::RecDescent::_trace(q{Trying terminal: [/,\\s*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/,\\s*/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:,\s*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+			pop @item;
+			if (defined $1) {push @item, $item{'option(s)'}=$1; $backtrack=1;}
+			
+		Parse::RecDescent::_trace(q{Trying subrule: [option]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{list_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{option})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::option($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [option]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{list_def},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [option]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{option}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+			$savetext = $text;
+			$repcount++;
+		  }
+		  $text = $savetext;
+		  pop @item if $backtrack;
+
+		  unless (@item) { undef $_tok; last }
+		  $_tok = [ @item ];
+		  last;
+		} 
+
+		unless ($repcount>=1)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match operator: [<leftop: option /,\\s*/ option>]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{list_def},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched operator: [<leftop: option /,\\s*/ option>]<< (return value: [}
+					  . qq{@{$_tok||[]}} . q{]},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+
+		push @item, $item{'option(s)'}=$_tok||[];
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/,?/]}, Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/,?/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:,?)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN2__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['\}']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{'\}'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\}//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING3__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $lists{$item{list_name}} = [ @options ]; @options = () };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['!list' list_name '\{' <leftop: option /,\\s*/ option> /,?/ '\}']<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{list_def},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{list_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{list_def},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{list_def},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::field_size
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"field_size"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [field_size]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{field_size},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['[' row_col, or size ']']},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{field_size});
+		%item = (__RULE__ => q{field_size});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['[']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\[//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying subrule: [_alternation_1_of_production_1_of_rule_field_size]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field_size},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{row_col, or size})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::_alternation_1_of_production_1_of_rule_field_size($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [_alternation_1_of_production_1_of_rule_field_size]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field_size},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [_alternation_1_of_production_1_of_rule_field_size]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{_alternation_1_of_production_1_of_rule_field_size}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying terminal: [']']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{']'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\]//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING2__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['[' row_col, or size ']']<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{field_size},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{field_size},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{field_size},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::author
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"author"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [author]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{author},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['!author' /.*/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{author},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{author});
+		%item = (__RULE__ => q{author});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['!author']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{author},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\!author//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/.*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{author},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/.*/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:.*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{author},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $author = $item[2] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['!author' /.*/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{author},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{author},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{author},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{author},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{author},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::list_name
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"list_name"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [list_name]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{list_name},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/[A-Z_]+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{list_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{list_name});
+		%item = (__RULE__ => q{list_name});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/[A-Z_]+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{list_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:[A-Z_]+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/[A-Z_]+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{list_name},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{list_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{list_name},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{list_name},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::size
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"size"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [size]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{size},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/\\d+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{size});
+		%item = (__RULE__ => q{size});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/\\d+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:\d+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $size = $item[1] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/\\d+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{size},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{size},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{size},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::identifier
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"identifier"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [identifier]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{identifier},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/\\w+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{identifier},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{identifier});
+		%item = (__RULE__ => q{identifier});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/\\w+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{identifier},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:\w+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/\\w+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{identifier},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{identifier},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{identifier},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{identifier},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{identifier},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::blank
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"blank"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [blank]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{blank},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: []},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{blank},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{blank});
+		%item = (__RULE__ => q{blank});
+		my $repcount = 0;
+
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: []<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{blank},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{blank},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{blank},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{blank},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{blank},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::option
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"option"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [option]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{option},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [value display_text]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{option},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{option});
+		%item = (__RULE__ => q{option});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [value]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{option},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::value($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [value]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{option},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [value]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{value}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [display_text]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{option},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{display_text})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::display_text, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [display_text]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{option},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [display_text]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{display_text(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { push @options, { $item{value} => $item{'display_text(?)'}[0] } };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [value display_text]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{option},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{option},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{option},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{option},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::pattern_name
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"pattern_name"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [pattern_name]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{pattern_name},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/[A-Z_]+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{pattern_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{pattern_name});
+		%item = (__RULE__ => q{pattern_name});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/[A-Z_]+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{pattern_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:[A-Z_]+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/[A-Z_]+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{pattern_name},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{pattern_name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{pattern_name},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{pattern_name},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::validate
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"validate"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [validate]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{validate},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['//' value]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{validate},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{validate});
+		%item = (__RULE__ => q{validate});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['//']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{validate},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\/\///)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying subrule: [value]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{validate},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{value})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::value($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [value]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{validate},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [value]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{validate},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{value}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['//' value]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{validate},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{validate},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{validate},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{validate},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{validate},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::list_var
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"list_var"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [list_var]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{list_var},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/@[A-Z_]+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{list_var},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{list_var});
+		%item = (__RULE__ => q{list_var});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/@[A-Z_]+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{list_var},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:@[A-Z_]+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_var},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $list_var = $item[1] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/@[A-Z_]+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{list_var},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{list_var},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{list_var},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{list_var},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{list_var},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::field
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"field"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [field]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [name field_size label hint type default option_list validate]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{field});
+		%item = (__RULE__ => q{field});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [name]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::name($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [name]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [name]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{name}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [field_size]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{field_size})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::field_size, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [field_size]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [field_size]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{field_size(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [label]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{label})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::label, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [label]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [label]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{label(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [hint]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{hint})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::hint, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [hint]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [hint]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{hint(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [type]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{type})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::type, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [type]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [type]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{type(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [default]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{default})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::default, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [default]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [default]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{default(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [option_list]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{option_list})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::option_list, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [option_list]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [option_list]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{option_list(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [validate]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{field},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{validate})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::validate, 0, 1, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [validate]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{field},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [validate]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{validate(?)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do {
+	my $field = {
+	    name     => $item{name},
+	    label    => $item{'label(?)'}[0],
+	    comment  => $item{'hint(?)'}[0],
+	    type     => $item{'type(?)'}[0],
+	    value    => $item{'default(?)'}[0],
+            list     => $list_var,
+            validate => $item{'validate(?)'}[0],
+	};
+	
+	$$field{options} = [ @options ] if @options;
+	
+	$$field{rows} = $rows if defined $rows;
+	$$field{cols} = $cols if defined $cols;
+	$$field{size} = $size if defined $size;
+	
+	push @fields, $field;
+	
+	$type = undef;
+	$list_var = undef;
+	$size = undef;
+	$rows = undef;
+	$cols = undef;
+	@options = ();
+        
+    };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [name field_size label hint type default option_list validate]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{field},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{field},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{field},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{field},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::_alternation_1_of_production_1_of_rule_form_spec
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"_alternation_1_of_production_1_of_rule_form_spec"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [_alternation_1_of_production_1_of_rule_form_spec]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{_alternation_1_of_production_1_of_rule_form_spec},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [list_def]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_form_spec});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_form_spec});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [list_def]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_form_spec},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::list_def($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [list_def]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_form_spec},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [list_def]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{list_def}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [list_def]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [line]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[1];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_form_spec});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_form_spec});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [line]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_form_spec},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::line($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [line]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_form_spec},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [line]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{line}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [line]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{_alternation_1_of_production_1_of_rule_form_spec},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{_alternation_1_of_production_1_of_rule_form_spec},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::line
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"line"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [line]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		local $skip = defined($skip) ? $skip : $Parse::RecDescent::skip;
+		Parse::RecDescent::_trace(q{Trying production: [<skip:'[ \t]*'> title, or author, or pattern_def, or field, or comment, or blank '\\n']},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{line});
+		%item = (__RULE__ => q{line});
+		my $repcount = 0;
+
+
+		
+
+		Parse::RecDescent::_trace(q{Trying directive: [<skip:'[ \t]*'>]},
+					Parse::RecDescent::_tracefirst($text),
+					  q{line},
+					  $tracelevel)
+						if defined $::RD_TRACE; 
+		$_tok = do { my $oldskip = $skip; $skip='[ \t]*'; $oldskip };
+		if (defined($_tok))
+		{
+			Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [}
+						. $_tok . q{])},
+						Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		}
+		else
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match directive>>},
+						Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		}
+		
+		last unless defined $_tok;
+		push @item, $item{__DIRECTIVE1__}=$_tok;
+		
+
+		Parse::RecDescent::_trace(q{Trying subrule: [_alternation_1_of_production_1_of_rule_line]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{title, or author, or pattern_def, or field, or comment, or blank})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::_alternation_1_of_production_1_of_rule_line($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [_alternation_1_of_production_1_of_rule_line]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [_alternation_1_of_production_1_of_rule_line]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{_alternation_1_of_production_1_of_rule_line}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['\\n']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{'\\n'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   do { $_tok = "\n"; 1 } and
+		     substr($text,0,length($_tok)) eq $_tok and
+		     do { substr($text,0,length($_tok)) = ""; 1; }
+		)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $_tok . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [<skip:'[ \t]*'> title, or author, or pattern_def, or field, or comment, or blank '\\n']<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{line},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{line},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{line},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::option_list
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"option_list"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [option_list]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{option_list},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [options]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{option_list});
+		%item = (__RULE__ => q{option_list});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [options]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{option_list},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::options($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [options]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{option_list},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [options]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{options}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [options]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [list_var]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[1];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{option_list});
+		%item = (__RULE__ => q{option_list});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [list_var]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{option_list},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::list_var($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [list_var]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{option_list},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [list_var]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{list_var}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [list_var]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{option_list},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{option_list},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{option_list},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{option_list},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::_alternation_1_of_production_1_of_rule_line
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"_alternation_1_of_production_1_of_rule_line"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [_alternation_1_of_production_1_of_rule_line]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [title]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_line});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_line});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [title]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::title($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [title]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [title]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{title}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [title]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [author]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[1];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_line});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_line});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [author]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::author($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [author]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [author]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{author}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [author]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [pattern_def]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[2];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_line});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_line});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [pattern_def]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::pattern_def($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [pattern_def]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [pattern_def]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{pattern_def}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [pattern_def]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [field]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[3];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_line});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_line});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [field]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::field($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [field]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [field]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{field}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [field]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [comment]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[4];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_line});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_line});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [comment]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::comment($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [comment]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [comment]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{comment}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [comment]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [blank]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[5];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_line});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_line});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [blank]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_line},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::blank($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [blank]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_line},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [blank]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{blank}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [blank]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{_alternation_1_of_production_1_of_rule_line},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{_alternation_1_of_production_1_of_rule_line},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::value
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"value"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [value]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{value},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [identifier]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{value},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{value});
+		%item = (__RULE__ => q{value});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [identifier]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{value},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::identifier($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [identifier]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{value},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [identifier]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{value},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{identifier}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [identifier]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{value},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{value},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{value},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{value},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{value},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::_alternation_1_of_production_1_of_rule_field_size
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"_alternation_1_of_production_1_of_rule_field_size"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [_alternation_1_of_production_1_of_rule_field_size]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{_alternation_1_of_production_1_of_rule_field_size},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [row_col]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_field_size});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_field_size});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [row_col]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_field_size},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::row_col($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [row_col]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_field_size},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [row_col]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{row_col}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [row_col]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [size]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[1];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{_alternation_1_of_production_1_of_rule_field_size});
+		%item = (__RULE__ => q{_alternation_1_of_production_1_of_rule_field_size});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [size]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{_alternation_1_of_production_1_of_rule_field_size},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::size($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [size]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{_alternation_1_of_production_1_of_rule_field_size},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [size]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{size}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [size]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{_alternation_1_of_production_1_of_rule_field_size},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{_alternation_1_of_production_1_of_rule_field_size},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::name
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"name"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [name]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{name},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [identifier]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{name});
+		%item = (__RULE__ => q{name});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying subrule: [identifier]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{name},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::identifier($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [identifier]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{name},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [identifier]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{identifier}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [identifier]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{name},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{name},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{name},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{name},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::display_text
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"display_text"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [display_text]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{display_text},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['[' /[^\\]]+/i ']']},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{display_text});
+		%item = (__RULE__ => q{display_text});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['[']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\[//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/[^\\]]+/i]}, Parse::RecDescent::_tracefirst($text),
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/[^\\]]+/i})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:[^\]]+)//i)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [']']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{']'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\]//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING2__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $item[2] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['[' /[^\\]]+/i ']']<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{display_text},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{display_text},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{display_text},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{display_text},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::default
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"default"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [default]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{default},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['=' /[^\\@\\\{\\s]+/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{default},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{default});
+		%item = (__RULE__ => q{default});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['=']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{default},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\=//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/[^\\@\\\{\\s]+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{default},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/[^\\@\\\{\\s]+/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:[^\@\{\s]+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['=' /[^\\@\\\{\\s]+/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{default},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{default},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{default},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{default},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{default},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::form_spec
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"form_spec"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [form_spec]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{form_spec},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [list_def, or line]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{form_spec});
+		%item = (__RULE__ => q{form_spec});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying repeated subrule: [list_def, or line]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{form_spec},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		$expectation->is(q{})->at($text);
+		
+		unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Text::FormBuilder::Parser::_alternation_1_of_production_1_of_rule_form_spec, 1, 100000000, $_noactions,$expectation,undef))) 
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match repeated subrule: [list_def, or line]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{form_spec},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched repeated subrule: [_alternation_1_of_production_1_of_rule_form_spec]<< (}
+					. @$_tok . q{ times)},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{_alternation_1_of_production_1_of_rule_form_spec(s)}} = $_tok;
+		push @item, $_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do {
+	$return = {
+	    title    => $title,
+	    author   => $author,
+	    lists    => \%lists, 
+	    patterns => \%patterns, 
+	    fields   => \@fields,
+	}
+    };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [list_def, or line]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{form_spec},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{form_spec},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{form_spec},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{form_spec},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::pattern
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"pattern"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [pattern]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{pattern},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [/.*/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{pattern},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{pattern});
+		%item = (__RULE__ => q{pattern});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/.*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{pattern},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:.*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [/.*/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{pattern},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{pattern},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{pattern},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{pattern},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::comment
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"comment"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [comment]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{comment},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['#' /.*/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{comment},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{comment});
+		%item = (__RULE__ => q{comment});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['#']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{comment},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\#//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/.*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{comment},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/.*/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:.*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['#' /.*/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{comment},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{comment},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{comment},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{comment},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{comment},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::hint
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"hint"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [hint]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{hint},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['[' /[^\\]]+/ ']']},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{hint});
+		%item = (__RULE__ => q{hint});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['[']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\[//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/[^\\]]+/]}, Parse::RecDescent::_tracefirst($text),
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/[^\\]]+/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:[^\]]+)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [']']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{']'})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\]//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING2__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $item[2] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['[' /[^\\]]+/ ']']<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{hint},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{hint},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{hint},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{hint},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::type
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"type"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [type]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{type},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: [':' /textarea|text|password|file|checkbox|radio|select|hidden|static/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{type},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{type});
+		%item = (__RULE__ => q{type});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: [':']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{type},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\://)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/textarea|text|password|file|checkbox|radio|select|hidden|static/]}, Parse::RecDescent::_tracefirst($text),
+					  q{type},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/textarea|text|password|file|checkbox|radio|select|hidden|static/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:textarea|text|password|file|checkbox|radio|select|hidden|static)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: [':' /textarea|text|password|file|checkbox|radio|select|hidden|static/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{type},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{type},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{type},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{type},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{type},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::title
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"title"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [title]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{title},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['!title' /.*/]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{title},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{title});
+		%item = (__RULE__ => q{title});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['!title']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{title},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\!title//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/.*/]}, Parse::RecDescent::_tracefirst($text),
+					  q{title},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/.*/})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:.*)//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{title},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { warn "[Text::Formbuilder] Title redefined at input text line $thisline\n" if defined $title;
+    $title = $item[2] };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['!title' /.*/]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{title},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{title},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{title},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{title},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{title},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::label
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"label"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [label]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{label},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['|' /[^:\\[\\\{\\/]+/i]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{label},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{label});
+		%item = (__RULE__ => q{label});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['|']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{label},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\|//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying terminal: [/[^:\\[\\\{\\/]+/i]}, Parse::RecDescent::_tracefirst($text),
+					  q{label},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{/[^:\\[\\\{\\/]+/i})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A(?:[^:\[\{\/]+)//i)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+					if defined $::RD_TRACE;
+		push @item, $item{__PATTERN1__}=$&;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['|' /[^:\\[\\\{\\/]+/i]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{label},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{label},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{label},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{label},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{label},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+
+# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
+sub Parse::RecDescent::Text::FormBuilder::Parser::pattern_def
+{
+	my $thisparser = $_[0];
+	use vars q{$tracelevel};
+	local $tracelevel = ($tracelevel||0)+1;
+	$ERRORS = 0;
+	my $thisrule = $thisparser->{"rules"}{"pattern_def"};
+	
+	Parse::RecDescent::_trace(q{Trying rule: [pattern_def]},
+				  Parse::RecDescent::_tracefirst($_[1]),
+				  q{pattern_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+
+	
+	my $err_at = @{$thisparser->{errors}};
+
+	my $score;
+	my $score_return;
+	my $_tok;
+	my $return = undef;
+	my $_matched=0;
+	my $commit=0;
+	my @item = ();
+	my %item = ();
+	my $repeating =  defined($_[2]) && $_[2];
+	my $_noactions = defined($_[3]) && $_[3];
+ 	my @arg =        defined $_[4] ? @{ &{$_[4]} } : ();
+	my %arg =        ($#arg & 01) ? @arg : (@arg, undef);
+	my $text;
+	my $lastsep="";
+	my $expectation = new Parse::RecDescent::Expectation($thisrule->expected());
+	$expectation->at($_[1]);
+	
+	my $thisline;
+	tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
+
+	
+
+	while (!$_matched && !$commit)
+	{
+		
+		Parse::RecDescent::_trace(q{Trying production: ['!pattern' pattern_name pattern]},
+					  Parse::RecDescent::_tracefirst($_[1]),
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		my $thisprod = $thisrule->{"prods"}[0];
+		$text = $_[1];
+		my $_savetext;
+		@item = (q{pattern_def});
+		%item = (__RULE__ => q{pattern_def});
+		my $repcount = 0;
+
+
+		Parse::RecDescent::_trace(q{Trying terminal: ['!pattern']},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$lastsep = "";
+		$expectation->is(q{})->at($text);
+		
+
+		unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and   $text =~ s/\A\!pattern//)
+		{
+			
+			$expectation->failed();
+			Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
+						. $& . q{])},
+						  Parse::RecDescent::_tracefirst($text))
+							if defined $::RD_TRACE;
+		push @item, $item{__STRING1__}=$&;
+		
+
+		Parse::RecDescent::_trace(q{Trying subrule: [pattern_name]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{pattern_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{pattern_name})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::pattern_name($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [pattern_name]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{pattern_def},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [pattern_name]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{pattern_name}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying subrule: [pattern]},
+				  Parse::RecDescent::_tracefirst($text),
+				  q{pattern_def},
+				  $tracelevel)
+					if defined $::RD_TRACE;
+		if (1) { no strict qw{refs};
+		$expectation->is(q{pattern})->at($text);
+		unless (defined ($_tok = Parse::RecDescent::Text::FormBuilder::Parser::pattern($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
+		{
+			
+			Parse::RecDescent::_trace(q{<<Didn't match subrule: [pattern]>>},
+						  Parse::RecDescent::_tracefirst($text),
+						  q{pattern_def},
+						  $tracelevel)
+							if defined $::RD_TRACE;
+			$expectation->failed();
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched subrule: [pattern]<< (return value: [}
+					. $_tok . q{]},
+					  
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$item{q{pattern}} = $_tok;
+		push @item, $_tok;
+		
+		}
+
+		Parse::RecDescent::_trace(q{Trying action},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		
+
+		$_tok = ($_noactions) ? 0 : do { $patterns{$item{pattern_name}} = $item{pattern} };
+		unless (defined $_tok)
+		{
+			Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
+					if defined $::RD_TRACE;
+			last;
+		}
+		Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
+					  . $_tok . q{])},
+					  Parse::RecDescent::_tracefirst($text))
+						if defined $::RD_TRACE;
+		push @item, $_tok;
+		$item{__ACTION1__}=$_tok;
+		
+
+
+		Parse::RecDescent::_trace(q{>>Matched production: ['!pattern' pattern_name pattern]<<},
+					  Parse::RecDescent::_tracefirst($text),
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$_matched = 1;
+		last;
+	}
+
+
+        unless ( $_matched || defined($return) || defined($score) )
+	{
+		
+
+		$_[1] = $text;	# NOT SURE THIS IS NEEDED
+		Parse::RecDescent::_trace(q{<<Didn't match rule>>},
+					 Parse::RecDescent::_tracefirst($_[1]),
+					 q{pattern_def},
+					 $tracelevel)
+					if defined $::RD_TRACE;
+		return undef;
+	}
+	if (!defined($return) && defined($score))
+	{
+		Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
+					  q{pattern_def},
+					  $tracelevel)
+						if defined $::RD_TRACE;
+		$return = $score_return;
+	}
+	splice @{$thisparser->{errors}}, $err_at;
+	$return = $item[$#item] unless defined $return;
+	if (defined $::RD_TRACE)
+	{
+		Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
+					  $return . q{])}, "",
+					  q{pattern_def},
+					  $tracelevel);
+		Parse::RecDescent::_trace(q{(consumed: [} .
+					  Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])}, 
+					  Parse::RecDescent::_tracefirst($text),
+					  , q{pattern_def},
+					  $tracelevel)
+	}
+	$_[1] = $text;
+	return $return;
+}
+}
+package Text::FormBuilder::Parser; sub new { my $self = bless( {
+                 '_AUTOTREE' => undef,
+                 'localvars' => '',
+                 'startcode' => '',
+                 '_check' => {
+                               'thisoffset' => '',
+                               'itempos' => '',
+                               'prevoffset' => '',
+                               'prevline' => '',
+                               'prevcolumn' => '',
+                               'thiscolumn' => ''
+                             },
+                 'namespace' => 'Parse::RecDescent::Text::FormBuilder::Parser',
+                 '_AUTOACTION' => undef,
+                 'rules' => {
+                              'row_col' => bless( {
+                                                    'impcount' => 0,
+                                                    'calls' => [],
+                                                    'changed' => 0,
+                                                    'opcount' => 0,
+                                                    'prods' => [
+                                                                 bless( {
+                                                                          'number' => '0',
+                                                                          'strcount' => 0,
+                                                                          'dircount' => 0,
+                                                                          'uncommit' => undef,
+                                                                          'error' => undef,
+                                                                          'patcount' => 3,
+                                                                          'actcount' => 1,
+                                                                          'items' => [
+                                                                                       bless( {
+                                                                                                'pattern' => '\\d+',
+                                                                                                'hashname' => '__PATTERN1__',
+                                                                                                'description' => '/\\\\d+/',
+                                                                                                'lookahead' => 0,
+                                                                                                'rdelim' => '/',
+                                                                                                'line' => 70,
+                                                                                                'mod' => '',
+                                                                                                'ldelim' => '/'
+                                                                                              }, 'Parse::RecDescent::Token' ),
+                                                                                       bless( {
+                                                                                                'pattern' => ',\\s*',
+                                                                                                'hashname' => '__PATTERN2__',
+                                                                                                'description' => '/,\\\\s*/',
+                                                                                                'lookahead' => 0,
+                                                                                                'rdelim' => '/',
+                                                                                                'line' => 70,
+                                                                                                'mod' => '',
+                                                                                                'ldelim' => '/'
+                                                                                              }, 'Parse::RecDescent::Token' ),
+                                                                                       bless( {
+                                                                                                'pattern' => '\\d+',
+                                                                                                'hashname' => '__PATTERN3__',
+                                                                                                'description' => '/\\\\d+/',
+                                                                                                'lookahead' => 0,
+                                                                                                'rdelim' => '/',
+                                                                                                'line' => 70,
+                                                                                                'mod' => '',
+                                                                                                'ldelim' => '/'
+                                                                                              }, 'Parse::RecDescent::Token' ),
+                                                                                       bless( {
+                                                                                                'hashname' => '__ACTION1__',
+                                                                                                'lookahead' => 0,
+                                                                                                'line' => 71,
+                                                                                                'code' => '{ $rows = $item[1]; $cols = $item[3] }'
+                                                                                              }, 'Parse::RecDescent::Action' )
+                                                                                     ],
+                                                                          'line' => undef
+                                                                        }, 'Parse::RecDescent::Production' )
+                                                               ],
+                                                    'name' => 'row_col',
+                                                    'vars' => '',
+                                                    'line' => 70
+                                                  }, 'Parse::RecDescent::Rule' ),
+                              'options' => bless( {
+                                                    'impcount' => 0,
+                                                    'calls' => [
+                                                                 'option'
+                                                               ],
+                                                    'changed' => 0,
+                                                    'opcount' => 0,
+                                                    'prods' => [
+                                                                 bless( {
+                                                                          'number' => '0',
+                                                                          'strcount' => 2,
+                                                                          'dircount' => 1,
+                                                                          'uncommit' => undef,
+                                                                          'error' => undef,
+                                                                          'patcount' => 1,
+                                                                          'actcount' => 0,
+                                                                          'op' => [],
+                                                                          'items' => [
+                                                                                       bless( {
+                                                                                                'pattern' => '{',
+                                                                                                'hashname' => '__STRING1__',
+                                                                                                'description' => '\'\\{\'',
+                                                                                                'lookahead' => 0,
+                                                                                                'line' => 83
+                                                                                              }, 'Parse::RecDescent::Literal' ),
+                                                                                       bless( {
+                                                                                                'expected' => '<leftop: option /,\\\\s*/ option>',
+                                                                                                'min' => 1,
+                                                                                                'name' => '\'option(s)\'',
+                                                                                                'max' => 100000000,
+                                                                                                'leftarg' => bless( {
+                                                                                                                      'subrule' => 'option',
+                                                                                                                      'matchrule' => 0,
+                                                                                                                      'implicit' => undef,
+                                                                                                                      'argcode' => undef,
+                                                                                                                      'lookahead' => 0,
+                                                                                                                      'line' => 83
+                                                                                                                    }, 'Parse::RecDescent::Subrule' ),
+                                                                                                'rightarg' => bless( {
+                                                                                                                       'subrule' => 'option',
+                                                                                                                       'matchrule' => 0,
+                                                                                                                       'implicit' => undef,
+                                                                                                                       'argcode' => undef,
+                                                                                                                       'lookahead' => 0,
+                                                                                                                       'line' => 83
+                                                                                                                     }, 'Parse::RecDescent::Subrule' ),
+                                                                                                'hashname' => '__DIRECTIVE1__',
+                                                                                                'type' => 'leftop',
+                                                                                                'op' => bless( {
+                                                                                                                 'pattern' => ',\\s*',
+                                                                                                                 'hashname' => '__PATTERN1__',
+                                                                                                                 'description' => '/,\\\\s*/',
+                                                                                                                 'lookahead' => 0,
+                                                                                                                 'rdelim' => '/',
+                                                                                                                 'line' => 83,
+                                                                                                                 'mod' => '',
+                                                                                                                 'ldelim' => '/'
+                                                                                                               }, 'Parse::RecDescent::Token' )
+                                                                                              }, 'Parse::RecDescent::Operator' ),
+                                                                                       bless( {
+                                                                                                'pattern' => '}',
+                                                                                                'hashname' => '__STRING2__',
+                                                                                                'description' => '\'\\}\'',
+                                                                                                'lookahead' => 0,
+                                                                                                'line' => 83
+                                                                                              }, 'Parse::RecDescent::Literal' )
+                                                                                     ],
+                                                                          'line' => undef
+                                                                        }, 'Parse::RecDescent::Production' )
+                                                               ],
+                                                    'name' => 'options',
+                                                    'vars' => '',
+                                                    'line' => 83
+                                                  }, 'Parse::RecDescent::Rule' ),
+                              'list_def' => bless( {
+                                                     'impcount' => 0,
+                                                     'calls' => [
+                                                                  'list_name',
+                                                                  'option'
+                                                                ],
+                                                     'changed' => 0,
+                                                     'opcount' => 0,
+                                                     'prods' => [
+                                                                  bless( {
+                                                                           'number' => '0',
+                                                                           'strcount' => 3,
+                                                                           'dircount' => 1,
+                                                                           'uncommit' => undef,
+                                                                           'error' => undef,
+                                                                           'patcount' => 2,
+                                                                           'actcount' => 1,
+                                                                           'op' => [],
+                                                                           'items' => [
+                                                                                        bless( {
+                                                                                                 'pattern' => '!list',
+                                                                                                 'hashname' => '__STRING1__',
+                                                                                                 'description' => '\'!list\'',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 14
+                                                                                               }, 'Parse::RecDescent::Literal' ),
+                                                                                        bless( {
+                                                                                                 'subrule' => 'list_name',
+                                                                                                 'matchrule' => 0,
+                                                                                                 'implicit' => undef,
+                                                                                                 'argcode' => undef,
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 14
+                                                                                               }, 'Parse::RecDescent::Subrule' ),
+                                                                                        bless( {
+                                                                                                 'pattern' => '{',
+                                                                                                 'hashname' => '__STRING2__',
+                                                                                                 'description' => '\'\\{\'',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 14
+                                                                                               }, 'Parse::RecDescent::Literal' ),
+                                                                                        bless( {
+                                                                                                 'expected' => '<leftop: option /,\\\\s*/ option>',
+                                                                                                 'min' => 1,
+                                                                                                 'name' => '\'option(s)\'',
+                                                                                                 'max' => 100000000,
+                                                                                                 'leftarg' => bless( {
+                                                                                                                       'subrule' => 'option',
+                                                                                                                       'matchrule' => 0,
+                                                                                                                       'implicit' => undef,
+                                                                                                                       'argcode' => undef,
+                                                                                                                       'lookahead' => 0,
+                                                                                                                       'line' => 14
+                                                                                                                     }, 'Parse::RecDescent::Subrule' ),
+                                                                                                 'rightarg' => bless( {
+                                                                                                                        'subrule' => 'option',
+                                                                                                                        'matchrule' => 0,
+                                                                                                                        'implicit' => undef,
+                                                                                                                        'argcode' => undef,
+                                                                                                                        'lookahead' => 0,
+                                                                                                                        'line' => 14
+                                                                                                                      }, 'Parse::RecDescent::Subrule' ),
+                                                                                                 'hashname' => '__DIRECTIVE1__',
+                                                                                                 'type' => 'leftop',
+                                                                                                 'op' => bless( {
+                                                                                                                  'pattern' => ',\\s*',
+                                                                                                                  'hashname' => '__PATTERN1__',
+                                                                                                                  'description' => '/,\\\\s*/',
+                                                                                                                  'lookahead' => 0,
+                                                                                                                  'rdelim' => '/',
+                                                                                                                  'line' => 14,
+                                                                                                                  'mod' => '',
+                                                                                                                  'ldelim' => '/'
+                                                                                                                }, 'Parse::RecDescent::Token' )
+                                                                                               }, 'Parse::RecDescent::Operator' ),
+                                                                                        bless( {
+                                                                                                 'pattern' => ',?',
+                                                                                                 'hashname' => '__PATTERN2__',
+                                                                                                 'description' => '/,?/',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'rdelim' => '/',
+                                                                                                 'line' => 14,
+                                                                                                 'mod' => '',
+                                                                                                 'ldelim' => '/'
+                                                                                               }, 'Parse::RecDescent::Token' ),
+                                                                                        bless( {
+                                                                                                 'pattern' => '}',
+                                                                                                 'hashname' => '__STRING3__',
+                                                                                                 'description' => '\'\\}\'',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 14
+                                                                                               }, 'Parse::RecDescent::Literal' ),
+                                                                                        bless( {
+                                                                                                 'hashname' => '__ACTION1__',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 15,
+                                                                                                 'code' => '{ $lists{$item{list_name}} = [ @options ]; @options = () }'
+                                                                                               }, 'Parse::RecDescent::Action' )
+                                                                                      ],
+                                                                           'line' => undef
+                                                                         }, 'Parse::RecDescent::Production' )
+                                                                ],
+                                                     'name' => 'list_def',
+                                                     'vars' => '',
+                                                     'line' => 14
+                                                   }, 'Parse::RecDescent::Rule' ),
+                              'field_size' => bless( {
+                                                       'impcount' => 1,
+                                                       'calls' => [
+                                                                    '_alternation_1_of_production_1_of_rule_field_size'
+                                                                  ],
+                                                       'changed' => 0,
+                                                       'opcount' => 0,
+                                                       'prods' => [
+                                                                    bless( {
+                                                                             'number' => '0',
+                                                                             'strcount' => 2,
+                                                                             'dircount' => 0,
+                                                                             'uncommit' => undef,
+                                                                             'error' => undef,
+                                                                             'patcount' => 0,
+                                                                             'actcount' => 0,
+                                                                             'items' => [
+                                                                                          bless( {
+                                                                                                   'pattern' => '[',
+                                                                                                   'hashname' => '__STRING1__',
+                                                                                                   'description' => '\'[\'',
+                                                                                                   'lookahead' => 0,
+                                                                                                   'line' => 65
+                                                                                                 }, 'Parse::RecDescent::Literal' ),
+                                                                                          bless( {
+                                                                                                   'subrule' => '_alternation_1_of_production_1_of_rule_field_size',
+                                                                                                   'matchrule' => 0,
+                                                                                                   'implicit' => 'row_col, or size',
+                                                                                                   'argcode' => undef,
+                                                                                                   'lookahead' => 0,
+                                                                                                   'line' => 65
+                                                                                                 }, 'Parse::RecDescent::Subrule' ),
+                                                                                          bless( {
+                                                                                                   'pattern' => ']',
+                                                                                                   'hashname' => '__STRING2__',
+                                                                                                   'description' => '\']\'',
+                                                                                                   'lookahead' => 0,
+                                                                                                   'line' => 65
+                                                                                                 }, 'Parse::RecDescent::Literal' )
+                                                                                        ],
+                                                                             'line' => undef
+                                                                           }, 'Parse::RecDescent::Production' )
+                                                                  ],
+                                                       'name' => 'field_size',
+                                                       'vars' => '',
+                                                       'line' => 65
+                                                     }, 'Parse::RecDescent::Rule' ),
+                              'author' => bless( {
+                                                   'impcount' => 0,
+                                                   'calls' => [],
+                                                   'changed' => 0,
+                                                   'opcount' => 0,
+                                                   'prods' => [
+                                                                bless( {
+                                                                         'number' => '0',
+                                                                         'strcount' => 1,
+                                                                         'dircount' => 0,
+                                                                         'uncommit' => undef,
+                                                                         'error' => undef,
+                                                                         'patcount' => 1,
+                                                                         'actcount' => 1,
+                                                                         'items' => [
+                                                                                      bless( {
+                                                                                               'pattern' => '!author',
+                                                                                               'hashname' => '__STRING1__',
+                                                                                               'description' => '\'!author\'',
+                                                                                               'lookahead' => 0,
+                                                                                               'line' => 25
+                                                                                             }, 'Parse::RecDescent::Literal' ),
+                                                                                      bless( {
+                                                                                               'pattern' => '.*',
+                                                                                               'hashname' => '__PATTERN1__',
+                                                                                               'description' => '/.*/',
+                                                                                               'lookahead' => 0,
+                                                                                               'rdelim' => '/',
+                                                                                               'line' => 25,
+                                                                                               'mod' => '',
+                                                                                               'ldelim' => '/'
+                                                                                             }, 'Parse::RecDescent::Token' ),
+                                                                                      bless( {
+                                                                                               'hashname' => '__ACTION1__',
+                                                                                               'lookahead' => 0,
+                                                                                               'line' => 26,
+                                                                                               'code' => '{ $author = $item[2] }'
+                                                                                             }, 'Parse::RecDescent::Action' )
+                                                                                    ],
+                                                                         'line' => undef
+                                                                       }, 'Parse::RecDescent::Production' )
+                                                              ],
+                                                   'name' => 'author',
+                                                   'vars' => '',
+                                                   'line' => 25
+                                                 }, 'Parse::RecDescent::Rule' ),
+                              'list_name' => bless( {
+                                                      'impcount' => 0,
+                                                      'calls' => [],
+                                                      'changed' => 0,
+                                                      'opcount' => 0,
+                                                      'prods' => [
+                                                                   bless( {
+                                                                            'number' => '0',
+                                                                            'strcount' => 0,
+                                                                            'dircount' => 0,
+                                                                            'uncommit' => undef,
+                                                                            'error' => undef,
+                                                                            'patcount' => 1,
+                                                                            'actcount' => 0,
+                                                                            'items' => [
+                                                                                         bless( {
+                                                                                                  'pattern' => '[A-Z_]+',
+                                                                                                  'hashname' => '__PATTERN1__',
+                                                                                                  'description' => '/[A-Z_]+/',
+                                                                                                  'lookahead' => 0,
+                                                                                                  'rdelim' => '/',
+                                                                                                  'line' => 17,
+                                                                                                  'mod' => '',
+                                                                                                  'ldelim' => '/'
+                                                                                                }, 'Parse::RecDescent::Token' )
+                                                                                       ],
+                                                                            'line' => undef
+                                                                          }, 'Parse::RecDescent::Production' )
+                                                                 ],
+                                                      'name' => 'list_name',
+                                                      'vars' => '',
+                                                      'line' => 17
+                                                    }, 'Parse::RecDescent::Rule' ),
+                              'size' => bless( {
+                                                 'impcount' => 0,
+                                                 'calls' => [],
+                                                 'changed' => 0,
+                                                 'opcount' => 0,
+                                                 'prods' => [
+                                                              bless( {
+                                                                       'number' => '0',
+                                                                       'strcount' => 0,
+                                                                       'dircount' => 0,
+                                                                       'uncommit' => undef,
+                                                                       'error' => undef,
+                                                                       'patcount' => 1,
+                                                                       'actcount' => 1,
+                                                                       'items' => [
+                                                                                    bless( {
+                                                                                             'pattern' => '\\d+',
+                                                                                             'hashname' => '__PATTERN1__',
+                                                                                             'description' => '/\\\\d+/',
+                                                                                             'lookahead' => 0,
+                                                                                             'rdelim' => '/',
+                                                                                             'line' => 67,
+                                                                                             'mod' => '',
+                                                                                             'ldelim' => '/'
+                                                                                           }, 'Parse::RecDescent::Token' ),
+                                                                                    bless( {
+                                                                                             'hashname' => '__ACTION1__',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 68,
+                                                                                             'code' => '{ $size = $item[1] }'
+                                                                                           }, 'Parse::RecDescent::Action' )
+                                                                                  ],
+                                                                       'line' => undef
+                                                                     }, 'Parse::RecDescent::Production' )
+                                                            ],
+                                                 'name' => 'size',
+                                                 'vars' => '',
+                                                 'line' => 67
+                                               }, 'Parse::RecDescent::Rule' ),
+                              'identifier' => bless( {
+                                                       'impcount' => 0,
+                                                       'calls' => [],
+                                                       'changed' => 0,
+                                                       'opcount' => 0,
+                                                       'prods' => [
+                                                                    bless( {
+                                                                             'number' => '0',
+                                                                             'strcount' => 0,
+                                                                             'dircount' => 0,
+                                                                             'uncommit' => undef,
+                                                                             'error' => undef,
+                                                                             'patcount' => 1,
+                                                                             'actcount' => 0,
+                                                                             'items' => [
+                                                                                          bless( {
+                                                                                                   'pattern' => '\\w+',
+                                                                                                   'hashname' => '__PATTERN1__',
+                                                                                                   'description' => '/\\\\w+/',
+                                                                                                   'lookahead' => 0,
+                                                                                                   'rdelim' => '/',
+                                                                                                   'line' => 99,
+                                                                                                   'mod' => '',
+                                                                                                   'ldelim' => '/'
+                                                                                                 }, 'Parse::RecDescent::Token' )
+                                                                                        ],
+                                                                             'line' => undef
+                                                                           }, 'Parse::RecDescent::Production' )
+                                                                  ],
+                                                       'name' => 'identifier',
+                                                       'vars' => '',
+                                                       'line' => 99
+                                                     }, 'Parse::RecDescent::Rule' ),
+                              'blank' => bless( {
+                                                  'impcount' => 0,
+                                                  'calls' => [],
+                                                  'changed' => 0,
+                                                  'opcount' => 0,
+                                                  'prods' => [
+                                                               bless( {
+                                                                        'number' => '0',
+                                                                        'strcount' => 0,
+                                                                        'dircount' => 0,
+                                                                        'uncommit' => undef,
+                                                                        'error' => undef,
+                                                                        'patcount' => 0,
+                                                                        'actcount' => 0,
+                                                                        'items' => [],
+                                                                        'line' => undef
+                                                                      }, 'Parse::RecDescent::Production' )
+                                                             ],
+                                                  'name' => 'blank',
+                                                  'vars' => '',
+                                                  'line' => 97
+                                                }, 'Parse::RecDescent::Rule' ),
+                              'option' => bless( {
+                                                   'impcount' => 0,
+                                                   'calls' => [
+                                                                'value',
+                                                                'display_text'
+                                                              ],
+                                                   'changed' => 0,
+                                                   'opcount' => 0,
+                                                   'prods' => [
+                                                                bless( {
+                                                                         'number' => '0',
+                                                                         'strcount' => 0,
+                                                                         'dircount' => 0,
+                                                                         'uncommit' => undef,
+                                                                         'error' => undef,
+                                                                         'patcount' => 0,
+                                                                         'actcount' => 1,
+                                                                         'items' => [
+                                                                                      bless( {
+                                                                                               'subrule' => 'value',
+                                                                                               'matchrule' => 0,
+                                                                                               'implicit' => undef,
+                                                                                               'argcode' => undef,
+                                                                                               'lookahead' => 0,
+                                                                                               'line' => 87
+                                                                                             }, 'Parse::RecDescent::Subrule' ),
+                                                                                      bless( {
+                                                                                               'subrule' => 'display_text',
+                                                                                               'expected' => undef,
+                                                                                               'min' => 0,
+                                                                                               'argcode' => undef,
+                                                                                               'max' => 1,
+                                                                                               'matchrule' => 0,
+                                                                                               'repspec' => '?',
+                                                                                               'lookahead' => 0,
+                                                                                               'line' => 87
+                                                                                             }, 'Parse::RecDescent::Repetition' ),
+                                                                                      bless( {
+                                                                                               'hashname' => '__ACTION1__',
+                                                                                               'lookahead' => 0,
+                                                                                               'line' => 88,
+                                                                                               'code' => '{ push @options, { $item{value} => $item{\'display_text(?)\'}[0] } }'
+                                                                                             }, 'Parse::RecDescent::Action' )
+                                                                                    ],
+                                                                         'line' => undef
+                                                                       }, 'Parse::RecDescent::Production' )
+                                                              ],
+                                                   'name' => 'option',
+                                                   'vars' => '',
+                                                   'line' => 87
+                                                 }, 'Parse::RecDescent::Rule' ),
+                              'pattern_name' => bless( {
+                                                         'impcount' => 0,
+                                                         'calls' => [],
+                                                         'changed' => 0,
+                                                         'opcount' => 0,
+                                                         'prods' => [
+                                                                      bless( {
+                                                                               'number' => '0',
+                                                                               'strcount' => 0,
+                                                                               'dircount' => 0,
+                                                                               'uncommit' => undef,
+                                                                               'error' => undef,
+                                                                               'patcount' => 1,
+                                                                               'actcount' => 0,
+                                                                               'items' => [
+                                                                                            bless( {
+                                                                                                     'pattern' => '[A-Z_]+',
+                                                                                                     'hashname' => '__PATTERN1__',
+                                                                                                     'description' => '/[A-Z_]+/',
+                                                                                                     'lookahead' => 0,
+                                                                                                     'rdelim' => '/',
+                                                                                                     'line' => 31,
+                                                                                                     'mod' => '',
+                                                                                                     'ldelim' => '/'
+                                                                                                   }, 'Parse::RecDescent::Token' )
+                                                                                          ],
+                                                                               'line' => undef
+                                                                             }, 'Parse::RecDescent::Production' )
+                                                                    ],
+                                                         'name' => 'pattern_name',
+                                                         'vars' => '',
+                                                         'line' => 31
+                                                       }, 'Parse::RecDescent::Rule' ),
+                              'validate' => bless( {
+                                                     'impcount' => 0,
+                                                     'calls' => [
+                                                                  'value'
+                                                                ],
+                                                     'changed' => 0,
+                                                     'opcount' => 0,
+                                                     'prods' => [
+                                                                  bless( {
+                                                                           'number' => '0',
+                                                                           'strcount' => 1,
+                                                                           'dircount' => 0,
+                                                                           'uncommit' => undef,
+                                                                           'error' => undef,
+                                                                           'patcount' => 0,
+                                                                           'actcount' => 0,
+                                                                           'items' => [
+                                                                                        bless( {
+                                                                                                 'pattern' => '//',
+                                                                                                 'hashname' => '__STRING1__',
+                                                                                                 'description' => '\'//\'',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 94
+                                                                                               }, 'Parse::RecDescent::Literal' ),
+                                                                                        bless( {
+                                                                                                 'subrule' => 'value',
+                                                                                                 'matchrule' => 0,
+                                                                                                 'implicit' => undef,
+                                                                                                 'argcode' => undef,
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 94
+                                                                                               }, 'Parse::RecDescent::Subrule' )
+                                                                                      ],
+                                                                           'line' => undef
+                                                                         }, 'Parse::RecDescent::Production' )
+                                                                ],
+                                                     'name' => 'validate',
+                                                     'vars' => '',
+                                                     'line' => 94
+                                                   }, 'Parse::RecDescent::Rule' ),
+                              'list_var' => bless( {
+                                                     'impcount' => 0,
+                                                     'calls' => [],
+                                                     'changed' => 0,
+                                                     'opcount' => 0,
+                                                     'prods' => [
+                                                                  bless( {
+                                                                           'number' => '0',
+                                                                           'strcount' => 0,
+                                                                           'dircount' => 0,
+                                                                           'uncommit' => undef,
+                                                                           'error' => undef,
+                                                                           'patcount' => 1,
+                                                                           'actcount' => 1,
+                                                                           'items' => [
+                                                                                        bless( {
+                                                                                                 'pattern' => '@[A-Z_]+',
+                                                                                                 'hashname' => '__PATTERN1__',
+                                                                                                 'description' => '/@[A-Z_]+/',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'rdelim' => '/',
+                                                                                                 'line' => 85,
+                                                                                                 'mod' => '',
+                                                                                                 'ldelim' => '/'
+                                                                                               }, 'Parse::RecDescent::Token' ),
+                                                                                        bless( {
+                                                                                                 'hashname' => '__ACTION1__',
+                                                                                                 'lookahead' => 0,
+                                                                                                 'line' => 85,
+                                                                                                 'code' => '{ $list_var = $item[1] }'
+                                                                                               }, 'Parse::RecDescent::Action' )
+                                                                                      ],
+                                                                           'line' => undef
+                                                                         }, 'Parse::RecDescent::Production' )
+                                                                ],
+                                                     'name' => 'list_var',
+                                                     'vars' => '',
+                                                     'line' => 85
+                                                   }, 'Parse::RecDescent::Rule' ),
+                              'field' => bless( {
+                                                  'impcount' => 0,
+                                                  'calls' => [
+                                                               'name',
+                                                               'field_size',
+                                                               'label',
+                                                               'hint',
+                                                               'type',
+                                                               'default',
+                                                               'option_list',
+                                                               'validate'
+                                                             ],
+                                                  'changed' => 0,
+                                                  'opcount' => 0,
+                                                  'prods' => [
+                                                               bless( {
+                                                                        'number' => '0',
+                                                                        'strcount' => 0,
+                                                                        'dircount' => 0,
+                                                                        'uncommit' => undef,
+                                                                        'error' => undef,
+                                                                        'patcount' => 0,
+                                                                        'actcount' => 1,
+                                                                        'items' => [
+                                                                                     bless( {
+                                                                                              'subrule' => 'name',
+                                                                                              'matchrule' => 0,
+                                                                                              'implicit' => undef,
+                                                                                              'argcode' => undef,
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Subrule' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'field_size',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'label',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'hint',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'type',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'default',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'option_list',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'subrule' => 'validate',
+                                                                                              'expected' => undef,
+                                                                                              'min' => 0,
+                                                                                              'argcode' => undef,
+                                                                                              'max' => 1,
+                                                                                              'matchrule' => 0,
+                                                                                              'repspec' => '?',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 34
+                                                                                            }, 'Parse::RecDescent::Repetition' ),
+                                                                                     bless( {
+                                                                                              'hashname' => '__ACTION1__',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 35,
+                                                                                              'code' => '{
+	my $field = {
+	    name     => $item{name},
+	    label    => $item{\'label(?)\'}[0],
+	    comment  => $item{\'hint(?)\'}[0],
+	    type     => $item{\'type(?)\'}[0],
+	    value    => $item{\'default(?)\'}[0],
+            list     => $list_var,
+            validate => $item{\'validate(?)\'}[0],
+	};
+	
+	$$field{options} = [ @options ] if @options;
+	
+	$$field{rows} = $rows if defined $rows;
+	$$field{cols} = $cols if defined $cols;
+	$$field{size} = $size if defined $size;
+	
+	push @fields, $field;
+	
+	$type = undef;
+	$list_var = undef;
+	$size = undef;
+	$rows = undef;
+	$cols = undef;
+	@options = ();
+        
+    }'
+                                                                                            }, 'Parse::RecDescent::Action' )
+                                                                                   ],
+                                                                        'line' => undef
+                                                                      }, 'Parse::RecDescent::Production' )
+                                                             ],
+                                                  'name' => 'field',
+                                                  'vars' => '',
+                                                  'line' => 34
+                                                }, 'Parse::RecDescent::Rule' ),
+                              '_alternation_1_of_production_1_of_rule_form_spec' => bless( {
+                                                                                             'impcount' => 0,
+                                                                                             'calls' => [
+                                                                                                          'list_def',
+                                                                                                          'line'
+                                                                                                        ],
+                                                                                             'changed' => 0,
+                                                                                             'opcount' => 0,
+                                                                                             'prods' => [
+                                                                                                          bless( {
+                                                                                                                   'number' => '0',
+                                                                                                                   'strcount' => 0,
+                                                                                                                   'dircount' => 0,
+                                                                                                                   'uncommit' => undef,
+                                                                                                                   'error' => undef,
+                                                                                                                   'patcount' => 0,
+                                                                                                                   'actcount' => 0,
+                                                                                                                   'items' => [
+                                                                                                                                bless( {
+                                                                                                                                         'subrule' => 'list_def',
+                                                                                                                                         'matchrule' => 0,
+                                                                                                                                         'implicit' => undef,
+                                                                                                                                         'argcode' => undef,
+                                                                                                                                         'lookahead' => 0,
+                                                                                                                                         'line' => 100
+                                                                                                                                       }, 'Parse::RecDescent::Subrule' )
+                                                                                                                              ],
+                                                                                                                   'line' => undef
+                                                                                                                 }, 'Parse::RecDescent::Production' ),
+                                                                                                          bless( {
+                                                                                                                   'number' => '1',
+                                                                                                                   'strcount' => 0,
+                                                                                                                   'dircount' => 0,
+                                                                                                                   'uncommit' => undef,
+                                                                                                                   'error' => undef,
+                                                                                                                   'patcount' => 0,
+                                                                                                                   'actcount' => 0,
+                                                                                                                   'items' => [
+                                                                                                                                bless( {
+                                                                                                                                         'subrule' => 'line',
+                                                                                                                                         'matchrule' => 0,
+                                                                                                                                         'implicit' => undef,
+                                                                                                                                         'argcode' => undef,
+                                                                                                                                         'lookahead' => 0,
+                                                                                                                                         'line' => 100
+                                                                                                                                       }, 'Parse::RecDescent::Subrule' )
+                                                                                                                              ],
+                                                                                                                   'line' => 100
+                                                                                                                 }, 'Parse::RecDescent::Production' )
+                                                                                                        ],
+                                                                                             'name' => '_alternation_1_of_production_1_of_rule_form_spec',
+                                                                                             'vars' => '',
+                                                                                             'line' => 100
+                                                                                           }, 'Parse::RecDescent::Rule' ),
+                              'line' => bless( {
+                                                 'impcount' => 1,
+                                                 'calls' => [
+                                                              '_alternation_1_of_production_1_of_rule_line'
+                                                            ],
+                                                 'changed' => 0,
+                                                 'opcount' => 0,
+                                                 'prods' => [
+                                                              bless( {
+                                                                       'number' => '0',
+                                                                       'strcount' => 1,
+                                                                       'dircount' => 1,
+                                                                       'uncommit' => undef,
+                                                                       'error' => undef,
+                                                                       'patcount' => 0,
+                                                                       'actcount' => 0,
+                                                                       'items' => [
+                                                                                    bless( {
+                                                                                             'hashname' => '__DIRECTIVE1__',
+                                                                                             'name' => '<skip:\'[ \\t]*\'>',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 19,
+                                                                                             'code' => 'my $oldskip = $skip; $skip=\'[ \\t]*\'; $oldskip'
+                                                                                           }, 'Parse::RecDescent::Directive' ),
+                                                                                    bless( {
+                                                                                             'subrule' => '_alternation_1_of_production_1_of_rule_line',
+                                                                                             'matchrule' => 0,
+                                                                                             'implicit' => 'title, or author, or pattern_def, or field, or comment, or blank',
+                                                                                             'argcode' => undef,
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 19
+                                                                                           }, 'Parse::RecDescent::Subrule' ),
+                                                                                    bless( {
+                                                                                             'pattern' => '\\n',
+                                                                                             'hashname' => '__STRING1__',
+                                                                                             'description' => '\'\\\\n\'',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 19
+                                                                                           }, 'Parse::RecDescent::InterpLit' )
+                                                                                  ],
+                                                                       'line' => undef
+                                                                     }, 'Parse::RecDescent::Production' )
+                                                            ],
+                                                 'name' => 'line',
+                                                 'vars' => '',
+                                                 'line' => 19
+                                               }, 'Parse::RecDescent::Rule' ),
+                              'option_list' => bless( {
+                                                        'impcount' => 0,
+                                                        'calls' => [
+                                                                     'options',
+                                                                     'list_var'
+                                                                   ],
+                                                        'changed' => 0,
+                                                        'opcount' => 0,
+                                                        'prods' => [
+                                                                     bless( {
+                                                                              'number' => '0',
+                                                                              'strcount' => 0,
+                                                                              'dircount' => 0,
+                                                                              'uncommit' => undef,
+                                                                              'error' => undef,
+                                                                              'patcount' => 0,
+                                                                              'actcount' => 0,
+                                                                              'items' => [
+                                                                                           bless( {
+                                                                                                    'subrule' => 'options',
+                                                                                                    'matchrule' => 0,
+                                                                                                    'implicit' => undef,
+                                                                                                    'argcode' => undef,
+                                                                                                    'lookahead' => 0,
+                                                                                                    'line' => 81
+                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                         ],
+                                                                              'line' => undef
+                                                                            }, 'Parse::RecDescent::Production' ),
+                                                                     bless( {
+                                                                              'number' => '1',
+                                                                              'strcount' => 0,
+                                                                              'dircount' => 0,
+                                                                              'uncommit' => undef,
+                                                                              'error' => undef,
+                                                                              'patcount' => 0,
+                                                                              'actcount' => 0,
+                                                                              'items' => [
+                                                                                           bless( {
+                                                                                                    'subrule' => 'list_var',
+                                                                                                    'matchrule' => 0,
+                                                                                                    'implicit' => undef,
+                                                                                                    'argcode' => undef,
+                                                                                                    'lookahead' => 0,
+                                                                                                    'line' => 81
+                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                         ],
+                                                                              'line' => 81
+                                                                            }, 'Parse::RecDescent::Production' )
+                                                                   ],
+                                                        'name' => 'option_list',
+                                                        'vars' => '',
+                                                        'line' => 81
+                                                      }, 'Parse::RecDescent::Rule' ),
+                              '_alternation_1_of_production_1_of_rule_line' => bless( {
+                                                                                        'impcount' => 0,
+                                                                                        'calls' => [
+                                                                                                     'title',
+                                                                                                     'author',
+                                                                                                     'pattern_def',
+                                                                                                     'field',
+                                                                                                     'comment',
+                                                                                                     'blank'
+                                                                                                   ],
+                                                                                        'changed' => 0,
+                                                                                        'opcount' => 0,
+                                                                                        'prods' => [
+                                                                                                     bless( {
+                                                                                                              'number' => '0',
+                                                                                                              'strcount' => 0,
+                                                                                                              'dircount' => 0,
+                                                                                                              'uncommit' => undef,
+                                                                                                              'error' => undef,
+                                                                                                              'patcount' => 0,
+                                                                                                              'actcount' => 0,
+                                                                                                              'items' => [
+                                                                                                                           bless( {
+                                                                                                                                    'subrule' => 'title',
+                                                                                                                                    'matchrule' => 0,
+                                                                                                                                    'implicit' => undef,
+                                                                                                                                    'argcode' => undef,
+                                                                                                                                    'lookahead' => 0,
+                                                                                                                                    'line' => 100
+                                                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                                                         ],
+                                                                                                              'line' => undef
+                                                                                                            }, 'Parse::RecDescent::Production' ),
+                                                                                                     bless( {
+                                                                                                              'number' => '1',
+                                                                                                              'strcount' => 0,
+                                                                                                              'dircount' => 0,
+                                                                                                              'uncommit' => undef,
+                                                                                                              'error' => undef,
+                                                                                                              'patcount' => 0,
+                                                                                                              'actcount' => 0,
+                                                                                                              'items' => [
+                                                                                                                           bless( {
+                                                                                                                                    'subrule' => 'author',
+                                                                                                                                    'matchrule' => 0,
+                                                                                                                                    'implicit' => undef,
+                                                                                                                                    'argcode' => undef,
+                                                                                                                                    'lookahead' => 0,
+                                                                                                                                    'line' => 100
+                                                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                                                         ],
+                                                                                                              'line' => 100
+                                                                                                            }, 'Parse::RecDescent::Production' ),
+                                                                                                     bless( {
+                                                                                                              'number' => '2',
+                                                                                                              'strcount' => 0,
+                                                                                                              'dircount' => 0,
+                                                                                                              'uncommit' => undef,
+                                                                                                              'error' => undef,
+                                                                                                              'patcount' => 0,
+                                                                                                              'actcount' => 0,
+                                                                                                              'items' => [
+                                                                                                                           bless( {
+                                                                                                                                    'subrule' => 'pattern_def',
+                                                                                                                                    'matchrule' => 0,
+                                                                                                                                    'implicit' => undef,
+                                                                                                                                    'argcode' => undef,
+                                                                                                                                    'lookahead' => 0,
+                                                                                                                                    'line' => 100
+                                                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                                                         ],
+                                                                                                              'line' => 100
+                                                                                                            }, 'Parse::RecDescent::Production' ),
+                                                                                                     bless( {
+                                                                                                              'number' => '3',
+                                                                                                              'strcount' => 0,
+                                                                                                              'dircount' => 0,
+                                                                                                              'uncommit' => undef,
+                                                                                                              'error' => undef,
+                                                                                                              'patcount' => 0,
+                                                                                                              'actcount' => 0,
+                                                                                                              'items' => [
+                                                                                                                           bless( {
+                                                                                                                                    'subrule' => 'field',
+                                                                                                                                    'matchrule' => 0,
+                                                                                                                                    'implicit' => undef,
+                                                                                                                                    'argcode' => undef,
+                                                                                                                                    'lookahead' => 0,
+                                                                                                                                    'line' => 100
+                                                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                                                         ],
+                                                                                                              'line' => 100
+                                                                                                            }, 'Parse::RecDescent::Production' ),
+                                                                                                     bless( {
+                                                                                                              'number' => '4',
+                                                                                                              'strcount' => 0,
+                                                                                                              'dircount' => 0,
+                                                                                                              'uncommit' => undef,
+                                                                                                              'error' => undef,
+                                                                                                              'patcount' => 0,
+                                                                                                              'actcount' => 0,
+                                                                                                              'items' => [
+                                                                                                                           bless( {
+                                                                                                                                    'subrule' => 'comment',
+                                                                                                                                    'matchrule' => 0,
+                                                                                                                                    'implicit' => undef,
+                                                                                                                                    'argcode' => undef,
+                                                                                                                                    'lookahead' => 0,
+                                                                                                                                    'line' => 100
+                                                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                                                         ],
+                                                                                                              'line' => 100
+                                                                                                            }, 'Parse::RecDescent::Production' ),
+                                                                                                     bless( {
+                                                                                                              'number' => '5',
+                                                                                                              'strcount' => 0,
+                                                                                                              'dircount' => 0,
+                                                                                                              'uncommit' => undef,
+                                                                                                              'error' => undef,
+                                                                                                              'patcount' => 0,
+                                                                                                              'actcount' => 0,
+                                                                                                              'items' => [
+                                                                                                                           bless( {
+                                                                                                                                    'subrule' => 'blank',
+                                                                                                                                    'matchrule' => 0,
+                                                                                                                                    'implicit' => undef,
+                                                                                                                                    'argcode' => undef,
+                                                                                                                                    'lookahead' => 0,
+                                                                                                                                    'line' => 100
+                                                                                                                                  }, 'Parse::RecDescent::Subrule' )
+                                                                                                                         ],
+                                                                                                              'line' => 100
+                                                                                                            }, 'Parse::RecDescent::Production' )
+                                                                                                   ],
+                                                                                        'name' => '_alternation_1_of_production_1_of_rule_line',
+                                                                                        'vars' => '',
+                                                                                        'line' => 100
+                                                                                      }, 'Parse::RecDescent::Rule' ),
+                              'value' => bless( {
+                                                  'impcount' => 0,
+                                                  'calls' => [
+                                                               'identifier'
+                                                             ],
+                                                  'changed' => 0,
+                                                  'opcount' => 0,
+                                                  'prods' => [
+                                                               bless( {
+                                                                        'number' => '0',
+                                                                        'strcount' => 0,
+                                                                        'dircount' => 0,
+                                                                        'uncommit' => undef,
+                                                                        'error' => undef,
+                                                                        'patcount' => 0,
+                                                                        'actcount' => 0,
+                                                                        'items' => [
+                                                                                     bless( {
+                                                                                              'subrule' => 'identifier',
+                                                                                              'matchrule' => 0,
+                                                                                              'implicit' => undef,
+                                                                                              'argcode' => undef,
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 90
+                                                                                            }, 'Parse::RecDescent::Subrule' )
+                                                                                   ],
+                                                                        'line' => undef
+                                                                      }, 'Parse::RecDescent::Production' )
+                                                             ],
+                                                  'name' => 'value',
+                                                  'vars' => '',
+                                                  'line' => 90
+                                                }, 'Parse::RecDescent::Rule' ),
+                              '_alternation_1_of_production_1_of_rule_field_size' => bless( {
+                                                                                              'impcount' => 0,
+                                                                                              'calls' => [
+                                                                                                           'row_col',
+                                                                                                           'size'
+                                                                                                         ],
+                                                                                              'changed' => 0,
+                                                                                              'opcount' => 0,
+                                                                                              'prods' => [
+                                                                                                           bless( {
+                                                                                                                    'number' => '0',
+                                                                                                                    'strcount' => 0,
+                                                                                                                    'dircount' => 0,
+                                                                                                                    'uncommit' => undef,
+                                                                                                                    'error' => undef,
+                                                                                                                    'patcount' => 0,
+                                                                                                                    'actcount' => 0,
+                                                                                                                    'items' => [
+                                                                                                                                 bless( {
+                                                                                                                                          'subrule' => 'row_col',
+                                                                                                                                          'matchrule' => 0,
+                                                                                                                                          'implicit' => undef,
+                                                                                                                                          'argcode' => undef,
+                                                                                                                                          'lookahead' => 0,
+                                                                                                                                          'line' => 100
+                                                                                                                                        }, 'Parse::RecDescent::Subrule' )
+                                                                                                                               ],
+                                                                                                                    'line' => undef
+                                                                                                                  }, 'Parse::RecDescent::Production' ),
+                                                                                                           bless( {
+                                                                                                                    'number' => '1',
+                                                                                                                    'strcount' => 0,
+                                                                                                                    'dircount' => 0,
+                                                                                                                    'uncommit' => undef,
+                                                                                                                    'error' => undef,
+                                                                                                                    'patcount' => 0,
+                                                                                                                    'actcount' => 0,
+                                                                                                                    'items' => [
+                                                                                                                                 bless( {
+                                                                                                                                          'subrule' => 'size',
+                                                                                                                                          'matchrule' => 0,
+                                                                                                                                          'implicit' => undef,
+                                                                                                                                          'argcode' => undef,
+                                                                                                                                          'lookahead' => 0,
+                                                                                                                                          'line' => 100
+                                                                                                                                        }, 'Parse::RecDescent::Subrule' )
+                                                                                                                               ],
+                                                                                                                    'line' => 100
+                                                                                                                  }, 'Parse::RecDescent::Production' )
+                                                                                                         ],
+                                                                                              'name' => '_alternation_1_of_production_1_of_rule_field_size',
+                                                                                              'vars' => '',
+                                                                                              'line' => 100
+                                                                                            }, 'Parse::RecDescent::Rule' ),
+                              'name' => bless( {
+                                                 'impcount' => 0,
+                                                 'calls' => [
+                                                              'identifier'
+                                                            ],
+                                                 'changed' => 0,
+                                                 'opcount' => 0,
+                                                 'prods' => [
+                                                              bless( {
+                                                                       'number' => '0',
+                                                                       'strcount' => 0,
+                                                                       'dircount' => 0,
+                                                                       'uncommit' => undef,
+                                                                       'error' => undef,
+                                                                       'patcount' => 0,
+                                                                       'actcount' => 0,
+                                                                       'items' => [
+                                                                                    bless( {
+                                                                                             'subrule' => 'identifier',
+                                                                                             'matchrule' => 0,
+                                                                                             'implicit' => undef,
+                                                                                             'argcode' => undef,
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 63
+                                                                                           }, 'Parse::RecDescent::Subrule' )
+                                                                                  ],
+                                                                       'line' => undef
+                                                                     }, 'Parse::RecDescent::Production' )
+                                                            ],
+                                                 'name' => 'name',
+                                                 'vars' => '',
+                                                 'line' => 63
+                                               }, 'Parse::RecDescent::Rule' ),
+                              'display_text' => bless( {
+                                                         'impcount' => 0,
+                                                         'calls' => [],
+                                                         'changed' => 0,
+                                                         'opcount' => 0,
+                                                         'prods' => [
+                                                                      bless( {
+                                                                               'number' => '0',
+                                                                               'strcount' => 2,
+                                                                               'dircount' => 0,
+                                                                               'uncommit' => undef,
+                                                                               'error' => undef,
+                                                                               'patcount' => 1,
+                                                                               'actcount' => 1,
+                                                                               'items' => [
+                                                                                            bless( {
+                                                                                                     'pattern' => '[',
+                                                                                                     'hashname' => '__STRING1__',
+                                                                                                     'description' => '\'[\'',
+                                                                                                     'lookahead' => 0,
+                                                                                                     'line' => 92
+                                                                                                   }, 'Parse::RecDescent::Literal' ),
+                                                                                            bless( {
+                                                                                                     'pattern' => '[^\\]]+',
+                                                                                                     'hashname' => '__PATTERN1__',
+                                                                                                     'description' => '/[^\\\\]]+/i',
+                                                                                                     'lookahead' => 0,
+                                                                                                     'rdelim' => '/',
+                                                                                                     'line' => 92,
+                                                                                                     'mod' => 'i',
+                                                                                                     'ldelim' => '/'
+                                                                                                   }, 'Parse::RecDescent::Token' ),
+                                                                                            bless( {
+                                                                                                     'pattern' => ']',
+                                                                                                     'hashname' => '__STRING2__',
+                                                                                                     'description' => '\']\'',
+                                                                                                     'lookahead' => 0,
+                                                                                                     'line' => 92
+                                                                                                   }, 'Parse::RecDescent::Literal' ),
+                                                                                            bless( {
+                                                                                                     'hashname' => '__ACTION1__',
+                                                                                                     'lookahead' => 0,
+                                                                                                     'line' => 92,
+                                                                                                     'code' => '{ $item[2] }'
+                                                                                                   }, 'Parse::RecDescent::Action' )
+                                                                                          ],
+                                                                               'line' => undef
+                                                                             }, 'Parse::RecDescent::Production' )
+                                                                    ],
+                                                         'name' => 'display_text',
+                                                         'vars' => '',
+                                                         'line' => 92
+                                                       }, 'Parse::RecDescent::Rule' ),
+                              'default' => bless( {
+                                                    'impcount' => 0,
+                                                    'calls' => [],
+                                                    'changed' => 0,
+                                                    'opcount' => 0,
+                                                    'prods' => [
+                                                                 bless( {
+                                                                          'number' => '0',
+                                                                          'strcount' => 1,
+                                                                          'dircount' => 0,
+                                                                          'uncommit' => undef,
+                                                                          'error' => undef,
+                                                                          'patcount' => 1,
+                                                                          'actcount' => 0,
+                                                                          'items' => [
+                                                                                       bless( {
+                                                                                                'pattern' => '=',
+                                                                                                'hashname' => '__STRING1__',
+                                                                                                'description' => '\'=\'',
+                                                                                                'lookahead' => 0,
+                                                                                                'line' => 79
+                                                                                              }, 'Parse::RecDescent::Literal' ),
+                                                                                       bless( {
+                                                                                                'pattern' => '[^\\@\\{\\s]+',
+                                                                                                'hashname' => '__PATTERN1__',
+                                                                                                'description' => '/[^\\\\@\\\\\\{\\\\s]+/',
+                                                                                                'lookahead' => 0,
+                                                                                                'rdelim' => '/',
+                                                                                                'line' => 79,
+                                                                                                'mod' => '',
+                                                                                                'ldelim' => '/'
+                                                                                              }, 'Parse::RecDescent::Token' )
+                                                                                     ],
+                                                                          'line' => undef
+                                                                        }, 'Parse::RecDescent::Production' )
+                                                               ],
+                                                    'name' => 'default',
+                                                    'vars' => '',
+                                                    'line' => 79
+                                                  }, 'Parse::RecDescent::Rule' ),
+                              'form_spec' => bless( {
+                                                      'impcount' => 1,
+                                                      'calls' => [
+                                                                   '_alternation_1_of_production_1_of_rule_form_spec'
+                                                                 ],
+                                                      'changed' => 0,
+                                                      'opcount' => 0,
+                                                      'prods' => [
+                                                                   bless( {
+                                                                            'number' => '0',
+                                                                            'strcount' => 0,
+                                                                            'dircount' => 0,
+                                                                            'uncommit' => undef,
+                                                                            'error' => undef,
+                                                                            'patcount' => 0,
+                                                                            'actcount' => 1,
+                                                                            'items' => [
+                                                                                         bless( {
+                                                                                                  'subrule' => '_alternation_1_of_production_1_of_rule_form_spec',
+                                                                                                  'expected' => 'list_def, or line',
+                                                                                                  'min' => 1,
+                                                                                                  'argcode' => undef,
+                                                                                                  'max' => 100000000,
+                                                                                                  'matchrule' => 0,
+                                                                                                  'repspec' => 's',
+                                                                                                  'lookahead' => 0,
+                                                                                                  'line' => 3
+                                                                                                }, 'Parse::RecDescent::Repetition' ),
+                                                                                         bless( {
+                                                                                                  'hashname' => '__ACTION1__',
+                                                                                                  'lookahead' => 0,
+                                                                                                  'line' => 4,
+                                                                                                  'code' => '{
+	$return = {
+	    title    => $title,
+	    author   => $author,
+	    lists    => \\%lists, 
+	    patterns => \\%patterns, 
+	    fields   => \\@fields,
+	}
+    }'
+                                                                                                }, 'Parse::RecDescent::Action' )
+                                                                                       ],
+                                                                            'line' => undef
+                                                                          }, 'Parse::RecDescent::Production' )
+                                                                 ],
+                                                      'name' => 'form_spec',
+                                                      'vars' => '',
+                                                      'line' => 3
+                                                    }, 'Parse::RecDescent::Rule' ),
+                              'pattern' => bless( {
+                                                    'impcount' => 0,
+                                                    'calls' => [],
+                                                    'changed' => 0,
+                                                    'opcount' => 0,
+                                                    'prods' => [
+                                                                 bless( {
+                                                                          'number' => '0',
+                                                                          'strcount' => 0,
+                                                                          'dircount' => 0,
+                                                                          'uncommit' => undef,
+                                                                          'error' => undef,
+                                                                          'patcount' => 1,
+                                                                          'actcount' => 0,
+                                                                          'items' => [
+                                                                                       bless( {
+                                                                                                'pattern' => '.*',
+                                                                                                'hashname' => '__PATTERN1__',
+                                                                                                'description' => '/.*/',
+                                                                                                'lookahead' => 0,
+                                                                                                'rdelim' => '/',
+                                                                                                'line' => 32,
+                                                                                                'mod' => '',
+                                                                                                'ldelim' => '/'
+                                                                                              }, 'Parse::RecDescent::Token' )
+                                                                                     ],
+                                                                          'line' => undef
+                                                                        }, 'Parse::RecDescent::Production' )
+                                                               ],
+                                                    'name' => 'pattern',
+                                                    'vars' => '',
+                                                    'line' => 32
+                                                  }, 'Parse::RecDescent::Rule' ),
+                              'comment' => bless( {
+                                                    'impcount' => 0,
+                                                    'calls' => [],
+                                                    'changed' => 0,
+                                                    'opcount' => 0,
+                                                    'prods' => [
+                                                                 bless( {
+                                                                          'number' => '0',
+                                                                          'strcount' => 1,
+                                                                          'dircount' => 0,
+                                                                          'uncommit' => undef,
+                                                                          'error' => undef,
+                                                                          'patcount' => 1,
+                                                                          'actcount' => 0,
+                                                                          'items' => [
+                                                                                       bless( {
+                                                                                                'pattern' => '#',
+                                                                                                'hashname' => '__STRING1__',
+                                                                                                'description' => '\'#\'',
+                                                                                                'lookahead' => 0,
+                                                                                                'line' => 96
+                                                                                              }, 'Parse::RecDescent::Literal' ),
+                                                                                       bless( {
+                                                                                                'pattern' => '.*',
+                                                                                                'hashname' => '__PATTERN1__',
+                                                                                                'description' => '/.*/',
+                                                                                                'lookahead' => 0,
+                                                                                                'rdelim' => '/',
+                                                                                                'line' => 96,
+                                                                                                'mod' => '',
+                                                                                                'ldelim' => '/'
+                                                                                              }, 'Parse::RecDescent::Token' )
+                                                                                     ],
+                                                                          'line' => undef
+                                                                        }, 'Parse::RecDescent::Production' )
+                                                               ],
+                                                    'name' => 'comment',
+                                                    'vars' => '',
+                                                    'line' => 96
+                                                  }, 'Parse::RecDescent::Rule' ),
+                              'hint' => bless( {
+                                                 'impcount' => 0,
+                                                 'calls' => [],
+                                                 'changed' => 0,
+                                                 'opcount' => 0,
+                                                 'prods' => [
+                                                              bless( {
+                                                                       'number' => '0',
+                                                                       'strcount' => 2,
+                                                                       'dircount' => 0,
+                                                                       'uncommit' => undef,
+                                                                       'error' => undef,
+                                                                       'patcount' => 1,
+                                                                       'actcount' => 1,
+                                                                       'items' => [
+                                                                                    bless( {
+                                                                                             'pattern' => '[',
+                                                                                             'hashname' => '__STRING1__',
+                                                                                             'description' => '\'[\'',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 75
+                                                                                           }, 'Parse::RecDescent::Literal' ),
+                                                                                    bless( {
+                                                                                             'pattern' => '[^\\]]+',
+                                                                                             'hashname' => '__PATTERN1__',
+                                                                                             'description' => '/[^\\\\]]+/',
+                                                                                             'lookahead' => 0,
+                                                                                             'rdelim' => '/',
+                                                                                             'line' => 75,
+                                                                                             'mod' => '',
+                                                                                             'ldelim' => '/'
+                                                                                           }, 'Parse::RecDescent::Token' ),
+                                                                                    bless( {
+                                                                                             'pattern' => ']',
+                                                                                             'hashname' => '__STRING2__',
+                                                                                             'description' => '\']\'',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 75
+                                                                                           }, 'Parse::RecDescent::Literal' ),
+                                                                                    bless( {
+                                                                                             'hashname' => '__ACTION1__',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 75,
+                                                                                             'code' => '{ $item[2] }'
+                                                                                           }, 'Parse::RecDescent::Action' )
+                                                                                  ],
+                                                                       'line' => undef
+                                                                     }, 'Parse::RecDescent::Production' )
+                                                            ],
+                                                 'name' => 'hint',
+                                                 'vars' => '',
+                                                 'line' => 75
+                                               }, 'Parse::RecDescent::Rule' ),
+                              'type' => bless( {
+                                                 'impcount' => 0,
+                                                 'calls' => [],
+                                                 'changed' => 0,
+                                                 'opcount' => 0,
+                                                 'prods' => [
+                                                              bless( {
+                                                                       'number' => '0',
+                                                                       'strcount' => 1,
+                                                                       'dircount' => 0,
+                                                                       'uncommit' => undef,
+                                                                       'error' => undef,
+                                                                       'patcount' => 1,
+                                                                       'actcount' => 0,
+                                                                       'items' => [
+                                                                                    bless( {
+                                                                                             'pattern' => ':',
+                                                                                             'hashname' => '__STRING1__',
+                                                                                             'description' => '\':\'',
+                                                                                             'lookahead' => 0,
+                                                                                             'line' => 77
+                                                                                           }, 'Parse::RecDescent::Literal' ),
+                                                                                    bless( {
+                                                                                             'pattern' => 'textarea|text|password|file|checkbox|radio|select|hidden|static',
+                                                                                             'hashname' => '__PATTERN1__',
+                                                                                             'description' => '/textarea|text|password|file|checkbox|radio|select|hidden|static/',
+                                                                                             'lookahead' => 0,
+                                                                                             'rdelim' => '/',
+                                                                                             'line' => 77,
+                                                                                             'mod' => '',
+                                                                                             'ldelim' => '/'
+                                                                                           }, 'Parse::RecDescent::Token' )
+                                                                                  ],
+                                                                       'line' => undef
+                                                                     }, 'Parse::RecDescent::Production' )
+                                                            ],
+                                                 'name' => 'type',
+                                                 'vars' => '',
+                                                 'line' => 77
+                                               }, 'Parse::RecDescent::Rule' ),
+                              'title' => bless( {
+                                                  'impcount' => 0,
+                                                  'calls' => [],
+                                                  'changed' => 0,
+                                                  'opcount' => 0,
+                                                  'prods' => [
+                                                               bless( {
+                                                                        'number' => '0',
+                                                                        'strcount' => 1,
+                                                                        'dircount' => 0,
+                                                                        'uncommit' => undef,
+                                                                        'error' => undef,
+                                                                        'patcount' => 1,
+                                                                        'actcount' => 1,
+                                                                        'items' => [
+                                                                                     bless( {
+                                                                                              'pattern' => '!title',
+                                                                                              'hashname' => '__STRING1__',
+                                                                                              'description' => '\'!title\'',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 21
+                                                                                            }, 'Parse::RecDescent::Literal' ),
+                                                                                     bless( {
+                                                                                              'pattern' => '.*',
+                                                                                              'hashname' => '__PATTERN1__',
+                                                                                              'description' => '/.*/',
+                                                                                              'lookahead' => 0,
+                                                                                              'rdelim' => '/',
+                                                                                              'line' => 21,
+                                                                                              'mod' => '',
+                                                                                              'ldelim' => '/'
+                                                                                            }, 'Parse::RecDescent::Token' ),
+                                                                                     bless( {
+                                                                                              'hashname' => '__ACTION1__',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 22,
+                                                                                              'code' => '{ warn "[Text::Formbuilder] Title redefined at input text line $thisline\\n" if defined $title;
+    $title = $item[2] }'
+                                                                                            }, 'Parse::RecDescent::Action' )
+                                                                                   ],
+                                                                        'line' => undef
+                                                                      }, 'Parse::RecDescent::Production' )
+                                                             ],
+                                                  'name' => 'title',
+                                                  'vars' => '',
+                                                  'line' => 21
+                                                }, 'Parse::RecDescent::Rule' ),
+                              'label' => bless( {
+                                                  'impcount' => 0,
+                                                  'calls' => [],
+                                                  'changed' => 0,
+                                                  'opcount' => 0,
+                                                  'prods' => [
+                                                               bless( {
+                                                                        'number' => '0',
+                                                                        'strcount' => 1,
+                                                                        'dircount' => 0,
+                                                                        'uncommit' => undef,
+                                                                        'error' => undef,
+                                                                        'patcount' => 1,
+                                                                        'actcount' => 0,
+                                                                        'items' => [
+                                                                                     bless( {
+                                                                                              'pattern' => '|',
+                                                                                              'hashname' => '__STRING1__',
+                                                                                              'description' => '\'|\'',
+                                                                                              'lookahead' => 0,
+                                                                                              'line' => 73
+                                                                                            }, 'Parse::RecDescent::Literal' ),
+                                                                                     bless( {
+                                                                                              'pattern' => '[^:\\[\\{\\/]+',
+                                                                                              'hashname' => '__PATTERN1__',
+                                                                                              'description' => '/[^:\\\\[\\\\\\{\\\\/]+/i',
+                                                                                              'lookahead' => 0,
+                                                                                              'rdelim' => '/',
+                                                                                              'line' => 73,
+                                                                                              'mod' => 'i',
+                                                                                              'ldelim' => '/'
+                                                                                            }, 'Parse::RecDescent::Token' )
+                                                                                   ],
+                                                                        'line' => undef
+                                                                      }, 'Parse::RecDescent::Production' )
+                                                             ],
+                                                  'name' => 'label',
+                                                  'vars' => '',
+                                                  'line' => 73
+                                                }, 'Parse::RecDescent::Rule' ),
+                              'pattern_def' => bless( {
+                                                        'impcount' => 0,
+                                                        'calls' => [
+                                                                     'pattern_name',
+                                                                     'pattern'
+                                                                   ],
+                                                        'changed' => 0,
+                                                        'opcount' => 0,
+                                                        'prods' => [
+                                                                     bless( {
+                                                                              'number' => '0',
+                                                                              'strcount' => 1,
+                                                                              'dircount' => 0,
+                                                                              'uncommit' => undef,
+                                                                              'error' => undef,
+                                                                              'patcount' => 0,
+                                                                              'actcount' => 1,
+                                                                              'items' => [
+                                                                                           bless( {
+                                                                                                    'pattern' => '!pattern',
+                                                                                                    'hashname' => '__STRING1__',
+                                                                                                    'description' => '\'!pattern\'',
+                                                                                                    'lookahead' => 0,
+                                                                                                    'line' => 28
+                                                                                                  }, 'Parse::RecDescent::Literal' ),
+                                                                                           bless( {
+                                                                                                    'subrule' => 'pattern_name',
+                                                                                                    'matchrule' => 0,
+                                                                                                    'implicit' => undef,
+                                                                                                    'argcode' => undef,
+                                                                                                    'lookahead' => 0,
+                                                                                                    'line' => 28
+                                                                                                  }, 'Parse::RecDescent::Subrule' ),
+                                                                                           bless( {
+                                                                                                    'subrule' => 'pattern',
+                                                                                                    'matchrule' => 0,
+                                                                                                    'implicit' => undef,
+                                                                                                    'argcode' => undef,
+                                                                                                    'lookahead' => 0,
+                                                                                                    'line' => 28
+                                                                                                  }, 'Parse::RecDescent::Subrule' ),
+                                                                                           bless( {
+                                                                                                    'hashname' => '__ACTION1__',
+                                                                                                    'lookahead' => 0,
+                                                                                                    'line' => 29,
+                                                                                                    'code' => '{ $patterns{$item{pattern_name}} = $item{pattern} }'
+                                                                                                  }, 'Parse::RecDescent::Action' )
+                                                                                         ],
+                                                                              'line' => undef
+                                                                            }, 'Parse::RecDescent::Production' )
+                                                                   ],
+                                                        'name' => 'pattern_def',
+                                                        'vars' => '',
+                                                        'line' => 28
+                                                      }, 'Parse::RecDescent::Rule' )
+                            }
+               }, 'Parse::RecDescent' );
+}
Index: trunk/lib/Text/FormBuilder/Parser.pm.PL
===================================================================
--- trunk/lib/Text/FormBuilder/Parser.pm.PL	(revision 97)
+++ 	(revision )
@@ -1,11 +1,0 @@
-#!/usr/bin/perl -w
-use strict;
-
-# pre-compile the parser from the grammar
-use Parse::RecDescent;
-
-(my $directory = shift) =~ s/Parser\.pm//;
-
-chdir $directory;
-open my $fh, '<', 'grammar';
-Parse::RecDescent->Precompile(join('', <$fh>), 'Text::FormBuilder::Parser');
Index: trunk/lib/Text/FormBuilder/grammar
===================================================================
--- trunk/lib/Text/FormBuilder/grammar	(revision 97)
+++ trunk/lib/Text/FormBuilder/grammar	(revision 1)
@@ -1,212 +1,45 @@
-# line directives
-# block directives
-# field lines
-# comments
+{ my ($title, $author, %lists, %patterns, @fields, $type, @options, $list_var, $size, $rows, $cols); }
 
-{
-    #$::RD_TRACE = 1;
-    my (
-	@sections,     # master data structure
-	$section_head,
-	$section_id,
-	@lines,        # lines in each section
-	%lists,
-	%patterns,
-	%subs,         # validation subs
-	@group,        # current group
-	%groups,       # stored groups of fields
-	$type,
-	@options,
-	$required,
-	$multiple,
-	$list_var,
-	$size,
-	$maxlength,
-	$rows,
-	$cols,
-	@submit,
-    );
-    my $context = 'line';	# start in line context by default
-    my %formspec;
-    
-    # TODO: helper sub?
-    sub alert ($) {
-	warn '[' . (split(/::/, (caller(1))[3]))[-1] . '] ' . shift() . "\n";
-    }
-}
-
-form_spec:
+form_spec: (list_def | line)(s) 
     {
-	# clear out old data, so we don't end up with old data in new objects
-	@lines    = ();
-	@sections = ();
-	%formspec = ();
-    }
-    (list_def | description_def | group_def | note | fb_params | unknown_block_directive | line)(s)
-    {
-	# grab the last section, if there is any
-	if (@lines) {
-	    push @sections,
-		{
-		    id   => $section_id,
-		    head => $section_head,
-		    lines => [ @lines ],
-		};
-	}
-	
-	# make copies instead of taking references, again so we
-	# don't end up with connections between objects
 	$return = {
-	    fb_params   => $formspec{fb_params},
-	    title       => $formspec{title},
-	    author      => $formspec{author},
-	    description => $formspec{description},
-	    lists       => { %lists },
-	    patterns    => { %patterns },
-	    subs        => { %subs },
-	    groups      => { %groups },
-	    sections    => [ @sections ],
-	    ( @submit ? (submit => @submit == 1 ? $submit[0] : [ @submit ]) : () ),
-	    reset       => $formspec{reset},
+	    title    => $title,
+	    author   => $author,
+	    lists    => \%lists, 
+	    patterns => \%patterns, 
+	    fields   => \@fields,
 	}
     }
 
-list_def: '!list' var_name (static_list | dynamic_list)
-    { $lists{$item{var_name}} = [ @options ]; @options = () }
+list_def: '!list' list_name '{' option(s /,\s*/) /,?/ '}'
+    { $lists{$item{list_name}} = [ @options ]; @options = () }
 
-static_list: '{' /\s*/ option(s /\s*,\s*/) /,?/ /\s*/ '}'
+list_name: /[A-Z_]+/
 
-dynamic_list: '&' <perl_codeblock>
-    { warn "[Text::FormBuilder] Dynamic lists have been removed from the formspec grammar"; }
-
-description_def: '!description' block
-    {
-	warn "[Text::FormBuilder] Description redefined at input text line $thisline\n" if defined $formspec{description};
-	$formspec{description} = $item{block};
-    }
-
-group_def: '!group' { $context = 'group' } var_name '{' field_line(s) '}' { $context = 'line' }
-    { 
-	#warn "$item{var_name} group; context $context\n"
-	$groups{$item{var_name}} = [ @group ];
-	@group = ();
-    }
-
-note: '!note' block  { push @lines, [ 'note', $item{block} ]; }
-
-
-# curly-brace delimited block, that can contain properly
-# nested curly braces, along with any other characters
-# inner blocks return with the '{...}' so that nested
-# blocks get the braces treated as literals
-block: '{' <skip:''> block_content(s) '}' { join('', @{ $item[3] }) }
-inner_block: '{' <skip:''> block_content(s) '}'  { '{' . join('', @{ $item[3] }) . '}' }
-block_content: /[^\{\}]+?/ | inner_block
-
-# square brace delimited block, that can contain properly
-# nested square brackets, along with any other characters
-# inner bracket blocks return with the '[...]' so that nested
-# blocks get the braces treated as literals
-bracket_block: '[' <skip:''> bracket_block_content(s) ']' { join('', @{ $item[3] }) }
-inner_bracket_block: '[' <skip:''> bracket_block_content(s) ']' { '[' . join('', @{ $item[3] }) . ']'; }
-bracket_block_content: /[^\[\]]+?/ | inner_bracket_block
-
-
-# field lines are the subset of lines that are allowed in a !group directive
-field_line: <skip:'[ \t]*'> ( field | comment | blank ) "\n"
-
-line: <skip:'[ \t]*'> ( title | author | pattern_def | section_head | heading | submit | reset | group_field | field_group | unknown_directive | field | comment | blank ) /\n+/
+line: <skip:'[ \t]*'> ( title | author | pattern_def | field | comment | blank ) "\n"
 
 title: '!title' /.*/
-    {
-	warn "[Text::FormBuilder] Title redefined at input text line $thisline\n" if defined $formspec{title};
-	$formspec{title} = $item[2];
-    }
+    { warn "[Text::Formbuilder] Title redefined at input text line $thisline\n" if defined $title;
+    $title = $item[2] }
 
 author: '!author' /.*/
-    {
-	warn "[Text::FormBuilder] Author redefined at input text line $thisline\n" if defined $formspec{author};
-	$formspec{author} = $item[2];
-    }
+    { $author = $item[2] }
 
-pattern_def: '!pattern' var_name pattern
-    { $patterns{$item{var_name}} = $item{pattern} }
+pattern_def: '!pattern' pattern_name pattern
+    { $patterns{$item{pattern_name}} = $item{pattern} }
 
+pattern_name: /[A-Z_]+/
 pattern: /.*/
 
-section_head: '!section' identifier /.*/
+field: name field_size(?) label(?) hint(?) type(?) default(?) option_list(?) validate(?)
     {
-	#warn "starting section $item{identifier}\n";
-	#warn "  with heading $item[3]\n" if $item[3];
-	
-	if (@lines) {
-	    push @sections,
-		{
-		    id   => $section_id,
-		    head => $section_head,
-		    lines => [ @lines ],
-		};
-	}
-	
-	$section_id = $item{identifier};
-	$section_head = $item[3];
-	@lines = ();
-    }
-
-heading: '!head' /.*/    { push @lines, [ 'head', $item[2] ] }
-
-submit: '!submit' string(s /\s*,\s*/)
-    {
-	#warn scalar(@{ $item[2] }) . ' submit button(s)';
-	push @submit, @{ $item[2] };
-    }
-
-reset: '!reset' string
-    {
-	warn "[Text::FormBuilder] Reset button redefined at input text line $thisline\n" if defined $formspec{reset};
-	$formspec{reset} = $item{string};
-    }
-
-group_field: '!field' group_name name label(?)
-    {
-	warn "WARNING line $thisline: The '!field' directive has been DEPRECATED. Use the 'name:GROUP' style instead.\n";
-	push @lines, [ 'group', { name => $item{name}, label => $item{'label(?)'}[0], group => $item{group_name} } ];
-    }
-
-group_name: /%[A-Z_]+/
-
-# parameters that get passed to the FB constructor; these are serialized in YAML
-fb_params: '!fb' block
-    { $formspec{fb_params} .= $item{block}; }
-
-field_group: name label(?) hint(?) group_type comment(?)
-    {
-	#warn "[$thisline] comment = $item{'hint(?)'}[0]\n" if $item{'hint(?)'}[0];
-	#warn "[$thisline] field $item{name} is $item{group_type}\n";
-	push @lines, [ 'group', {
-	    name    => $item{name},
-	    label   => $item{'label(?)'}[0],
-	    comment => $item{'hint(?)'}[0],
-	    group   => $item{group_type},
-	} ];
-    }
-
-group_type: ':' var_name
-
-# this is the real heart of the thing
-field: name field_size(?) growable(?) label(?) hint(?) type(?) multi(?) other(?) default(?) option_list(?) validate(?) comment(?)
-    {	
 	my $field = {
 	    name     => $item{name},
-	    growable => $item{'growable(?)'}[0],
 	    label    => $item{'label(?)'}[0],
 	    comment  => $item{'hint(?)'}[0],
-	    multiple => $item{'multi(?)'}[0],
 	    type     => $item{'type(?)'}[0],
-	    other    => $item{'other(?)'}[0],
 	    value    => $item{'default(?)'}[0],
-	    list     => $list_var,
-	    validate => $item{'validate(?)'}[0],
-	    required => $required,
+            list     => $list_var,
+            validate => $item{'validate(?)'}[0],
 	};
 	
@@ -216,89 +49,48 @@
 	$$field{cols} = $cols if defined $cols;
 	$$field{size} = $size if defined $size;
-	$$field{maxlength} = $maxlength if defined $maxlength;
 	
-	#warn "[$thisline] field $item{name}; context $context\n";
-	if ($context eq 'group') {
-	    push @group, $field;
-	} else {
-	    push @lines, [ 'field', $field ];
-	}
+	push @fields, $field;
 	
 	$type = undef;
-	$required = undef;
-	$multiple = undef;
 	$list_var = undef;
 	$size = undef;
 	$rows = undef;
 	$cols = undef;
-	$maxlength = undef;
 	@options = ();
-	
-	#warn "$$field{name}: $field";
-	
-	$field;
+        
     }
     
 name: identifier
 
-var_name: /[A-Z_]+/
-
 field_size: '[' ( row_col | size ) ']'
 
-size: /\d+/ bang(?)
-    { $maxlength = $item[1] if $item[2][0]; $size = $item[1] }
-
-bang: '!'
+size: /\d+/
+    { $size = $item[1] }
 
 row_col: /\d+/ /,\s*/ /\d+/
     { $rows = $item[1]; $cols = $item[3] }
 
-growable: '*' limit(?) { $item{'limit(?)'}[0] || 1 }
+label: '|' /[^:\[\{\/]+/i
 
-limit: /\d+/
+hint: '[' /[^\]]+/ ']'    { $item[2] }
 
-label: '|' string { $item[2] }
+type: ':' /textarea|text|password|file|checkbox|radio|select|hidden|static/
 
-hint: bracket_block
-
-type: ':' builtin_field
-
-builtin_field: /textarea|text|password|file|checkbox|radio|select|hidden|static/
-
-multi: '*' { 1 }
-
-other: '+' 'other' { 1 }
-
-default: '=' string { $item[2] }
-
-string: simple_multiword | quoted_string
-
-# for simple multiword values not involving punctuation
-simple_multiword: /\w/ <skip:''> /[\w\t ]*/ { $item[1] . $item[3] }
-
-# my attempt at a single-quoted, non-interpolating string
-# where the backslash can escape literal single quotes
-quoted_string: "'" <skip:''> /(\\'|[^'])*/ "'"
-    { $item[3] =~ s/\\'/'/g; $item[3] }
+default: '=' /[^\@\{\s]+/
 
 option_list: options | list_var
     
-options: '{' option(s /\s*,\s*/) '}'
+options: '{' option(s /,\s*/) '}'
 
 list_var: /@[A-Z_]+/ { $list_var = $item[1] }
 
-option: string display_text(?)
-    { push @options, { $item[1] => $item{'display_text(?)'}[0] } }
+option: value display_text(?)
+    { push @options, { $item{value} => $item{'display_text(?)'}[0] } }
 
 value: identifier
 
-display_text: bracket_block
+display_text: '[' /[^\]]+/i ']'    { $item[2] }
 
-
-validate: '//' (optional_pattern | required_pattern)
-
-optional_pattern: var_name '?'	{ $required = 0; $item[1] }
-
-required_pattern: var_name { $required = 1; $item[1] }
+validate: '//' value
 
 comment: '#' /.*/
@@ -306,9 +98,2 @@
 
 identifier: /\w+/
-
-# skip unknown directives with a warning
-unknown_directive: /\!\S*/ /.*/
-    { warn "[Text::Formbuilder] Skipping unknown directive '$item[1]' at input text line $thisline\n"; }
-
-unknown_block_directive: /\!\S*/ var_name(?) block
-    { warn "[Text::Formbuilder] Skipping unknown block directive '$item[1]' at input text line $thisline\n"; }
Index: trunk/lib/Text/pod2htmd.tmp
===================================================================
--- trunk/lib/Text/pod2htmd.tmp	(revision 1)
+++ trunk/lib/Text/pod2htmd.tmp	(revision 1)
@@ -0,0 +1,2 @@
+
+.
Index: trunk/lib/Text/pod2htmi.tmp
===================================================================
--- trunk/lib/Text/pod2htmi.tmp	(revision 1)
+++ trunk/lib/Text/pod2htmi.tmp	(revision 1)
@@ -0,0 +1,2 @@
+
+.
