Index: trunk/lib/Text/FormBuilder/grammar
===================================================================
--- trunk/lib/Text/FormBuilder/grammar	(revision 14)
+++ trunk/lib/Text/FormBuilder/grammar	(revision 16)
@@ -14,6 +14,6 @@
     }
 
-list_def: '!list' list_name (static_list | dynamic_list)
-    { $lists{$item{list_name}} = [ @options ]; @options = () }
+list_def: '!list' var_name (static_list | dynamic_list)
+    { $lists{$item{var_name}} = [ @options ]; @options = () }
 
 static_list: '{' option(s /,\s*/) /,?/ '}'
@@ -29,6 +29,4 @@
     }
 
-list_name: /[A-Z_]+/
-
 description_def: '!description' <perl_codeblock>
     { warn "[Text::FormBuilder] Description redefined at input text line $thisline\n" if defined $description;
@@ -38,5 +36,5 @@
     }
 
-line: <skip:'[ \t]*'> ( title | author | pattern_def | heading | field | comment | blank ) "\n"
+line: <skip:'[ \t]*'> ( title | author | pattern_def | heading | unknown_directive | field | comment | blank ) "\n"
 
 title: '!title' /.*/
@@ -47,8 +45,7 @@
     { $author = $item[2] }
 
-pattern_def: '!pattern' pattern_name pattern
-    { $patterns{$item{pattern_name}} = $item{pattern} }
+pattern_def: '!pattern' var_name pattern
+    { $patterns{$item{var_name}} = $item{pattern} }
 
-pattern_name: /[A-Z_]+/
 pattern: /.*/
 
@@ -88,4 +85,6 @@
 name: identifier
 
+var_name: /[A-Z_]+/
+
 field_size: '[' ( row_col | size ) ']'
 
@@ -123,2 +122,6 @@
 
 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"; }
