{ my ($title, $author, %lists, %patterns, @fields, $type, @options, $list_var, $size, $rows, $cols); } form_spec: (list_def | line)(s) { $return = { title => $title, author => $author, lists => \%lists, patterns => \%patterns, fields => \@fields, } } list_def: '!list' list_name '{' option(s /,\s*/) /,?/ '}' { $lists{$item{list_name}} = [ @options ]; @options = () } list_name: /[A-Z_]+/ line: ( title | author | pattern_def | field | comment | blank ) "\n" title: '!title' /.*/ { warn "[Text::Formbuilder] Title redefined at input text line $thisline\n" if defined $title; $title = $item[2] } author: '!author' /.*/ { $author = $item[2] } pattern_def: '!pattern' pattern_name pattern { $patterns{$item{pattern_name}} = $item{pattern} } pattern_name: /[A-Z_]+/ pattern: /.*/ field: name field_size(?) label(?) hint(?) type(?) default(?) option_list(?) validate(?) { 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 = (); } name: identifier field_size: '[' ( row_col | size ) ']' size: /\d+/ { $size = $item[1] } row_col: /\d+/ /,\s*/ /\d+/ { $rows = $item[1]; $cols = $item[3] } label: '|' /[^:\[\{\/]+/i hint: '[' /[^\]]+/ ']' { $item[2] } type: ':' /textarea|text|password|file|checkbox|radio|select|hidden|static/ default: '=' /[^\@\{\s]+/ option_list: options | list_var options: '{' option(s /,\s*/) '}' list_var: /@[A-Z_]+/ { $list_var = $item[1] } option: value display_text(?) { push @options, { $item{value} => $item{'display_text(?)'}[0] } } value: identifier display_text: '[' /[^\]]+/i ']' { $item[2] } validate: '//' value comment: '#' /.*/ blank: identifier: /\w+/