Merged revisions 87168 via svnmerge from
authorSteve Murphy <murf@digium.com>
Fri, 26 Oct 2007 17:39:39 +0000 (17:39 +0000)
committerSteve Murphy <murf@digium.com>
Fri, 26 Oct 2007 17:39:39 +0000 (17:39 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r87168 | murf | 2007-10-26 10:34:02 -0600 (Fri, 26 Oct 2007) | 1 line

closes issue #11086 where a user complains that references to following contexts report a problem; The problem was REALLy that he was referring to empty contexts, which were being ignored. Reporter stated that empty contexts should be OK. I checked it out against extensions.conf, and sure enough, empty contexts ARE ok. So, I removed the restriction from AEL. This, though, highlighted a problem with multiple contexts of the same name. This should be OK, also. So, I added the extend keyword to AEL, and it can preceed the 'context' keyword (mixed with 'abstract', if nec.). This will turn off the warnings in AEL if the same context name is used 2 or more times. Also, I now call ast_context_find_or_create for contexts now, instead of just ast_context_create; I did this because pbx_config does this. The 'extend' keyword thus becomes a statement of intent. AEL can now duplicate the behavior of pbx_config,
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@87187 65c4cc65-6c06-0410-ace0-fbb531ad65f3

12 files changed:
include/asterisk/pval.h
pbx/ael/ael-test/ref.ael-test16
pbx/ael/ael-test/ref.ael-test19
pbx/pbx_ael.c
res/ael/ael.flex
res/ael/ael.tab.c
res/ael/ael.tab.h
res/ael/ael.y
res/ael/ael_lex.c
res/ael/pval.c
utils/ael_main.c
utils/conf2ael.c

index 11d672d..edfd647 100644 (file)
@@ -77,10 +77,11 @@ struct pval
                char *for_inc; /* used in FOR */
                struct pval *else_statements; /* used in IF */
                struct pval *macro_statements; /* used in MACRO */
-               int abstract;  /* used for context */
+               int abstract;  /* used for context 1=abstract; 2=extend; 3=both */
                char *hints; /* used in EXTENSION */
                int goto_target_in_case; /* used in GOTO */
                struct ael_extension *compiled_label;
+               struct pval *extend; /* to link extended contexts to the 'original' */
        } u3;
        
        union
index ffa9260..9bbca8b 100644 (file)
@@ -2,13 +2,12 @@
 (If you find progress and other non-error messages irritating, you can use -q to suppress them)
 
 (You can use the -w option to dump extensions.conf format to extensions.conf.aeldump)
-LOG: lev:2 file:pbx_ael.c  line:113 func: pbx_load_module  Starting AEL load process.
-LOG: lev:2 file:pbx_ael.c  line:120 func: pbx_load_module  AEL load process: calculated config file name './extensions.ael'.
-LOG: lev:3 file:ael.y  line:205 func: ael_yyparse  ==== File: ./extensions.ael, Line 1, Cols: 19-19: Warning! The empty context real-small will be IGNORED!
-LOG: lev:2 file:pbx_ael.c  line:128 func: pbx_load_module  AEL load process: parsed config file name './extensions.ael'.
-LOG: lev:2 file:pbx_ael.c  line:131 func: pbx_load_module  AEL load process: checked config file name './extensions.ael'.
-LOG: lev:3 file:pval.c  line:3633 func: add_extensions  This file is Empty!
-LOG: lev:2 file:pbx_ael.c  line:133 func: pbx_load_module  AEL load process: compiled config file name './extensions.ael'.
-LOG: lev:2 file:pbx_ael.c  line:136 func: pbx_load_module  AEL load process: merged config file name './extensions.ael'.
-LOG: lev:2 file:pbx_ael.c  line:139 func: pbx_load_module  AEL load process: verified config file name './extensions.ael'.
-LOG: lev:4 file:ael2_parse  line:499 func: main  0 contexts, 0 extensions, 0 priorities
+LOG: lev:2 file:pbx_ael.c  line:913 func: pbx_load_module  Starting AEL load process.
+LOG: lev:2 file:pbx_ael.c  line:920 func: pbx_load_module  AEL load process: calculated config file name './extensions.ael'.
+LOG: lev:2 file:pbx_ael.c  line:928 func: pbx_load_module  AEL load process: parsed config file name './extensions.ael'.
+LOG: lev:2 file:pbx_ael.c  line:931 func: pbx_load_module  AEL load process: checked config file name './extensions.ael'.
+LOG: lev:3 file:pval.c  line:3784 func: add_extensions  This file is Empty!
+LOG: lev:2 file:pbx_ael.c  line:933 func: pbx_load_module  AEL load process: compiled config file name './extensions.ael'.
+LOG: lev:2 file:pbx_ael.c  line:936 func: pbx_load_module  AEL load process: merged config file name './extensions.ael'.
+LOG: lev:2 file:pbx_ael.c  line:939 func: pbx_load_module  AEL load process: verified config file name './extensions.ael'.
+LOG: lev:4 file:ael2_parse  line:543 func: main  1 contexts, 0 extensions, 0 priorities
index 27a322b..f0ab667 100644 (file)
@@ -5,7 +5,7 @@
 LOG: lev:2 file:pbx_ael.c  line:913 func: pbx_load_module  Starting AEL load process.
 LOG: lev:2 file:pbx_ael.c  line:920 func: pbx_load_module  AEL load process: calculated config file name './extensions.ael'.
 LOG: lev:2 file:pbx_ael.c  line:928 func: pbx_load_module  AEL load process: parsed config file name './extensions.ael'.
-LOG: lev:3 file:pval.c  line:2298 func: check_context_names  Warning: file ./extensions.ael, line 49-62: The context name (incoming) is also declared in file ./extensions.ael, line 62-69!
+LOG: lev:3 file:pval.c  line:2298 func: check_context_names  Warning: file ./extensions.ael, line 49-62: The context name (incoming) is also declared in file ./extensions.ael, line 62-69! (and neither is marked 'extend')
 LOG: lev:3 file:pval.c  line:670 func: check_macro_returns  Warning: file ./extensions.ael, line 71-175: The macro std-priv-exten does not end with a return; I will insert one.
 LOG: lev:3 file:pval.c  line:2282 func: check_switch_expr  Warning: file ./extensions.ael, line 245-246: A default case was automatically added to the switch.
 LOG: lev:3 file:pval.c  line:2424 func: check_pval_item  Warning: file ./extensions.ael, line 312-312: macro call to non-existent funcA! (Not even in the extensions.conf stuff!)
@@ -16,4 +16,4 @@ LOG: lev:2 file:pbx_ael.c  line:931 func: pbx_load_module  AEL load process: che
 LOG: lev:2 file:pbx_ael.c  line:933 func: pbx_load_module  AEL load process: compiled config file name './extensions.ael'.
 LOG: lev:2 file:pbx_ael.c  line:936 func: pbx_load_module  AEL load process: merged config file name './extensions.ael'.
 LOG: lev:2 file:pbx_ael.c  line:939 func: pbx_load_module  AEL load process: verified config file name './extensions.ael'.
-LOG: lev:4 file:ael2_parse  line:527 func: main  13 contexts, 57 extensions, 188 priorities
+LOG: lev:4 file:ael2_parse  line:543 func: main  13 contexts, 57 extensions, 188 priorities
index 506c751..521d13a 100644 (file)
@@ -63,8 +63,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 static char *config = "extensions.ael";
 static char *registrar = "pbx_ael";
 static int pbx_load_module(void);
-static int warns, errs;
-static struct pval *current_db;
 
 #ifndef AAL_ARGCHECK
 /* for the time being, short circuit all the AAL related structures
@@ -103,799 +101,7 @@ int is_float(char *arg );
 int is_int(char *arg );
 int is_empty(char *arg);
 
-static const char *match_context;
-static const char *match_exten;
-static const char *match_label;
-static int count_labels; /* true, put matcher in label counting mode */
-static int return_on_context_match;
-struct pval *match_pval(pval *item);
-static void check_goto(pval *item);
-static void find_pval_goto_item(pval *item, int lev);
-static void find_pval_gotos(pval *item, int lev);
-
-static struct pval *find_label_in_current_context(char *exten, char *label, pval *curr_cont);
-static struct pval *find_first_label_in_current_context(char *label, pval *curr_cont);
-static void print_pval_list(FILE *fin, pval *item, int depth);
-
-static struct pval *find_label_in_current_extension(const char *label, pval *curr_ext);
-static struct pval *find_label_in_current_db(const char *context, const char *exten, const char *label);
-static pval *get_extension_or_contxt(pval *p);
-static pval *get_contxt(pval *p);
 /* static void substitute_commas(char *str); */
-#ifdef NOMORE
-/*! \brief I am adding this code to substitute commas with vertbars in the args to apps */
-static void substitute_commas(char *str)
-{
-       char *p = str;
-       
-       while (p && *p)
-       {
-               if (*p == ',' && ((p != str && *(p-1) != '\\')
-                               || p == str))
-                       *p = '|';
-               if (*p == '\\' && *(p+1) == ',') { /* learning experience: the '\,' is turned into just ',' by pbx_config; So we need to do the same */
-                       char *q = p;
-                       while (*q) {  /* move the ',' and everything after it up 1 char */
-                               *q = *(q+1);
-                               q++;
-                       }
-               }
-               p++;
-       }
-}
-#endif
-
-/* PRETTY PRINTER FOR AEL:  ============================================================================= */
-
-static void print_pval(FILE *fin, pval *item, int depth)
-{
-       int i;
-       pval *lp;
-       
-       for (i=0; i<depth; i++) {
-               fprintf(fin, "\t"); /* depth == indentation */
-       }
-       
-       switch ( item->type ) {
-       case PV_WORD:
-               fprintf(fin,"%s;\n", item->u1.str); /* usually, words are encapsulated in something else */
-               break;
-               
-       case PV_MACRO:
-               fprintf(fin,"macro %s(", item->u1.str);
-               for (lp=item->u2.arglist; lp; lp=lp->next) {
-                       if (lp != item->u2.arglist )
-                               fprintf(fin,", ");
-                       fprintf(fin,"%s", lp->u1.str);
-               }
-               fprintf(fin,") {\n");
-               print_pval_list(fin,item->u3.macro_statements,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n\n");
-               break;
-                       
-       case PV_CONTEXT:
-               if ( item->u3.abstract )
-                       fprintf(fin,"abstract context %s {\n", item->u1.str);
-               else
-                       fprintf(fin,"context %s {\n", item->u1.str);
-               print_pval_list(fin,item->u2.statements,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n\n");
-               break;
-                       
-       case PV_MACRO_CALL:
-               fprintf(fin,"&%s(", item->u1.str);
-               for (lp=item->u2.arglist; lp; lp=lp->next) {
-                       if ( lp != item->u2.arglist )
-                               fprintf(fin,", ");
-                       fprintf(fin,"%s", lp->u1.str);
-               }
-               fprintf(fin,");\n");
-               break;
-                       
-       case PV_APPLICATION_CALL:
-               fprintf(fin,"%s(", item->u1.str);
-               for (lp=item->u2.arglist; lp; lp=lp->next) {
-                       if ( lp != item->u2.arglist )
-                               fprintf(fin,",");
-                       fprintf(fin,"%s", lp->u1.str);
-               }
-               fprintf(fin,");\n");
-               break;
-                       
-       case PV_CASE:
-               fprintf(fin,"case %s:\n", item->u1.str);
-               print_pval_list(fin,item->u2.statements, depth+1);
-               break;
-                       
-       case PV_PATTERN:
-               fprintf(fin,"pattern %s:\n", item->u1.str);
-               print_pval_list(fin,item->u2.statements, depth+1);
-               break;
-                       
-       case PV_DEFAULT:
-               fprintf(fin,"default:\n");
-               print_pval_list(fin,item->u2.statements, depth+1);
-               break;
-                       
-       case PV_CATCH:
-               fprintf(fin,"catch %s {\n", item->u1.str);
-               print_pval_list(fin,item->u2.statements, depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n");
-               break;
-                       
-       case PV_SWITCHES:
-               fprintf(fin,"switches {\n");
-               print_pval_list(fin,item->u1.list,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n");
-               break;
-                       
-       case PV_ESWITCHES:
-               fprintf(fin,"eswitches {\n");
-               print_pval_list(fin,item->u1.list,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n");
-               break;
-                       
-       case PV_INCLUDES:
-               fprintf(fin,"includes {\n");
-               for (lp=item->u1.list; lp; lp=lp->next) {
-                       for (i=0; i<depth+1; i++) {
-                               fprintf(fin,"\t"); /* depth == indentation */
-                       }
-                       fprintf(fin,"%s", lp->u1.str); /* usually, words are encapsulated in something else */
-                       if ( lp->u2.arglist )
-                               fprintf(fin,"|%s|%s|%s|%s", 
-                                               lp->u2.arglist->u1.str,
-                                               lp->u2.arglist->next->u1.str,
-                                               lp->u2.arglist->next->next->u1.str,
-                                               lp->u2.arglist->next->next->next->u1.str
-                                       );
-                       fprintf(fin,";\n"); /* usually, words are encapsulated in something else */
-               }
-               
-               print_pval_list(fin,item->u1.list,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n");
-               break;
-                       
-       case PV_STATEMENTBLOCK:
-               fprintf(fin,"{\n");
-               print_pval_list(fin,item->u1.list, depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"};\n");
-               break;
-                       
-       case PV_VARDEC:
-               fprintf(fin,"%s=%s;\n", item->u1.str, item->u2.val);
-               break;
-                       
-       case PV_LOCALVARDEC:
-               fprintf(fin,"local %s=%s;\n", item->u1.str, item->u2.val);
-               break;
-                       
-       case PV_GOTO:
-               fprintf(fin,"goto %s", item->u1.list->u1.str);
-               if ( item->u1.list->next )
-                       fprintf(fin,",%s", item->u1.list->next->u1.str);
-               if ( item->u1.list->next && item->u1.list->next->next )
-                       fprintf(fin,",%s", item->u1.list->next->next->u1.str);
-               fprintf(fin,"\n");
-               break;
-                       
-       case PV_LABEL:
-               fprintf(fin,"%s:\n", item->u1.str);
-               break;
-                       
-       case PV_FOR:
-               fprintf(fin,"for (%s; %s; %s)\n", item->u1.for_init, item->u2.for_test, item->u3.for_inc);
-               print_pval_list(fin,item->u4.for_statements,depth+1);
-               break;
-                       
-       case PV_WHILE:
-               fprintf(fin,"while (%s)\n", item->u1.str);
-               print_pval_list(fin,item->u2.statements,depth+1);
-               break;
-                       
-       case PV_BREAK:
-               fprintf(fin,"break;\n");
-               break;
-                       
-       case PV_RETURN:
-               fprintf(fin,"return;\n");
-               break;
-                       
-       case PV_CONTINUE:
-               fprintf(fin,"continue;\n");
-               break;
-                       
-       case PV_RANDOM:
-       case PV_IFTIME:
-       case PV_IF:
-               if ( item->type == PV_IFTIME ) {
-                       
-                       fprintf(fin,"ifTime ( %s|%s|%s|%s )\n", 
-                                       item->u1.list->u1.str, 
-                                       item->u1.list->next->u1.str, 
-                                       item->u1.list->next->next->u1.str, 
-                                       item->u1.list->next->next->next->u1.str
-                                       );
-               } else if ( item->type == PV_RANDOM ) {
-                       fprintf(fin,"random ( %s )\n", item->u1.str );
-               } else
-                       fprintf(fin,"if ( %s )\n", item->u1.str);
-               if ( item->u2.statements && item->u2.statements->next ) {
-                       for (i=0; i<depth; i++) {
-                               fprintf(fin,"\t"); /* depth == indentation */
-                       }
-                       fprintf(fin,"{\n");
-                       print_pval_list(fin,item->u2.statements,depth+1);
-                       for (i=0; i<depth; i++) {
-                               fprintf(fin,"\t"); /* depth == indentation */
-                       }
-                       if ( item->u3.else_statements )
-                               fprintf(fin,"}\n");
-                       else
-                               fprintf(fin,"};\n");
-               } else if (item->u2.statements ) {
-                       print_pval_list(fin,item->u2.statements,depth+1);
-               } else {
-                       if (item->u3.else_statements )
-                               fprintf(fin, " {} ");
-                       else
-                               fprintf(fin, " {}; ");
-               }
-               if ( item->u3.else_statements ) {
-                       for (i=0; i<depth; i++) {
-                               fprintf(fin,"\t"); /* depth == indentation */
-                       }
-                       fprintf(fin,"else\n");
-                       print_pval_list(fin,item->u3.else_statements, depth);
-               }
-               break;
-                       
-       case PV_SWITCH:
-               fprintf(fin,"switch( %s ) {\n", item->u1.str);
-               print_pval_list(fin,item->u2.statements,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"}\n");
-               break;
-                       
-       case PV_EXTENSION:
-               if ( item->u4.regexten )
-                       fprintf(fin, "regexten ");
-               if ( item->u3.hints )
-                       fprintf(fin,"hints(%s) ", item->u3.hints);
-               
-               fprintf(fin,"%s => \n", item->u1.str);
-               print_pval_list(fin,item->u2.statements,depth+1);
-               break;
-                       
-       case PV_IGNOREPAT:
-               fprintf(fin,"ignorepat => %s\n", item->u1.str);
-               break;
-                       
-       case PV_GLOBALS:
-               fprintf(fin,"globals {\n");
-               print_pval_list(fin,item->u1.statements,depth+1);
-               for (i=0; i<depth; i++) {
-                       fprintf(fin,"\t"); /* depth == indentation */
-               }
-               fprintf(fin,"}\n");
-               break;
-       }
-}
-
-static void print_pval_list(FILE *fin, pval *item, int depth)
-{
-       pval *i;
-       
-       for (i=item; i; i=i->next) {
-               print_pval(fin, i, depth);
-       }
-}
-
-#if 0
-static void ael2_print(char *fname, pval *tree)
-{
-       FILE *fin = fopen(fname,"w");
-       if ( !fin ) {
-               ast_log(LOG_ERROR, "Couldn't open %s for writing.\n", fname);
-               return;
-       }
-       print_pval_list(fin, tree, 0);
-       fclose(fin);
-}
-#endif
-
-
-
-/* SEMANTIC CHECKING FOR AEL:  ============================================================================= */
-
-/*   (not all that is syntactically legal is good! */
-
-
-static struct pval *in_macro(pval *item)
-{
-       struct pval *curr;
-       curr = item;    
-       while( curr ) {
-               if( curr->type == PV_MACRO  ) {
-                       return curr;
-               }
-               curr = curr->dad;
-       }
-       return 0;
-}
-
-static struct pval *in_context(pval *item)
-{
-       struct pval *curr;
-       curr = item;    
-       while( curr ) {
-               if( curr->type == PV_MACRO || curr->type == PV_CONTEXT ) {
-                       return curr;
-               }
-               curr = curr->dad;
-       }
-       return 0;
-}
-
-
-static void check_goto(pval *item)
-{
-       /* check for the target of the goto-- does it exist? */
-       if ( !(item->u1.list)->next && !(item->u1.list)->u1.str ) {
-               ast_log(LOG_ERROR,"Error: file %s, line %d-%d: goto:  empty label reference found!\n",
-                               item->filename, item->startline, item->endline);
-               errs++;
-       }
-       
-       /* just one item-- the label should be in the current extension */
-       
-       if (item->u1.list && !item->u1.list->next && !strstr((item->u1.list)->u1.str,"${")) {
-               struct pval *z = get_extension_or_contxt(item);
-               struct pval *x = 0;
-               if (z)
-                       x = find_label_in_current_extension((char*)((item->u1.list)->u1.str), z); /* if in macro, use current context instead */
-               /* printf("Called find_label_in_current_extension with arg %s; current_extension is %x: %d\n",
-                  (char*)((item->u1.list)->u1.str), current_extension?current_extension:current_context, current_extension?current_extension->type:current_context->type); */
-               if (!x) {
-                       ast_log(LOG_ERROR,"Error: file %s, line %d-%d: goto:  no label %s exists in the current extension!\n",
-                                       item->filename, item->startline, item->endline, item->u1.list->u1.str);
-                       errs++;
-               }
-               else
-                       return;
-       }
-       
-       /* TWO items */
-       if (item->u1.list->next && !item->u1.list->next->next) {
-               /* two items */
-               /* printf("Calling find_label_in_current_context with args %s, %s\n",
-                  (char*)((item->u1.list)->u1.str), (char *)item->u1.list->next->u1.str); */
-               if (!strstr((item->u1.list)->u1.str,"${") 
-                       && !strstr(item->u1.list->next->u1.str,"${") ) /* Don't try to match variables */ {
-                       struct pval *z = get_contxt(item);
-                       struct pval *x = 0;
-                       
-                       if (z)
-                               x = find_label_in_current_context((char *)item->u1.list->u1.str, (char *)item->u1.list->next->u1.str, z);
-
-                       if (!x) {
-                               ast_log(LOG_ERROR,"Error: file %s, line %d-%d: goto:  no label %s|%s exists in the current context, or any of its inclusions!\n",
-                                               item->filename, item->startline, item->endline, item->u1.list->u1.str, item->u1.list->next->u1.str );
-                               errs++;
-                       }
-                       else
-                               return;
-               }
-       }
-       
-       /* All 3 items! */
-       if (item->u1.list->next && item->u1.list->next->next) {
-               /* all three */
-               pval *first = item->u1.list;
-               pval *second = item->u1.list->next;
-               pval *third = item->u1.list->next->next;
-               
-               /* printf("Calling find_label_in_current_db with args %s, %s, %s\n",
-                  (char*)first->u1.str, (char*)second->u1.str, (char*)third->u1.str); */
-               if (!strstr((item->u1.list)->u1.str,"${") 
-                       && !strstr(item->u1.list->next->u1.str,"${")
-                       && !strstr(item->u1.list->next->next->u1.str,"${")) /* Don't try to match variables */ {
-                       struct pval *x = find_label_in_current_db((char*)first->u1.str, (char*)second->u1.str, (char*)third->u1.str);
-                       if (!x) {
-                               struct pval *p3;
-                               struct pval *found = 0;
-                               struct pval *that_context = find_context(item->u1.list->u1.str);
-                               
-                               /* the target of the goto could be in an included context!! Fancy that!! */
-                               /* look for includes in the current context */
-                               if (that_context) {
-                                       for (p3=that_context->u2.statements; p3; p3=p3->next) {
-                                               if (p3->type == PV_INCLUDES) {
-                                                       struct pval *p4;
-                                                       for (p4=p3->u1.list; p4; p4=p4->next) {
-                                                               /* for each context pointed to, find it, then find a context/label that matches the
-                                                                  target here! */
-                                                               char *incl_context = p4->u1.str;
-                                                               /* find a matching context name */
-                                                               struct pval *that_other_context = find_context(incl_context);
-                                                               if (that_other_context) {
-                                                                       struct pval *x3;
-                                                                       x3 = find_label_in_current_context((char *)item->u1.list->next->u1.str, (char *)item->u1.list->next->next->u1.str, that_other_context);
-                                                                       if (x3) {
-                                                                               found = x3;
-                                                                               break;
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-                                       }
-                                       if (!found) {
-                                               ast_log(LOG_ERROR,"Error: file %s, line %d-%d: goto:  no label %s|%s exists in the context %s or its inclusions!\n",
-                                                               item->filename, item->startline, item->endline, item->u1.list->next->u1.str, item->u1.list->next->next->u1.str, item->u1.list->u1.str );
-                                               errs++;
-                                       } else {
-                                               struct pval *mac = in_macro(item); /* is this goto inside a macro? */
-                                               if( mac ) {    /* yes! */
-                                                       struct pval *targ = in_context(found);
-                                                       if( mac != targ )
-                                                       {
-                                                               ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: It's bad form to have a goto in a macro to a target outside the macro!\n",
-                                                                               item->filename, item->startline, item->endline);
-                                                               warns++;                                                                
-                                                       }
-                                               }
-                                       }
-                               } else {
-                                       /* here is where code would go to check for target existence in extensions.conf files */
-                                       ast_log(LOG_WARNING,"Warning: file %s, line %d-%d: goto:  no context %s could be found that matches the goto target!\n",
-                                                       item->filename, item->startline, item->endline, item->u1.list->u1.str);
-                                       warns++; /* this is just a warning, because this context could be in extensions.conf or somewhere */
-                               }
-                       } else {
-                               struct pval *mac = in_macro(item); /* is this goto inside a macro? */
-                               if( mac ) {    /* yes! */
-                                       struct pval *targ = in_context(x);
-                                       if( mac != targ )
-                                       {
-                                               ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: It's bad form to have a goto in a macro to a target outside the macro!\n",
-                                                               item->filename, item->startline, item->endline);
-                                               warns++;                                                                
-                                       }
-                               }
-                       }
-               }
-       }
-}
-       
-
-static void find_pval_goto_item(pval *item, int lev)
-{
-       struct pval *p4;
-       if (lev>100) {
-               ast_log(LOG_ERROR,"find_pval_goto in infinite loop!\n\n");
-               return;
-       }
-       
-       switch ( item->type ) {
-       case PV_MACRO:
-               /* fields: item->u1.str     == name of macro
-                          item->u2.arglist == pval list of PV_WORD arguments of macro, as given by user
-                                  item->u2.arglist->u1.str  == argument
-                                  item->u2.arglist->next   == next arg
-
-                                  item->u3.macro_statements == pval list of statements in macro body.
-               */
-                       
-               /* printf("Descending into matching macro %s\n", match_context); */
-               find_pval_gotos(item->u3.macro_statements,lev+1); /* if we're just searching for a context, don't bother descending into them */
-               
-               break;
-                       
-       case PV_CONTEXT:
-               /* fields: item->u1.str     == name of context
-                          item->u2.statements == pval list of statements in context body
-                                  item->u3.abstract == int 1 if an abstract keyword were present
-               */
-               break;
-
-       case PV_CASE:
-               /* fields: item->u1.str     == value of case
-                          item->u2.statements == pval list of statements under the case
-               */
-               find_pval_gotos(item->u2.statements,lev+1);
-               break;
-                       
-       case PV_PATTERN:
-               /* fields: item->u1.str     == value of case
-                          item->u2.statements == pval list of statements under the case
-               */
-               find_pval_gotos(item->u2.statements,lev+1);
-               break;
-                       
-       case PV_DEFAULT:
-               /* fields: 
-                          item->u2.statements == pval list of statements under the case
-               */
-               find_pval_gotos(item->u2.statements,lev+1);
-               break;
-                       
-       case PV_CATCH:
-               /* fields: item->u1.str     == name of extension to catch
-                          item->u2.statements == pval list of statements in context body
-               */
-               find_pval_gotos(item->u2.statements,lev+1);
-               break;
-                       
-       case PV_STATEMENTBLOCK:
-               /* fields: item->u1.list     == pval list of statements in block, one per entry in the list
-               */
-               find_pval_gotos(item->u1.list,lev+1);
-               break;
-                       
-       case PV_GOTO:
-               /* fields: item->u1.list     == pval list of PV_WORD target names, up to 3, in order as given by user.
-                          item->u1.list->u1.str  == where the data on a PV_WORD will always be.
-               */
-               check_goto(item);  /* THE WHOLE FUNCTION OF THIS ENTIRE ROUTINE!!!! */
-               break;
-                       
-       case PV_INCLUDES:
-               /* fields: item->u1.list     == pval list of PV_WORD elements, one per entry in the list
-               */
-               for (p4=item->u1.list; p4; p4=p4->next) {
-                       /* for each context pointed to, find it, then find a context/label that matches the
-                          target here! */
-                       char *incl_context = p4->u1.str;
-                       /* find a matching context name */
-                       struct pval *that_context = find_context(incl_context);
-                       if (that_context) {
-                               find_pval_gotos(that_context,lev+1); /* keep working up the includes */
-                       }
-               }
-               break;
-               
-       case PV_FOR:
-               /* fields: item->u1.for_init     == a string containing the initalizer
-                          item->u2.for_test     == a string containing the loop test
-                          item->u3.for_inc      == a string containing the loop increment
-
-                                  item->u4.for_statements == a pval list of statements in the for ()
-               */
-               find_pval_gotos(item->u4.for_statements,lev+1);
-               break;
-                       
-       case PV_WHILE:
-               /* fields: item->u1.str        == the while conditional, as supplied by user
-
-                                  item->u2.statements == a pval list of statements in the while ()
-               */
-               find_pval_gotos(item->u2.statements,lev+1);
-               break;
-                       
-       case PV_RANDOM:
-               /* fields: item->u1.str        == the random number expression, as supplied by user
-
-                                  item->u2.statements == a pval list of statements in the if ()
-                                  item->u3.else_statements == a pval list of statements in the else
-                                                                                          (could be zero)
-                fall thru to PV_IF */
-               
-       case PV_IFTIME:
-               /* fields: item->u1.list        == the time values, 4 of them, as PV_WORD structs in a list
-
-                                  item->u2.statements == a pval list of statements in the if ()
-                                  item->u3.else_statements == a pval list of statements in the else
-                                                                                          (could be zero)
-               fall thru to PV_IF*/
-       case PV_IF:
-               /* fields: item->u1.str        == the if conditional, as supplied by user
-
-                                  item->u2.statements == a pval list of statements in the if ()
-                                  item->u3.else_statements == a pval list of statements in the else
-                                                                                          (could be zero)
-               */
-               find_pval_gotos(item->u2.statements,lev+1);
-
-               if (item->u3.else_statements) {
-                       find_pval_gotos(item->u3.else_statements,lev+1);
-               }
-               break;
-                       
-       case PV_SWITCH:
-               /* fields: item->u1.str        == the switch expression
-
-                                  item->u2.statements == a pval list of statements in the switch, 
-                                                                                       (will be case statements, most likely!)
-               */
-               find_pval_gotos(item->u3.else_statements,lev+1);
-               break;
-                       
-       case PV_EXTENSION:
-               /* fields: item->u1.str        == the extension name, label, whatever it's called
-
-                                  item->u2.statements == a pval list of statements in the extension
-                                  item->u3.hints      == a char * hint argument
-                                  item->u4.regexten   == an int boolean. non-zero says that regexten was specified
-               */
-
-               find_pval_gotos(item->u2.statements,lev+1);
-               break;
-
-       default:
-               break;
-       }
-}
-
-static void find_pval_gotos(pval *item,int lev)
-{
-       pval *i;
-
-       for (i=item; i; i=i->next) {
-               
-               find_pval_goto_item(i, lev);
-       }
-}
-
-
-
-struct pval *find_first_label_in_current_context(char *label, pval *curr_cont)
-{
-       /* printf("  --- Got args %s, %s\n", exten, label); */
-       struct pval *ret;
-       struct pval *p3;
-       struct pval *startpt = ((curr_cont->type==PV_MACRO)?curr_cont->u3.macro_statements: curr_cont->u2.statements);
-       
-       count_labels = 0;
-       return_on_context_match = 0;
-       match_context = "*";
-       match_exten = "*";
-       match_label = label;
-       
-       ret =  match_pval(curr_cont);
-       if (ret)
-               return ret;
-                                       
-       /* the target of the goto could be in an included context!! Fancy that!! */
-       /* look for includes in the current context */
-       for (p3=startpt; p3; p3=p3->next) {
-               if (p3->type == PV_INCLUDES) {
-                       struct pval *p4;
-                       for (p4=p3->u1.list; p4; p4=p4->next) {
-                               /* for each context pointed to, find it, then find a context/label that matches the
-                                  target here! */
-                               char *incl_context = p4->u1.str;
-                               /* find a matching context name */
-                               struct pval *that_context = find_context(incl_context);
-                               if (that_context) {
-                                       struct pval *x3;
-                                       x3 = find_first_label_in_current_context(label, that_context);
-                                       if (x3) {
-                                               return x3;
-                                       }
-                               }
-                       }
-               }
-       }
-       return 0;
-}
-
-struct pval *find_label_in_current_context(char *exten, char *label, pval *curr_cont)
-{
-       /* printf("  --- Got args %s, %s\n", exten, label); */
-       struct pval *ret;
-       struct pval *p3;
-       struct pval *startpt;
-       
-       count_labels = 0;
-       return_on_context_match = 0;
-       match_context = "*";
-       match_exten = exten;
-       match_label = label;
-       if (curr_cont->type == PV_MACRO)
-               startpt = curr_cont->u3.macro_statements;
-       else
-               startpt = curr_cont->u2.statements;
-
-       ret =  match_pval(startpt);
-       if (ret)
-               return ret;
-                                       
-       /* the target of the goto could be in an included context!! Fancy that!! */
-       /* look for includes in the current context */
-       for (p3=startpt; p3; p3=p3->next) {
-               if (p3->type == PV_INCLUDES) {
-                       struct pval *p4;
-                       for (p4=p3->u1.list; p4; p4=p4->next) {
-                               /* for each context pointed to, find it, then find a context/label that matches the
-                                  target here! */
-                               char *incl_context = p4->u1.str;
-                               /* find a matching context name */
-                               struct pval *that_context = find_context(incl_context);
-                               if (that_context) {
-                                       struct pval *x3;
-                                       x3 = find_label_in_current_context(exten, label, that_context);
-                                       if (x3) {
-                                               return x3;
-                                       }
-                               }
-                       }
-               }
-       }
-       return 0;
-}
-
-static struct pval *find_label_in_current_extension(const char *label, pval *curr_ext)
-{
-       /* printf("  --- Got args %s\n", label); */
-       count_labels = 0;
-       return_on_context_match = 0;
-       match_context = "*";
-       match_exten = "*";
-       match_label = label;
-       return match_pval(curr_ext);
-}
-
-static struct pval *find_label_in_current_db(const char *context, const char *exten, const char *label)
-{
-       /* printf("  --- Got args %s, %s, %s\n", context, exten, label); */
-       count_labels = 0;
-       return_on_context_match = 0;
-
-       match_context = context;
-       match_exten = exten;
-       match_label = label;
-       
-       return match_pval(current_db);
-}
-
-
-
-/* =============================================================================================== */
-/* "CODE" GENERATOR -- Convert the AEL representation to asterisk extension language */
-/* =============================================================================================== */
-
-static pval *get_extension_or_contxt(pval *p)
-{
-       while( p && p->type != PV_EXTENSION && p->type != PV_CONTEXT && p->type != PV_MACRO ) {
-               
-               p = p->dad;
-       }
-       
-       return p;
-}
-
-static pval *get_contxt(pval *p)
-{
-       while( p && p->type != PV_CONTEXT && p->type != PV_MACRO ) {
-               
-               p = p->dad;
-       }
-       
-       return p;
-}
 
 static int aeldebug = 0;
 
index 5adaff1..b67309a 100644 (file)
@@ -195,6 +195,7 @@ NOSEMIC             ([^;()\{\}\[\]]|\\[;()\[\]\{\}])*
 \/\/[^\n]*     {/*comment*/}
 context                { STORE_POS; return KW_CONTEXT;}
 abstract       { STORE_POS; return KW_ABSTRACT;}
+extend         { STORE_POS; return KW_EXTEND;}
 macro          { STORE_POS; return KW_MACRO;};
 globals                { STORE_POS; return KW_GLOBALS;}
 local          { STORE_POS; return KW_LOCAL;}
index 9950322..ccd8fa4 100644 (file)
      KW_ELSE = 276,
      KW_RANDOM = 277,
      KW_ABSTRACT = 278,
-     EXTENMARK = 279,
-     KW_GOTO = 280,
-     KW_JUMP = 281,
-     KW_RETURN = 282,
-     KW_BREAK = 283,
-     KW_CONTINUE = 284,
-     KW_REGEXTEN = 285,
-     KW_HINT = 286,
-     KW_FOR = 287,
-     KW_WHILE = 288,
-     KW_CASE = 289,
-     KW_PATTERN = 290,
-     KW_DEFAULT = 291,
-     KW_CATCH = 292,
-     KW_SWITCHES = 293,
-     KW_ESWITCHES = 294,
-     KW_INCLUDES = 295,
-     KW_LOCAL = 296,
-     word = 297
+     KW_EXTEND = 279,
+     EXTENMARK = 280,
+     KW_GOTO = 281,
+     KW_JUMP = 282,
+     KW_RETURN = 283,
+     KW_BREAK = 284,
+     KW_CONTINUE = 285,
+     KW_REGEXTEN = 286,
+     KW_HINT = 287,
+     KW_FOR = 288,
+     KW_WHILE = 289,
+     KW_CASE = 290,
+     KW_PATTERN = 291,
+     KW_DEFAULT = 292,
+     KW_CATCH = 293,
+     KW_SWITCHES = 294,
+     KW_ESWITCHES = 295,
+     KW_INCLUDES = 296,
+     KW_LOCAL = 297,
+     word = 298
    };
 #endif
 /* Tokens.  */
 #define KW_ELSE 276
 #define KW_RANDOM 277
 #define KW_ABSTRACT 278
-#define EXTENMARK 279
-#define KW_GOTO 280
-#define KW_JUMP 281
-#define KW_RETURN 282
-#define KW_BREAK 283
-#define KW_CONTINUE 284
-#define KW_REGEXTEN 285
-#define KW_HINT 286
-#define KW_FOR 287
-#define KW_WHILE 288
-#define KW_CASE 289
-#define KW_PATTERN 290
-#define KW_DEFAULT 291
-#define KW_CATCH 292
-#define KW_SWITCHES 293
-#define KW_ESWITCHES 294
-#define KW_INCLUDES 295
-#define KW_LOCAL 296
-#define word 297
+#define KW_EXTEND 279
+#define EXTENMARK 280
+#define KW_GOTO 281
+#define KW_JUMP 282
+#define KW_RETURN 283
+#define KW_BREAK 284
+#define KW_CONTINUE 285
+#define KW_REGEXTEN 286
+#define KW_HINT 287
+#define KW_FOR 288
+#define KW_WHILE 289
+#define KW_CASE 290
+#define KW_PATTERN 291
+#define KW_DEFAULT 292
+#define KW_CATCH 293
+#define KW_SWITCHES 294
+#define KW_ESWITCHES 295
+#define KW_INCLUDES 296
+#define KW_LOCAL 297
+#define word 298
 
 
 
@@ -232,7 +234,7 @@ typedef union YYSTYPE
        struct pval *pval;      /* full objects */
 }
 /* Line 198 of yacc.c.  */
-#line 236 "ael.tab.c"
+#line 238 "ael.tab.c"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -277,7 +279,7 @@ static pval *update_last(pval *, YYLTYPE *);
 
 
 /* Line 221 of yacc.c.  */
-#line 281 "ael.tab.c"
+#line 283 "ael.tab.c"
 
 #ifdef short
 # undef short
@@ -490,22 +492,22 @@ union yyalloc
 #endif
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  14
+#define YYFINAL  17
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   331
+#define YYLAST   321
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  43
+#define YYNTOKENS  44
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  56
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  138
+#define YYNRULES  141
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  281
+#define YYNSTATES  284
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   297
+#define YYMAXUTOK   298
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -542,7 +544,7 @@ static const yytype_uint8 yytranslate[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42
+      35,    36,    37,    38,    39,    40,    41,    42,    43
 };
 
 #if YYDEBUG
@@ -551,89 +553,92 @@ static const yytype_uint8 yytranslate[] =
 static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     5,     7,    10,    13,    15,    17,    19,
-      21,    23,    25,    32,    34,    35,    44,    49,    50,    53,
-      56,    57,    63,    64,    71,    72,    74,    78,    81,    82,
-      85,    88,    90,    92,    94,    96,    98,   100,   102,   105,
-     107,   112,   116,   121,   129,   138,   139,   142,   145,   151,
-     153,   161,   162,   167,   170,   173,   178,   180,   183,   185,
-     188,   192,   196,   198,   201,   205,   207,   210,   214,   220,
-     224,   226,   228,   232,   236,   239,   240,   241,   242,   255,
-     259,   261,   265,   268,   271,   272,   278,   281,   284,   287,
-     291,   293,   296,   297,   299,   303,   307,   313,   319,   325,
-     331,   332,   335,   338,   343,   344,   350,   354,   355,   359,
-     363,   366,   368,   369,   371,   372,   376,   377,   380,   385,
-     389,   394,   395,   398,   400,   402,   408,   413,   418,   419,
-     423,   429,   432,   434,   438,   441,   445,   448,   453
+      21,    23,    25,    32,    34,    35,    37,    40,    43,    52,
+      57,    58,    61,    64,    65,    71,    72,    79,    80,    82,
+      86,    89,    90,    93,    96,    98,   100,   102,   104,   106,
+     108,   110,   113,   115,   120,   124,   129,   137,   146,   147,
+     150,   153,   159,   161,   169,   170,   175,   178,   181,   186,
+     188,   191,   193,   196,   200,   204,   206,   209,   213,   215,
+     218,   222,   228,   232,   234,   236,   240,   244,   247,   248,
+     249,   250,   263,   267,   269,   273,   276,   279,   280,   286,
+     289,   292,   295,   299,   301,   304,   305,   307,   311,   315,
+     321,   327,   333,   339,   340,   343,   346,   351,   352,   358,
+     362,   363,   367,   371,   374,   376,   377,   379,   380,   384,
+     385,   388,   393,   397,   402,   403,   406,   408,   410,   416,
+     421,   426,   427,   431,   437,   440,   442,   446,   449,   453,
+     456,   461
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int8 yyrhs[] =
 {
-      44,     0,    -1,    45,    -1,    46,    -1,    45,    46,    -1,
-      45,     1,    -1,    48,    -1,    50,    -1,    51,    -1,     8,
-      -1,    42,    -1,    36,    -1,    49,     3,    47,     4,    58,
-       5,    -1,    23,    -1,    -1,    15,    42,     6,    57,     7,
-       4,    91,     5,    -1,    16,     4,    52,     5,    -1,    -1,
-      53,    52,    -1,     1,    52,    -1,    -1,    42,     9,    54,
-      42,     8,    -1,    -1,    41,    42,     9,    56,    42,     8,
-      -1,    -1,    42,    -1,    57,    10,    42,    -1,    57,     1,
-      -1,    -1,    59,    58,    -1,     1,    58,    -1,    61,    -1,
-      98,    -1,    93,    -1,    94,    -1,    60,    -1,    53,    -1,
-      55,    -1,    42,     1,    -1,     8,    -1,    17,    24,    42,
-       8,    -1,    42,    24,    73,    -1,    30,    42,    24,    73,
-      -1,    31,     6,    69,     7,    42,    24,    73,    -1,    30,
-      31,     6,    69,     7,    42,    24,    73,    -1,    -1,    73,
-      62,    -1,     1,    62,    -1,    70,    11,    70,    11,    70,
-      -1,    42,    -1,    63,    13,    70,    13,    70,    13,    70,
-      -1,    -1,     6,    66,    68,     7,    -1,    19,    65,    -1,
-      22,    65,    -1,    20,     6,    64,     7,    -1,    42,    -1,
-      42,    42,    -1,    42,    -1,    69,    42,    -1,    69,    11,
-      42,    -1,    69,    12,    42,    -1,    42,    -1,    42,    42,
-      -1,    42,    42,    42,    -1,    42,    -1,    42,    42,    -1,
-      71,    11,    42,    -1,    18,    65,     4,    89,     5,    -1,
-       4,    62,     5,    -1,    53,    -1,    55,    -1,    25,    79,
-       8,    -1,    26,    81,     8,    -1,    42,    11,    -1,    -1,
-      -1,    -1,    32,     6,    74,    42,     8,    75,    42,     8,
-      76,    42,     7,    73,    -1,    33,    65,    73,    -1,    72,
-      -1,    12,    82,     8,    -1,    86,     8,    -1,    42,     8,
-      -1,    -1,    86,     9,    77,    42,     8,    -1,    28,     8,
-      -1,    27,     8,    -1,    29,     8,    -1,    67,    73,    78,
-      -1,     8,    -1,    21,    73,    -1,    -1,    71,    -1,    71,
-      13,    71,    -1,    71,    10,    71,    -1,    71,    13,    71,
-      13,    71,    -1,    71,    10,    71,    10,    71,    -1,    36,
-      13,    71,    13,    71,    -1,    36,    10,    71,    10,    71,
-      -1,    -1,    10,    42,    -1,    71,    80,    -1,    71,    80,
-      14,    47,    -1,    -1,    42,     6,    83,    88,     7,    -1,
-      42,     6,     7,    -1,    -1,    42,     6,    85,    -1,    84,
-      88,     7,    -1,    84,     7,    -1,    42,    -1,    -1,    68,
-      -1,    -1,    88,    10,    87,    -1,    -1,    90,    89,    -1,
-      34,    42,    11,    62,    -1,    36,    11,    62,    -1,    35,
-      42,    11,    62,    -1,    -1,    92,    91,    -1,    73,    -1,
-      98,    -1,    37,    42,     4,    62,     5,    -1,    38,     4,
-      95,     5,    -1,    39,     4,    95,     5,    -1,    -1,    42,
-       8,    95,    -1,    42,    14,    42,     8,    95,    -1,     1,
-      95,    -1,    47,    -1,    47,    13,    64,    -1,    96,     8,
-      -1,    97,    96,     8,    -1,    97,     1,    -1,    40,     4,
-      97,     5,    -1,    40,     4,     5,    -1
+      45,     0,    -1,    46,    -1,    47,    -1,    46,    47,    -1,
+      46,     1,    -1,    49,    -1,    51,    -1,    52,    -1,     8,
+      -1,    43,    -1,    37,    -1,    50,     3,    48,     4,    59,
+       5,    -1,    23,    -1,    -1,    24,    -1,    24,    23,    -1,
+      23,    24,    -1,    15,    43,     6,    58,     7,     4,    92,
+       5,    -1,    16,     4,    53,     5,    -1,    -1,    54,    53,
+      -1,     1,    53,    -1,    -1,    43,     9,    55,    43,     8,
+      -1,    -1,    42,    43,     9,    57,    43,     8,    -1,    -1,
+      43,    -1,    58,    10,    43,    -1,    58,     1,    -1,    -1,
+      60,    59,    -1,     1,    59,    -1,    62,    -1,    99,    -1,
+      94,    -1,    95,    -1,    61,    -1,    54,    -1,    56,    -1,
+      43,     1,    -1,     8,    -1,    17,    25,    43,     8,    -1,
+      43,    25,    74,    -1,    31,    43,    25,    74,    -1,    32,
+       6,    70,     7,    43,    25,    74,    -1,    31,    32,     6,
+      70,     7,    43,    25,    74,    -1,    -1,    74,    63,    -1,
+       1,    63,    -1,    71,    11,    71,    11,    71,    -1,    43,
+      -1,    64,    13,    71,    13,    71,    13,    71,    -1,    -1,
+       6,    67,    69,     7,    -1,    19,    66,    -1,    22,    66,
+      -1,    20,     6,    65,     7,    -1,    43,    -1,    43,    43,
+      -1,    43,    -1,    70,    43,    -1,    70,    11,    43,    -1,
+      70,    12,    43,    -1,    43,    -1,    43,    43,    -1,    43,
+      43,    43,    -1,    43,    -1,    43,    43,    -1,    72,    11,
+      43,    -1,    18,    66,     4,    90,     5,    -1,     4,    63,
+       5,    -1,    54,    -1,    56,    -1,    26,    80,     8,    -1,
+      27,    82,     8,    -1,    43,    11,    -1,    -1,    -1,    -1,
+      33,     6,    75,    43,     8,    76,    43,     8,    77,    43,
+       7,    74,    -1,    34,    66,    74,    -1,    73,    -1,    12,
+      83,     8,    -1,    87,     8,    -1,    43,     8,    -1,    -1,
+      87,     9,    78,    43,     8,    -1,    29,     8,    -1,    28,
+       8,    -1,    30,     8,    -1,    68,    74,    79,    -1,     8,
+      -1,    21,    74,    -1,    -1,    72,    -1,    72,    13,    72,
+      -1,    72,    10,    72,    -1,    72,    13,    72,    13,    72,
+      -1,    72,    10,    72,    10,    72,    -1,    37,    13,    72,
+      13,    72,    -1,    37,    10,    72,    10,    72,    -1,    -1,
+      10,    43,    -1,    72,    81,    -1,    72,    81,    14,    48,
+      -1,    -1,    43,     6,    84,    89,     7,    -1,    43,     6,
+       7,    -1,    -1,    43,     6,    86,    -1,    85,    89,     7,
+      -1,    85,     7,    -1,    43,    -1,    -1,    69,    -1,    -1,
+      89,    10,    88,    -1,    -1,    91,    90,    -1,    35,    43,
+      11,    63,    -1,    37,    11,    63,    -1,    36,    43,    11,
+      63,    -1,    -1,    93,    92,    -1,    74,    -1,    99,    -1,
+      38,    43,     4,    63,     5,    -1,    39,     4,    96,     5,
+      -1,    40,     4,    96,     5,    -1,    -1,    43,     8,    96,
+      -1,    43,    14,    43,     8,    96,    -1,     1,    96,    -1,
+      48,    -1,    48,    13,    65,    -1,    97,     8,    -1,    98,
+      97,     8,    -1,    98,     1,    -1,    41,     4,    98,     5,
+      -1,    41,     4,     5,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
        0,   186,   186,   189,   190,   191,   194,   195,   196,   197,
-     200,   201,   204,   219,   220,   223,   229,   235,   236,   237,
-     240,   240,   246,   246,   253,   254,   255,   256,   259,   260,
-     261,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-     275,   280,   284,   289,   294,   304,   305,   306,   312,   317,
-     321,   329,   329,   333,   336,   339,   350,   351,   358,   359,
-     363,   367,   373,   374,   379,   387,   388,   392,   398,   407,
-     410,   411,   412,   415,   418,   421,   422,   423,   421,   429,
-     433,   434,   435,   436,   439,   439,   472,   473,   474,   475,
-     479,   482,   483,   486,   487,   490,   493,   497,   501,   505,
-     511,   512,   516,   519,   525,   525,   530,   538,   538,   549,
-     556,   559,   560,   563,   564,   567,   570,   571,   574,   578,
-     582,   588,   589,   592,   593,   594,   600,   605,   610,   611,
-     612,   614,   617,   618,   625,   626,   627,   630,   633
+     200,   201,   204,   213,   214,   215,   216,   217,   220,   226,
+     232,   233,   234,   237,   237,   243,   243,   250,   251,   252,
+     253,   256,   257,   258,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   272,   277,   281,   286,   291,   301,   302,
+     303,   309,   314,   318,   326,   326,   330,   333,   336,   347,
+     348,   355,   356,   360,   364,   370,   371,   376,   384,   385,
+     389,   395,   404,   407,   408,   409,   412,   415,   418,   419,
+     420,   418,   426,   430,   431,   432,   433,   436,   436,   469,
+     470,   471,   472,   476,   479,   480,   483,   484,   487,   490,
+     494,   498,   502,   508,   509,   513,   516,   522,   522,   527,
+     535,   535,   546,   553,   556,   557,   560,   561,   564,   567,
+     568,   571,   575,   579,   585,   586,   589,   590,   591,   597,
+     602,   607,   608,   609,   611,   614,   615,   622,   623,   624,
+     627,   630
 };
 #endif
 
@@ -645,21 +650,21 @@ static const char *const yytname[] =
   "$end", "error", "$undefined", "KW_CONTEXT", "LC", "RC", "LP", "RP",
   "SEMI", "EQ", "COMMA", "COLON", "AMPER", "BAR", "AT", "KW_MACRO",
   "KW_GLOBALS", "KW_IGNOREPAT", "KW_SWITCH", "KW_IF", "KW_IFTIME",
-  "KW_ELSE", "KW_RANDOM", "KW_ABSTRACT", "EXTENMARK", "KW_GOTO", "KW_JUMP",
-  "KW_RETURN", "KW_BREAK", "KW_CONTINUE", "KW_REGEXTEN", "KW_HINT",
-  "KW_FOR", "KW_WHILE", "KW_CASE", "KW_PATTERN", "KW_DEFAULT", "KW_CATCH",
-  "KW_SWITCHES", "KW_ESWITCHES", "KW_INCLUDES", "KW_LOCAL", "word",
-  "$accept", "file", "objects", "object", "context_name", "context",
-  "opt_abstract", "macro", "globals", "global_statements", "assignment",
-  "@1", "local_assignment", "@2", "arglist", "elements", "element",
-  "ignorepat", "extension", "statements", "timerange", "timespec",
-  "test_expr", "@3", "if_like_head", "word_list", "hint_word",
-  "word3_list", "goto_word", "switch_statement", "statement", "@4", "@5",
-  "@6", "@7", "opt_else", "target", "opt_pri", "jumptarget", "macro_call",
-  "@8", "application_call_head", "@9", "application_call", "opt_word",
-  "eval_arglist", "case_statements", "case_statement", "macro_statements",
-  "macro_statement", "switches", "eswitches", "switchlist",
-  "included_entry", "includeslist", "includes", 0
+  "KW_ELSE", "KW_RANDOM", "KW_ABSTRACT", "KW_EXTEND", "EXTENMARK",
+  "KW_GOTO", "KW_JUMP", "KW_RETURN", "KW_BREAK", "KW_CONTINUE",
+  "KW_REGEXTEN", "KW_HINT", "KW_FOR", "KW_WHILE", "KW_CASE", "KW_PATTERN",
+  "KW_DEFAULT", "KW_CATCH", "KW_SWITCHES", "KW_ESWITCHES", "KW_INCLUDES",
+  "KW_LOCAL", "word", "$accept", "file", "objects", "object",
+  "context_name", "context", "opt_abstract", "macro", "globals",
+  "global_statements", "assignment", "@1", "local_assignment", "@2",
+  "arglist", "elements", "element", "ignorepat", "extension", "statements",
+  "timerange", "timespec", "test_expr", "@3", "if_like_head", "word_list",
+  "hint_word", "word3_list", "goto_word", "switch_statement", "statement",
+  "@4", "@5", "@6", "@7", "opt_else", "target", "opt_pri", "jumptarget",
+  "macro_call", "@8", "application_call_head", "@9", "application_call",
+  "opt_word", "eval_arglist", "case_statements", "case_statement",
+  "macro_statements", "macro_statement", "switches", "eswitches",
+  "switchlist", "included_entry", "includeslist", "includes", 0
 };
 #endif
 
@@ -672,46 +677,48 @@ static const yytype_uint16 yytoknum[] =
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297
+     295,   296,   297,   298
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    43,    44,    45,    45,    45,    46,    46,    46,    46,
-      47,    47,    48,    49,    49,    50,    51,    52,    52,    52,
-      54,    53,    56,    55,    57,    57,    57,    57,    58,    58,
-      58,    59,    59,    59,    59,    59,    59,    59,    59,    59,
-      60,    61,    61,    61,    61,    62,    62,    62,    63,    63,
-      64,    66,    65,    67,    67,    67,    68,    68,    69,    69,
-      69,    69,    70,    70,    70,    71,    71,    71,    72,    73,
-      73,    73,    73,    73,    73,    74,    75,    76,    73,    73,
-      73,    73,    73,    73,    77,    73,    73,    73,    73,    73,
-      73,    78,    78,    79,    79,    79,    79,    79,    79,    79,
-      80,    80,    81,    81,    83,    82,    82,    85,    84,    86,
-      86,    87,    87,    88,    88,    88,    89,    89,    90,    90,
-      90,    91,    91,    92,    92,    92,    93,    94,    95,    95,
-      95,    95,    96,    96,    97,    97,    97,    98,    98
+       0,    44,    45,    46,    46,    46,    47,    47,    47,    47,
+      48,    48,    49,    50,    50,    50,    50,    50,    51,    52,
+      53,    53,    53,    55,    54,    57,    56,    58,    58,    58,
+      58,    59,    59,    59,    60,    60,    60,    60,    60,    60,
+      60,    60,    60,    61,    62,    62,    62,    62,    63,    63,
+      63,    64,    64,    65,    67,    66,    68,    68,    68,    69,
+      69,    70,    70,    70,    70,    71,    71,    71,    72,    72,
+      72,    73,    74,    74,    74,    74,    74,    74,    75,    76,
+      77,    74,    74,    74,    74,    74,    74,    78,    74,    74,
+      74,    74,    74,    74,    79,    79,    80,    80,    80,    80,
+      80,    80,    80,    81,    81,    82,    82,    84,    83,    83,
+      86,    85,    87,    87,    88,    88,    89,    89,    89,    90,
+      90,    91,    91,    91,    92,    92,    93,    93,    93,    94,
+      95,    96,    96,    96,    96,    97,    97,    98,    98,    98,
+      99,    99
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     1,     2,     2,     1,     1,     1,     1,
-       1,     1,     6,     1,     0,     8,     4,     0,     2,     2,
-       0,     5,     0,     6,     0,     1,     3,     2,     0,     2,
-       2,     1,     1,     1,     1,     1,     1,     1,     2,     1,
-       4,     3,     4,     7,     8,     0,     2,     2,     5,     1,
-       7,     0,     4,     2,     2,     4,     1,     2,     1,     2,
-       3,     3,     1,     2,     3,     1,     2,     3,     5,     3,
-       1,     1,     3,     3,     2,     0,     0,     0,    12,     3,
-       1,     3,     2,     2,     0,     5,     2,     2,     2,     3,
-       1,     2,     0,     1,     3,     3,     5,     5,     5,     5,
-       0,     2,     2,     4,     0,     5,     3,     0,     3,     3,
-       2,     1,     0,     1,     0,     3,     0,     2,     4,     3,
-       4,     0,     2,     1,     1,     5,     4,     4,     0,     3,
-       5,     2,     1,     3,     2,     3,     2,     4,     3
+       1,     1,     6,     1,     0,     1,     2,     2,     8,     4,
+       0,     2,     2,     0,     5,     0,     6,     0,     1,     3,
+       2,     0,     2,     2,     1,     1,     1,     1,     1,     1,
+       1,     2,     1,     4,     3,     4,     7,     8,     0,     2,
+       2,     5,     1,     7,     0,     4,     2,     2,     4,     1,
+       2,     1,     2,     3,     3,     1,     2,     3,     1,     2,
+       3,     5,     3,     1,     1,     3,     3,     2,     0,     0,
+       0,    12,     3,     1,     3,     2,     2,     0,     5,     2,
+       2,     2,     3,     1,     2,     0,     1,     3,     3,     5,
+       5,     5,     5,     0,     2,     2,     4,     0,     5,     3,
+       0,     3,     3,     2,     1,     0,     1,     0,     3,     0,
+       2,     4,     3,     4,     0,     2,     1,     1,     5,     4,
+       4,     0,     3,     5,     2,     1,     3,     2,     3,     2,
+       4,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -719,209 +726,207 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-      14,     9,     0,     0,    13,     0,     0,     3,     6,     0,
-       7,     8,     0,     0,     1,     5,     4,     0,    24,     0,
-       0,     0,     0,    11,    10,     0,    25,     0,    19,    20,
-      16,    18,     0,    27,     0,     0,     0,     0,    39,     0,
-       0,     0,     0,     0,     0,     0,     0,    36,    37,     0,
-       0,    35,    31,    33,    34,    32,   121,    26,     0,    30,
-       0,     0,     0,     0,     0,     0,     0,     0,    38,     0,
-      12,    29,     0,    90,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    70,    71,
-       0,    80,   123,   114,     0,     0,   121,   124,    21,     0,
-       0,     0,    58,     0,     0,     0,     0,     0,   138,   132,
-       0,     0,    22,    41,     0,     0,     0,     0,     0,    51,
-       0,    53,     0,    54,     0,    65,    93,     0,   100,     0,
-      87,    86,    88,    75,     0,     0,   107,    83,    74,    92,
-     110,    56,   113,     0,    82,    84,    15,   122,    40,     0,
-      42,     0,     0,     0,    59,   131,     0,     0,   126,   127,
-       0,   134,   136,   137,     0,     0,    47,    69,    46,   104,
-      81,     0,   116,    49,     0,     0,     0,     0,     0,    66,
-       0,     0,     0,    72,     0,   102,    73,     0,    79,     0,
-     108,     0,    89,    57,   109,   112,     0,     0,     0,    60,
-      61,   129,     0,   133,   135,     0,   106,   114,     0,     0,
-       0,     0,     0,   116,    63,     0,    55,     0,     0,     0,
-      95,    67,    94,   101,     0,     0,     0,    91,   111,   115,
-       0,     0,     0,     0,    23,     0,    52,     0,     0,     0,
-      68,   117,    64,    62,     0,     0,     0,     0,     0,     0,
-     103,    76,   125,    85,     0,    43,   130,   105,     0,     0,
-     119,     0,     0,    99,    98,    97,    96,     0,    44,   118,
-     120,     0,    48,     0,     0,    77,    50,     0,     0,     0,
-      78
+      14,     9,     0,     0,    13,    15,     0,     0,     3,     6,
+       0,     7,     8,     0,     0,    17,    16,     1,     5,     4,
+       0,    27,     0,     0,     0,     0,    11,    10,     0,    28,
+       0,    22,    23,    19,    21,     0,    30,     0,     0,     0,
+       0,    42,     0,     0,     0,     0,     0,     0,     0,     0,
+      39,    40,     0,     0,    38,    34,    36,    37,    35,   124,
+      29,     0,    33,     0,     0,     0,     0,     0,     0,     0,
+       0,    41,     0,    12,    32,     0,    93,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    73,    74,     0,    83,   126,   117,     0,     0,   124,
+     127,    24,     0,     0,     0,    61,     0,     0,     0,     0,
+       0,   141,   135,     0,     0,    25,    44,     0,     0,     0,
+       0,     0,    54,     0,    56,     0,    57,     0,    68,    96,
+       0,   103,     0,    90,    89,    91,    78,     0,     0,   110,
+      86,    77,    95,   113,    59,   116,     0,    85,    87,    18,
+     125,    43,     0,    45,     0,     0,     0,    62,   134,     0,
+       0,   129,   130,     0,   137,   139,   140,     0,     0,    50,
+      72,    49,   107,    84,     0,   119,    52,     0,     0,     0,
+       0,     0,    69,     0,     0,     0,    75,     0,   105,    76,
+       0,    82,     0,   111,     0,    92,    60,   112,   115,     0,
+       0,     0,    63,    64,   132,     0,   136,   138,     0,   109,
+     117,     0,     0,     0,     0,     0,   119,    66,     0,    58,
+       0,     0,     0,    98,    70,    97,   104,     0,     0,     0,
+      94,   114,   118,     0,     0,     0,     0,    26,     0,    55,
+       0,     0,     0,    71,   120,    67,    65,     0,     0,     0,
+       0,     0,     0,   106,    79,   128,    88,     0,    46,   133,
+     108,     0,     0,   122,     0,     0,   102,   101,   100,    99,
+       0,    47,   121,   123,     0,    51,     0,     0,    80,    53,
+       0,     0,     0,    81
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     5,     6,     7,   109,     8,     9,    10,    11,    21,
-      88,    36,    89,   165,    27,    49,    50,    51,    52,   115,
-     174,   175,   120,   171,    90,   142,   103,   176,   126,    91,
-     116,   187,   267,   277,   196,   192,   127,   185,   129,   118,
-     207,    93,   190,    94,   229,   143,   212,   213,    95,    96,
-      53,    54,   106,   110,   111,    55
+      -1,     6,     7,     8,   112,     9,    10,    11,    12,    24,
+      91,    39,    92,   168,    30,    52,    53,    54,    55,   118,
+     177,   178,   123,   174,    93,   145,   106,   179,   129,    94,
+     119,   190,   270,   280,   199,   195,   130,   188,   132,   121,
+     210,    96,   193,    97,   232,   146,   215,   216,    98,    99,
+      56,    57,   109,   113,   114,    58
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -210
+#define YYPACT_NINF -213
 static const yytype_int16 yypact[] =
 {
-      66,  -210,   -26,    64,  -210,    88,   110,  -210,  -210,    93,
-    -210,  -210,    95,     9,  -210,  -210,  -210,    72,    30,     9,
-      96,   137,     9,  -210,  -210,   124,  -210,   102,  -210,  -210,
-    -210,  -210,    16,  -210,   154,   120,   144,    16,  -210,   169,
-      33,   208,   197,   212,   216,   187,    62,  -210,  -210,   225,
-      16,  -210,  -210,  -210,  -210,  -210,   155,  -210,   226,  -210,
-     191,   229,   213,   194,    17,    17,     6,   230,  -210,   199,
-    -210,  -210,    65,  -210,   196,   236,   236,   237,   236,    79,
-     202,   238,   239,   240,   243,   236,   203,   204,  -210,  -210,
-     199,  -210,  -210,    -4,   148,   245,   155,  -210,  -210,   244,
-     194,   199,  -210,     8,    17,   108,   246,   248,  -210,   241,
-     247,    25,  -210,  -210,   119,   251,   119,   252,   249,  -210,
-     255,  -210,   218,  -210,    26,   219,   189,   254,   168,   256,
-    -210,  -210,  -210,  -210,   199,   259,  -210,  -210,  -210,   250,
-    -210,   223,  -210,    69,  -210,  -210,  -210,  -210,  -210,    20,
-    -210,   224,   227,   228,  -210,  -210,    17,   231,  -210,  -210,
-     218,  -210,  -210,  -210,   260,   232,  -210,  -210,  -210,   265,
-    -210,   233,   130,    18,   263,   270,   267,   202,   202,  -210,
-     202,   242,   202,  -210,   253,   266,  -210,   257,  -210,    65,
-    -210,   199,  -210,  -210,  -210,   258,   261,   262,   264,  -210,
-    -210,  -210,   271,  -210,  -210,   273,  -210,   233,   275,   268,
-     269,   272,   280,   130,   274,   276,  -210,   276,   179,   106,
-     195,  -210,   123,  -210,    72,   278,   282,  -210,  -210,  -210,
-     281,   277,   199,    17,  -210,   122,  -210,   279,   283,   119,
-    -210,  -210,  -210,   284,   285,   286,   202,   202,   202,   202,
-    -210,  -210,  -210,  -210,   199,  -210,  -210,  -210,   119,   119,
-    -210,   276,   276,   291,   291,   291,   291,   287,  -210,  -210,
-    -210,   292,  -210,   288,   276,  -210,  -210,   289,   299,   199,
-    -210
+     130,  -213,   -22,    32,    20,    28,    72,    93,  -213,  -213,
+      73,  -213,  -213,   118,    14,  -213,  -213,  -213,  -213,  -213,
+      -5,    88,    14,   146,   134,    14,  -213,  -213,   184,  -213,
+     104,  -213,  -213,  -213,  -213,   120,  -213,   186,   115,   151,
+     120,  -213,   171,   -15,   191,   200,   201,   205,   167,    22,
+    -213,  -213,   207,   120,  -213,  -213,  -213,  -213,  -213,   173,
+    -213,   210,  -213,   176,   214,   197,   181,    19,    19,    -2,
+     216,  -213,   209,  -213,  -213,   114,  -213,   183,   224,   224,
+     226,   224,    -4,   202,   232,   238,   239,   228,   224,   206,
+     178,  -213,  -213,   209,  -213,  -213,     3,    78,   243,   173,
+    -213,  -213,   242,   181,   209,  -213,    15,    19,    56,   248,
+     250,  -213,   244,   252,    11,  -213,  -213,    55,   251,    55,
+     255,   254,  -213,   259,  -213,   215,  -213,     1,   221,    58,
+     257,   102,   258,  -213,  -213,  -213,  -213,   209,   263,  -213,
+    -213,  -213,   247,  -213,   227,  -213,    96,  -213,  -213,  -213,
+    -213,  -213,    18,  -213,   230,   231,   233,  -213,  -213,    19,
+     234,  -213,  -213,   215,  -213,  -213,  -213,   261,   235,  -213,
+    -213,  -213,   264,  -213,   236,   143,     7,   262,   273,   270,
+     202,   202,  -213,   202,   240,   202,  -213,   241,   268,  -213,
+     245,  -213,   114,  -213,   209,  -213,  -213,  -213,   246,   249,
+     253,   260,  -213,  -213,  -213,   278,  -213,  -213,   279,  -213,
+     236,   283,   256,   265,   280,   288,   143,   266,   267,  -213,
+     267,   164,   116,   172,  -213,   154,  -213,    -5,   286,   290,
+    -213,  -213,  -213,   289,   275,   209,    19,  -213,   100,  -213,
+     287,   291,    55,  -213,  -213,  -213,   269,   292,   293,   202,
+     202,   202,   202,  -213,  -213,  -213,  -213,   209,  -213,  -213,
+    -213,    55,    55,  -213,   267,   267,   295,   295,   295,   295,
+     271,  -213,  -213,  -213,   294,  -213,   303,   267,  -213,  -213,
+     272,   296,   209,  -213
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -210,  -210,  -210,   301,   -16,  -210,  -210,  -210,  -210,   121,
-     172,  -210,    -9,  -210,  -210,   -25,  -210,  -210,  -210,  -109,
-    -210,   107,   -41,  -210,  -210,   138,   192,  -209,   -78,  -210,
-     -56,  -210,  -210,  -210,  -210,  -210,  -210,  -210,  -210,  -210,
-    -210,  -210,  -210,  -210,  -210,    84,    80,  -210,   217,  -210,
-    -210,  -210,   -61,   201,  -210,   -47
+    -213,  -213,  -213,   306,   -19,  -213,  -213,  -213,  -213,    98,
+     219,  -213,     2,  -213,  -213,    26,  -213,  -213,  -213,  -112,
+    -213,   138,    85,  -213,  -213,   142,   217,  -212,   -81,  -213,
+     -59,  -213,  -213,  -213,  -213,  -213,  -213,  -213,  -213,  -213,
+    -213,  -213,  -213,  -213,  -213,   107,   103,  -213,   222,  -213,
+    -213,  -213,   -64,   204,  -213,   -50
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -129
+#define YYTABLE_NINF -132
 static const yytype_int16 yytable[] =
 {
-      92,    25,   128,   140,   107,   166,   244,   168,   245,    97,
-      19,   108,    59,   113,   -17,   151,    12,    37,   104,   152,
-     153,   -28,  -128,    48,    38,    71,   162,   197,    48,   -62,
-     163,   152,   153,    39,   139,   121,   177,   123,   141,   178,
-      92,    48,    23,   155,   134,   150,    40,    41,    24,    97,
-     154,    20,   271,   272,    42,    43,    44,    45,    46,   105,
-     214,    23,   154,    68,    61,   276,   114,    24,    13,    72,
-     -45,    29,    26,    73,     1,    62,   194,    74,   188,   195,
-     226,     2,     3,    75,    76,    77,    69,    78,    14,     4,
-      79,    80,    81,    82,    83,   201,    17,    84,    85,   218,
-     219,    18,   220,    33,   222,    29,    45,    87,    23,    34,
-      -2,    15,    35,   -14,    24,   124,   156,   181,     1,   247,
-     114,   125,   157,    72,   -45,     2,     3,    73,    32,   257,
-     260,    74,   195,     4,   181,   227,   249,    75,    76,    77,
-      28,    78,    30,    31,    79,    80,    81,    82,    83,   269,
-     270,    84,    85,   -45,   -45,   -45,   144,   145,    56,    72,
-      45,    87,    57,    73,   209,   210,   211,    74,   263,   264,
-     265,   266,   256,    75,    76,    77,   255,    78,   184,   181,
-      79,    80,    81,    82,    83,    22,    58,    84,    85,   246,
-     181,    22,    86,    60,    22,    44,    45,    87,   268,   180,
-     181,    64,   182,    72,    47,   248,   181,    73,   250,    47,
-     136,    74,   137,    29,    63,   138,    65,    75,    76,    77,
-      66,    78,    47,   280,    79,    80,    81,    82,    83,    67,
-      70,    84,    85,    99,    98,   100,   102,   101,   117,   112,
-      45,    87,   119,   122,   125,   135,   130,   131,   132,   133,
-     146,   158,   148,   159,   160,   161,   167,   170,   169,   172,
-     173,   179,   183,   189,   186,   193,   198,   203,   204,   199,
-     200,   191,   206,   202,   205,   141,   215,   216,   217,   233,
-     224,   234,   236,   239,   221,   240,   251,   252,   232,   253,
-     258,   235,   149,   241,   259,   223,   275,   262,   261,   225,
-     228,   254,   181,   230,   231,   274,   279,    16,     0,   208,
-     237,   238,   164,   147,     0,     0,   242,     0,   243,     0,
-       0,     0,     0,     0,     0,     0,   214,     0,     0,   273,
-       0,   278
+      95,    28,   131,   111,   110,   169,   247,   171,   248,   100,
+     143,   180,   165,   116,   181,    22,   166,    64,   -65,   -20,
+     107,    13,   154,    71,  -131,   200,   155,   156,    65,   155,
+     156,    32,    26,   127,   142,    26,    14,    51,    27,   128,
+      95,    27,    51,   158,    15,   153,   144,    72,    26,   100,
+     217,    16,   274,   275,    27,    51,   117,    23,   157,    75,
+     -48,   157,   108,    76,   159,   279,    62,    77,   183,   184,
+     160,   185,    17,    78,    79,    80,    20,    81,   191,    74,
+     229,    82,    83,    84,    85,    86,   147,   148,    87,    88,
+     -48,   -48,   -48,    -2,    18,   204,   -14,    48,    90,   221,
+     222,     1,   223,   197,   225,    36,   198,   260,     2,     3,
+     198,    37,   187,   184,    38,   117,     4,     5,    75,   -48,
+      31,    40,    76,    34,    21,   -31,    77,   184,    41,   250,
+     263,    29,    78,    79,    80,   230,    81,    42,     1,    33,
+      82,    83,    84,    85,    86,     2,     3,    87,    88,   272,
+     273,    43,    44,     4,     5,    32,    48,    90,    60,    45,
+      46,    47,    48,    49,   124,   184,   126,   252,   266,   267,
+     268,   269,   259,   137,   249,   184,   258,    75,   212,   213,
+     214,    76,   251,   184,   139,    77,   140,    32,    35,   141,
+      59,    78,    79,    80,    61,    81,    63,    66,   271,    82,
+      83,    84,    85,    86,    67,    68,    87,    88,   253,    69,
+      70,    89,    73,    75,    47,    48,    90,    76,   101,   102,
+     103,    77,   104,   283,   105,   115,   120,    78,    79,    80,
+     122,    81,   125,    25,   136,    82,    83,    84,    85,    86,
+     133,    25,    87,    88,    25,   128,   134,   135,   149,   138,
+     151,    48,    90,   161,    50,   162,   170,   163,   176,    50,
+     164,   172,   173,   175,   182,   186,   189,   192,   194,   207,
+     196,   209,    50,   201,   202,   218,   203,   205,   208,   144,
+     219,   220,   227,   224,   226,   235,   236,   237,   228,   231,
+     239,   242,   233,   243,   254,   255,   234,   256,   261,   240,
+     257,   206,   262,   282,   265,   264,   184,   277,   241,   245,
+     246,   278,   217,    19,   276,   281,   211,   238,   167,   244,
+     152,   150
 };
 
-static const yytype_int16 yycheck[] =
+static const yytype_uint16 yycheck[] =
 {
-      56,    17,    80,     7,    65,   114,   215,   116,   217,    56,
-       1,     5,    37,    69,     5,     7,    42,     1,     1,    11,
-      12,     5,     5,    32,     8,    50,     1,     7,    37,    11,
-       5,    11,    12,    17,    90,    76,    10,    78,    42,    13,
-      96,    50,    36,   104,    85,   101,    30,    31,    42,    96,
-      42,    42,   261,   262,    38,    39,    40,    41,    42,    42,
-      42,    36,    42,     1,    31,   274,     1,    42,     4,     4,
-       5,     9,    42,     8,     8,    42,     7,    12,   134,    10,
-     189,    15,    16,    18,    19,    20,    24,    22,     0,    23,
-      25,    26,    27,    28,    29,   156,     3,    32,    33,   177,
-     178,     6,   180,     1,   182,     9,    41,    42,    36,     7,
-       0,     1,    10,     3,    42,    36,     8,    11,     8,    13,
-       1,    42,    14,     4,     5,    15,    16,     8,     4,     7,
-     239,    12,    10,    23,    11,   191,    13,    18,    19,    20,
-      19,    22,     5,    22,    25,    26,    27,    28,    29,   258,
-     259,    32,    33,    34,    35,    36,     8,     9,     4,     4,
-      41,    42,    42,     8,    34,    35,    36,    12,   246,   247,
-     248,   249,   233,    18,    19,    20,   232,    22,    10,    11,
-      25,    26,    27,    28,    29,    13,    42,    32,    33,    10,
-      11,    19,    37,    24,    22,    40,    41,    42,   254,    10,
-      11,     4,    13,     4,    32,    10,    11,     8,   224,    37,
-       6,    12,     8,     9,     6,    11,     4,    18,    19,    20,
-       4,    22,    50,   279,    25,    26,    27,    28,    29,    42,
-       5,    32,    33,    42,     8,     6,    42,    24,    42,     9,
-      41,    42,     6,     6,    42,    42,     8,     8,     8,     6,
-       5,     5,     8,     5,    13,     8,     5,     8,     6,     4,
-      42,    42,     8,     4,     8,    42,    42,   160,     8,    42,
-      42,    21,     7,    42,    42,    42,    13,     7,    11,     8,
-      14,     8,     7,    11,    42,     5,     8,     5,    24,     8,
-      11,   207,   100,   213,    11,    42,     8,    11,    13,    42,
-      42,    24,    11,    42,    42,    13,     7,     6,    -1,   171,
-      42,    42,   111,    96,    -1,    -1,    42,    -1,    42,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    42,    -1,    -1,    42,
-      -1,    42
+      59,    20,    83,     5,    68,   117,   218,   119,   220,    59,
+       7,    10,     1,    72,    13,     1,     5,    32,    11,     5,
+       1,    43,     7,     1,     5,     7,    11,    12,    43,    11,
+      12,     9,    37,    37,    93,    37,     4,    35,    43,    43,
+      99,    43,    40,   107,    24,   104,    43,    25,    37,    99,
+      43,    23,   264,   265,    43,    53,     1,    43,    43,     4,
+       5,    43,    43,     8,     8,   277,    40,    12,    10,    11,
+      14,    13,     0,    18,    19,    20,     3,    22,   137,    53,
+     192,    26,    27,    28,    29,    30,     8,     9,    33,    34,
+      35,    36,    37,     0,     1,   159,     3,    42,    43,   180,
+     181,     8,   183,     7,   185,     1,    10,     7,    15,    16,
+      10,     7,    10,    11,    10,     1,    23,    24,     4,     5,
+      22,     1,     8,    25,     6,     5,    12,    11,     8,    13,
+     242,    43,    18,    19,    20,   194,    22,    17,     8,     5,
+      26,    27,    28,    29,    30,    15,    16,    33,    34,   261,
+     262,    31,    32,    23,    24,     9,    42,    43,    43,    39,
+      40,    41,    42,    43,    79,    11,    81,    13,   249,   250,
+     251,   252,   236,    88,    10,    11,   235,     4,    35,    36,
+      37,     8,    10,    11,     6,    12,     8,     9,     4,    11,
+       4,    18,    19,    20,    43,    22,    25,     6,   257,    26,
+      27,    28,    29,    30,     4,     4,    33,    34,   227,     4,
+      43,    38,     5,     4,    41,    42,    43,     8,     8,    43,
+       6,    12,    25,   282,    43,     9,    43,    18,    19,    20,
+       6,    22,     6,    14,     6,    26,    27,    28,    29,    30,
+       8,    22,    33,    34,    25,    43,     8,     8,     5,    43,
+       8,    42,    43,     5,    35,     5,     5,    13,    43,    40,
+       8,     6,     8,     4,    43,     8,     8,     4,    21,     8,
+      43,     7,    53,    43,    43,    13,    43,    43,    43,    43,
+       7,    11,    14,    43,    43,    25,     8,     8,    43,    43,
+       7,    11,    43,     5,     8,     5,    43,     8,    11,    43,
+      25,   163,    11,     7,    11,    13,    11,    13,    43,    43,
+      43,     8,    43,     7,    43,    43,   174,   210,   114,   216,
+     103,    99
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     8,    15,    16,    23,    44,    45,    46,    48,    49,
-      50,    51,    42,     4,     0,     1,    46,     3,     6,     1,
-      42,    52,    53,    36,    42,    47,    42,    57,    52,     9,
-       5,    52,     4,     1,     7,    10,    54,     1,     8,    17,
-      30,    31,    38,    39,    40,    41,    42,    53,    55,    58,
-      59,    60,    61,    93,    94,    98,     4,    42,    42,    58,
-      24,    31,    42,     6,     4,     4,     4,    42,     1,    24,
-       5,    58,     4,     8,    12,    18,    19,    20,    22,    25,
-      26,    27,    28,    29,    32,    33,    37,    42,    53,    55,
-      67,    72,    73,    84,    86,    91,    92,    98,     8,    42,
-       6,    24,    42,    69,     1,    42,    95,    95,     5,    47,
-      96,    97,     9,    73,     1,    62,    73,    42,    82,     6,
-      65,    65,     6,    65,    36,    42,    71,    79,    71,    81,
-       8,     8,     8,     6,    65,    42,     6,     8,    11,    73,
-       7,    42,    68,    88,     8,     9,     5,    91,     8,    69,
-      73,     7,    11,    12,    42,    95,     8,    14,     5,     5,
-      13,     8,     1,     5,    96,    56,    62,     5,    62,     6,
-       8,    66,     4,    42,    63,    64,    70,    10,    13,    42,
-      10,    11,    13,     8,    10,    80,     8,    74,    73,     4,
-      85,    21,    78,    42,     7,    10,    77,     7,    42,    42,
-      42,    95,    42,    64,     8,    42,     7,    83,    68,    34,
-      35,    36,    89,    90,    42,    13,     7,    11,    71,    71,
-      71,    42,    71,    42,    14,    42,    62,    73,    42,    87,
-      42,    42,    24,     8,     8,    88,     7,    42,    42,    11,
-       5,    89,    42,    42,    70,    70,    10,    13,    10,    13,
-      47,     8,     5,     8,    24,    73,    95,     7,    11,    11,
-      62,    13,    11,    71,    71,    71,    71,    75,    73,    62,
-      62,    70,    70,    42,    13,     8,    70,    76,    42,     7,
-      73
+       0,     8,    15,    16,    23,    24,    45,    46,    47,    49,
+      50,    51,    52,    43,     4,    24,    23,     0,     1,    47,
+       3,     6,     1,    43,    53,    54,    37,    43,    48,    43,
+      58,    53,     9,     5,    53,     4,     1,     7,    10,    55,
+       1,     8,    17,    31,    32,    39,    40,    41,    42,    43,
+      54,    56,    59,    60,    61,    62,    94,    95,    99,     4,
+      43,    43,    59,    25,    32,    43,     6,     4,     4,     4,
+      43,     1,    25,     5,    59,     4,     8,    12,    18,    19,
+      20,    22,    26,    27,    28,    29,    30,    33,    34,    38,
+      43,    54,    56,    68,    73,    74,    85,    87,    92,    93,
+      99,     8,    43,     6,    25,    43,    70,     1,    43,    96,
+      96,     5,    48,    97,    98,     9,    74,     1,    63,    74,
+      43,    83,     6,    66,    66,     6,    66,    37,    43,    72,
+      80,    72,    82,     8,     8,     8,     6,    66,    43,     6,
+       8,    11,    74,     7,    43,    69,    89,     8,     9,     5,
+      92,     8,    70,    74,     7,    11,    12,    43,    96,     8,
+      14,     5,     5,    13,     8,     1,     5,    97,    57,    63,
+       5,    63,     6,     8,    67,     4,    43,    64,    65,    71,
+      10,    13,    43,    10,    11,    13,     8,    10,    81,     8,
+      75,    74,     4,    86,    21,    79,    43,     7,    10,    78,
+       7,    43,    43,    43,    96,    43,    65,     8,    43,     7,
+      84,    69,    35,    36,    37,    90,    91,    43,    13,     7,
+      11,    72,    72,    72,    43,    72,    43,    14,    43,    63,
+      74,    43,    88,    43,    43,    25,     8,     8,    89,     7,
+      43,    43,    11,     5,    90,    43,    43,    71,    71,    10,
+      13,    10,    13,    48,     8,     5,     8,    25,    74,    96,
+       7,    11,    11,    63,    13,    11,    72,    72,    72,    72,
+      76,    74,    63,    63,    71,    71,    43,    13,     8,    71,
+      77,    43,     7,    74
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -1443,330 +1448,330 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp, parseio)
 
   switch (yytype)
     {
-      case 42: /* "word" */
+      case 43: /* "word" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
-#line 1450 "ael.tab.c"
+#line 1455 "ael.tab.c"
        break;
-      case 45: /* "objects" */
+      case 46: /* "objects" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1458 "ael.tab.c"
+#line 1463 "ael.tab.c"
        break;
-      case 46: /* "object" */
+      case 47: /* "object" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1466 "ael.tab.c"
+#line 1471 "ael.tab.c"
        break;
-      case 47: /* "context_name" */
+      case 48: /* "context_name" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
-#line 1471 "ael.tab.c"
+#line 1476 "ael.tab.c"
        break;
-      case 48: /* "context" */
+      case 49: /* "context" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1479 "ael.tab.c"
+#line 1484 "ael.tab.c"
        break;
-      case 50: /* "macro" */
+      case 51: /* "macro" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1487 "ael.tab.c"
+#line 1492 "ael.tab.c"
        break;
-      case 51: /* "globals" */
+      case 52: /* "globals" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1495 "ael.tab.c"
+#line 1500 "ael.tab.c"
        break;
-      case 52: /* "global_statements" */
+      case 53: /* "global_statements" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1503 "ael.tab.c"
+#line 1508 "ael.tab.c"
        break;
-      case 53: /* "assignment" */
+      case 54: /* "assignment" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1511 "ael.tab.c"
+#line 1516 "ael.tab.c"
        break;
-      case 55: /* "local_assignment" */
+      case 56: /* "local_assignment" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1519 "ael.tab.c"
+#line 1524 "ael.tab.c"
        break;
-      case 57: /* "arglist" */
+      case 58: /* "arglist" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1527 "ael.tab.c"
+#line 1532 "ael.tab.c"
        break;
-      case 58: /* "elements" */
+      case 59: /* "elements" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1535 "ael.tab.c"
+#line 1540 "ael.tab.c"
        break;
-      case 59: /* "element" */
+      case 60: /* "element" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1543 "ael.tab.c"
+#line 1548 "ael.tab.c"
        break;
-      case 60: /* "ignorepat" */
+      case 61: /* "ignorepat" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1551 "ael.tab.c"
+#line 1556 "ael.tab.c"
        break;
-      case 61: /* "extension" */
+      case 62: /* "extension" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1559 "ael.tab.c"
+#line 1564 "ael.tab.c"
        break;
-      case 62: /* "statements" */
+      case 63: /* "statements" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1567 "ael.tab.c"
+#line 1572 "ael.tab.c"
        break;
-      case 63: /* "timerange" */
+      case 64: /* "timerange" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
-#line 1572 "ael.tab.c"
+#line 1577 "ael.tab.c"
        break;
-      case 64: /* "timespec" */
+      case 65: /* "timespec" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1580 "ael.tab.c"
+#line 1585 "ael.tab.c"
        break;
-      case 65: /* "test_expr" */
+      case 66: /* "test_expr" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
-#line 1585 "ael.tab.c"
+#line 1590 "ael.tab.c"
        break;
-      case 67: /* "if_like_head" */
+      case 68: /* "if_like_head" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1593 "ael.tab.c"
-       break;
-      case 68: /* "word_list" */
-#line 178 "ael.y"
-       { free((yyvaluep->str));};
 #line 1598 "ael.tab.c"
        break;
-      case 70: /* "word3_list" */
+      case 69: /* "word_list" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
 #line 1603 "ael.tab.c"
        break;
-      case 71: /* "goto_word" */
+      case 71: /* "word3_list" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
 #line 1608 "ael.tab.c"
        break;
-      case 72: /* "switch_statement" */
+      case 72: /* "goto_word" */
+#line 178 "ael.y"
+       { free((yyvaluep->str));};
+#line 1613 "ael.tab.c"
+       break;
+      case 73: /* "switch_statement" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1616 "ael.tab.c"
+#line 1621 "ael.tab.c"
        break;
-      case 73: /* "statement" */
+      case 74: /* "statement" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1624 "ael.tab.c"
+#line 1629 "ael.tab.c"
        break;
-      case 78: /* "opt_else" */
+      case 79: /* "opt_else" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1632 "ael.tab.c"
+#line 1637 "ael.tab.c"
        break;
-      case 79: /* "target" */
+      case 80: /* "target" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1640 "ael.tab.c"
+#line 1645 "ael.tab.c"
        break;
-      case 80: /* "opt_pri" */
+      case 81: /* "opt_pri" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
-#line 1645 "ael.tab.c"
+#line 1650 "ael.tab.c"
        break;
-      case 81: /* "jumptarget" */
+      case 82: /* "jumptarget" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1653 "ael.tab.c"
+#line 1658 "ael.tab.c"
        break;
-      case 82: /* "macro_call" */
+      case 83: /* "macro_call" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1661 "ael.tab.c"
+#line 1666 "ael.tab.c"
        break;
-      case 84: /* "application_call_head" */
+      case 85: /* "application_call_head" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1669 "ael.tab.c"
+#line 1674 "ael.tab.c"
        break;
-      case 86: /* "application_call" */
+      case 87: /* "application_call" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1677 "ael.tab.c"
+#line 1682 "ael.tab.c"
        break;
-      case 87: /* "opt_word" */
+      case 88: /* "opt_word" */
 #line 178 "ael.y"
        { free((yyvaluep->str));};
-#line 1682 "ael.tab.c"
+#line 1687 "ael.tab.c"
        break;
-      case 88: /* "eval_arglist" */
+      case 89: /* "eval_arglist" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1690 "ael.tab.c"
+#line 1695 "ael.tab.c"
        break;
-      case 89: /* "case_statements" */
+      case 90: /* "case_statements" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1698 "ael.tab.c"
+#line 1703 "ael.tab.c"
        break;
-      case 90: /* "case_statement" */
+      case 91: /* "case_statement" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1706 "ael.tab.c"
+#line 1711 "ael.tab.c"
        break;
-      case 91: /* "macro_statements" */
+      case 92: /* "macro_statements" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1714 "ael.tab.c"
+#line 1719 "ael.tab.c"
        break;
-      case 92: /* "macro_statement" */
+      case 93: /* "macro_statement" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1722 "ael.tab.c"
+#line 1727 "ael.tab.c"
        break;
-      case 93: /* "switches" */
+      case 94: /* "switches" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1730 "ael.tab.c"
+#line 1735 "ael.tab.c"
        break;
-      case 94: /* "eswitches" */
+      case 95: /* "eswitches" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1738 "ael.tab.c"
+#line 1743 "ael.tab.c"
        break;
-      case 95: /* "switchlist" */
+      case 96: /* "switchlist" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1746 "ael.tab.c"
+#line 1751 "ael.tab.c"
        break;
-      case 96: /* "included_entry" */
+      case 97: /* "included_entry" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1754 "ael.tab.c"
+#line 1759 "ael.tab.c"
        break;
-      case 97: /* "includeslist" */
+      case 98: /* "includeslist" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1762 "ael.tab.c"
+#line 1767 "ael.tab.c"
        break;
-      case 98: /* "includes" */
+      case 99: /* "includes" */
 #line 165 "ael.y"
        {
                destroy_pval((yyvaluep->pval));
                prev_word=0;
        };
-#line 1770 "ael.tab.c"
+#line 1775 "ael.tab.c"
        break;
 
       default:
@@ -2141,183 +2146,192 @@ yyreduce:
   case 12:
 #line 204 "ael.y"
     {
-               if (!(yyvsp[(5) - (6)].pval)) {
-                        ast_log(LOG_WARNING, "==== File: %s, Line %d, Cols: %d-%d: Warning! The empty context %s will be IGNORED!\n", 
-                               my_file, (yylsp[(4) - (6)]).first_line, (yylsp[(4) - (6)]).first_column, (yylsp[(4) - (6)]).last_column, (yyvsp[(3) - (6)].str) );
-                       (yyval.pval) = 0;
-                       free((yyvsp[(3) - (6)].str));
-               } else {
-                       (yyval.pval) = npval2(PV_CONTEXT, &(yylsp[(1) - (6)]), &(yylsp[(6) - (6)]));
-                       (yyval.pval)->u1.str = (yyvsp[(3) - (6)].str);
-                       (yyval.pval)->u2.statements = (yyvsp[(5) - (6)].pval);
-                       set_dads((yyval.pval),(yyvsp[(5) - (6)].pval));
-                       (yyval.pval)->u3.abstract = (yyvsp[(1) - (6)].intval);} ;}
+               (yyval.pval) = npval2(PV_CONTEXT, &(yylsp[(1) - (6)]), &(yylsp[(6) - (6)]));
+               (yyval.pval)->u1.str = (yyvsp[(3) - (6)].str);
+               (yyval.pval)->u2.statements = (yyvsp[(5) - (6)].pval);
+               set_dads((yyval.pval),(yyvsp[(5) - (6)].pval));
+               (yyval.pval)->u3.abstract = (yyvsp[(1) - (6)].intval);;}
     break;
 
   case 13:
-#line 219 "ael.y"
+#line 213 "ael.y"
     { (yyval.intval) = 1; ;}
     break;
 
   case 14:
-#line 220 "ael.y"
+#line 214 "ael.y"
     { (yyval.intval) = 0; ;}
     break;
 
   case 15:
-#line 223 "ael.y"
+#line 215 "ael.y"
+    { (yyval.intval) = 2; ;}
+    break;
+
+  case 16:
+#line 216 "ael.y"
+    { (yyval.intval)=3; ;}
+    break;
+
+  case 17:
+#line 217 "ael.y"
+    { (yyval.intval)=3; ;}
+    break;
+
+  case 18:
+#line 220 "ael.y"
     {
                (yyval.pval) = npval2(PV_MACRO, &(yylsp[(1) - (8)]), &(yylsp[(8) - (8)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (8)].str); (yyval.pval)->u2.arglist = (yyvsp[(4) - (8)].pval); (yyval.pval)->u3.macro_statements = (yyvsp[(7) - (8)].pval);
         set_dads((yyval.pval),(yyvsp[(7) - (8)].pval));;}
     break;
 
-  case 16:
-#line 229 "ael.y"
+  case 19:
+#line 226 "ael.y"
     {
                (yyval.pval) = npval2(PV_GLOBALS, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
                (yyval.pval)->u1.statements = (yyvsp[(3) - (4)].pval);
         set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 17:
-#line 235 "ael.y"
+  case 20:
+#line 232 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 18:
-#line 236 "ael.y"
+  case 21:
+#line 233 "ael.y"
     {(yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 19:
-#line 237 "ael.y"
+  case 22:
+#line 234 "ael.y"
     {(yyval.pval)=(yyvsp[(2) - (2)].pval);;}
     break;
 
-  case 20:
-#line 240 "ael.y"
+  case 23:
+#line 237 "ael.y"
     { reset_semicount(parseio->scanner); ;}
     break;
 
-  case 21:
-#line 240 "ael.y"
+  case 24:
+#line 237 "ael.y"
     {
                (yyval.pval) = npval2(PV_VARDEC, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
                (yyval.pval)->u1.str = (yyvsp[(1) - (5)].str);
                (yyval.pval)->u2.val = (yyvsp[(4) - (5)].str); ;}
     break;
 
-  case 22:
-#line 246 "ael.y"
+  case 25:
+#line 243 "ael.y"
     { reset_semicount(parseio->scanner); ;}
     break;
 
-  case 23:
-#line 246 "ael.y"
+  case 26:
+#line 243 "ael.y"
     {
                (yyval.pval) = npval2(PV_LOCALVARDEC, &(yylsp[(1) - (6)]), &(yylsp[(6) - (6)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (6)].str);
                (yyval.pval)->u2.val = (yyvsp[(5) - (6)].str); ;}
     break;
 
-  case 24:
-#line 253 "ael.y"
+  case 27:
+#line 250 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 25:
-#line 254 "ael.y"
+  case 28:
+#line 251 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 26:
-#line 255 "ael.y"
+  case 29:
+#line 252 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)]))); ;}
     break;
 
-  case 27:
-#line 256 "ael.y"
+  case 30:
+#line 253 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
-  case 28:
-#line 259 "ael.y"
+  case 31:
+#line 256 "ael.y"
     {(yyval.pval)=0;;}
     break;
 
-  case 29:
-#line 260 "ael.y"
+  case 32:
+#line 257 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 30:
-#line 261 "ael.y"
+  case 33:
+#line 258 "ael.y"
     { (yyval.pval)=(yyvsp[(2) - (2)].pval);;}
     break;
 
-  case 31:
-#line 264 "ael.y"
+  case 34:
+#line 261 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 32:
-#line 265 "ael.y"
+  case 35:
+#line 262 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 33:
-#line 266 "ael.y"
+  case 36:
+#line 263 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 34:
-#line 267 "ael.y"
+  case 37:
+#line 264 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 35:
-#line 268 "ael.y"
+  case 38:
+#line 265 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 36:
-#line 269 "ael.y"
+  case 39:
+#line 266 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 37:
-#line 270 "ael.y"
+  case 40:
+#line 267 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 38:
-#line 271 "ael.y"
+  case 41:
+#line 268 "ael.y"
     {free((yyvsp[(1) - (2)].str)); (yyval.pval)=0;;}
     break;
 
-  case 39:
-#line 272 "ael.y"
+  case 42:
+#line 269 "ael.y"
     {(yyval.pval)=0;/* allow older docs to be read */;}
     break;
 
-  case 40:
-#line 275 "ael.y"
+  case 43:
+#line 272 "ael.y"
     {
                (yyval.pval) = npval2(PV_IGNOREPAT, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
                (yyval.pval)->u1.str = (yyvsp[(3) - (4)].str);;}
     break;
 
-  case 41:
-#line 280 "ael.y"
+  case 44:
+#line 277 "ael.y"
     {
                (yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.str = (yyvsp[(1) - (3)].str);
                (yyval.pval)->u2.statements = (yyvsp[(3) - (3)].pval); set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 42:
-#line 284 "ael.y"
+  case 45:
+#line 281 "ael.y"
     {
                (yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (4)].str);
@@ -2325,8 +2339,8 @@ yyreduce:
                (yyval.pval)->u4.regexten=1;;}
     break;
 
-  case 43:
-#line 289 "ael.y"
+  case 46:
+#line 286 "ael.y"
     {
                (yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (7)]), &(yylsp[(7) - (7)]));
                (yyval.pval)->u1.str = (yyvsp[(5) - (7)].str);
@@ -2334,8 +2348,8 @@ yyreduce:
                (yyval.pval)->u3.hints = (yyvsp[(3) - (7)].str);;}
     break;
 
-  case 44:
-#line 294 "ael.y"
+  case 47:
+#line 291 "ael.y"
     {
                (yyval.pval) = npval2(PV_EXTENSION, &(yylsp[(1) - (8)]), &(yylsp[(8) - (8)]));
                (yyval.pval)->u1.str = (yyvsp[(6) - (8)].str);
@@ -2344,23 +2358,23 @@ yyreduce:
                (yyval.pval)->u3.hints = (yyvsp[(4) - (8)].str);;}
     break;
 
-  case 45:
-#line 304 "ael.y"
+  case 48:
+#line 301 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 46:
-#line 305 "ael.y"
+  case 49:
+#line 302 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 47:
-#line 306 "ael.y"
+  case 50:
+#line 303 "ael.y"
     {(yyval.pval)=(yyvsp[(2) - (2)].pval);;}
     break;
 
-  case 48:
-#line 312 "ael.y"
+  case 51:
+#line 309 "ael.y"
     {
                asprintf(&(yyval.str), "%s:%s:%s", (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str));
                free((yyvsp[(1) - (5)].str));
@@ -2368,13 +2382,13 @@ yyreduce:
                free((yyvsp[(5) - (5)].str)); ;}
     break;
 
-  case 49:
-#line 317 "ael.y"
+  case 52:
+#line 314 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
     break;
 
-  case 50:
-#line 321 "ael.y"
+  case 53:
+#line 318 "ael.y"
     {
                (yyval.pval) = nword((yyvsp[(1) - (7)].str), &(yylsp[(1) - (7)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (7)].str), &(yylsp[(3) - (7)]));
@@ -2382,45 +2396,45 @@ yyreduce:
                (yyval.pval)->next->next->next = nword((yyvsp[(7) - (7)].str), &(yylsp[(7) - (7)])); ;}
     break;
 
-  case 51:
-#line 329 "ael.y"
+  case 54:
+#line 326 "ael.y"
     { reset_parencount(parseio->scanner); ;}
     break;
 
-  case 52:
-#line 329 "ael.y"
+  case 55:
+#line 326 "ael.y"
     { (yyval.str) = (yyvsp[(3) - (4)].str); ;}
     break;
 
-  case 53:
-#line 333 "ael.y"
+  case 56:
+#line 330 "ael.y"
     {
                (yyval.pval)= npval2(PV_IF, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (2)].str); ;}
     break;
 
-  case 54:
-#line 336 "ael.y"
+  case 57:
+#line 333 "ael.y"
     {
                (yyval.pval) = npval2(PV_RANDOM, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
                (yyval.pval)->u1.str=(yyvsp[(2) - (2)].str);;}
     break;
 
-  case 55:
-#line 339 "ael.y"
+  case 58:
+#line 336 "ael.y"
     {
                (yyval.pval) = npval2(PV_IFTIME, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
                (yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval);
                prev_word = 0; ;}
     break;
 
-  case 56:
-#line 350 "ael.y"
+  case 59:
+#line 347 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str);;}
     break;
 
-  case 57:
-#line 351 "ael.y"
+  case 60:
+#line 348 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
                free((yyvsp[(1) - (2)].str));
@@ -2428,42 +2442,42 @@ yyreduce:
                prev_word = (yyval.str);;}
     break;
 
-  case 58:
-#line 358 "ael.y"
+  case 61:
+#line 355 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
     break;
 
-  case 59:
-#line 359 "ael.y"
+  case 62:
+#line 356 "ael.y"
     {
                asprintf(&((yyval.str)), "%s %s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
                free((yyvsp[(1) - (2)].str));
                free((yyvsp[(2) - (2)].str)); ;}
     break;
 
-  case 60:
-#line 363 "ael.y"
+  case 63:
+#line 360 "ael.y"
     {
                asprintf(&((yyval.str)), "%s:%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str));
                free((yyvsp[(1) - (3)].str));
                free((yyvsp[(3) - (3)].str)); ;}
     break;
 
-  case 61:
-#line 367 "ael.y"
+  case 64:
+#line 364 "ael.y"
     {  /* there are often '&' in hints */
                asprintf(&((yyval.str)), "%s&%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str));
                free((yyvsp[(1) - (3)].str));
                free((yyvsp[(3) - (3)].str));;}
     break;
 
-  case 62:
-#line 373 "ael.y"
+  case 65:
+#line 370 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str);;}
     break;
 
-  case 63:
-#line 374 "ael.y"
+  case 66:
+#line 371 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
                free((yyvsp[(1) - (2)].str));
@@ -2471,8 +2485,8 @@ yyreduce:
                prev_word = (yyval.str);;}
     break;
 
-  case 64:
-#line 379 "ael.y"
+  case 67:
+#line 376 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s%s", (yyvsp[(1) - (3)].str), (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str));
                free((yyvsp[(1) - (3)].str));
@@ -2481,90 +2495,90 @@ yyreduce:
                prev_word=(yyval.str);;}
     break;
 
-  case 65:
-#line 387 "ael.y"
+  case 68:
+#line 384 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str);;}
     break;
 
-  case 66:
-#line 388 "ael.y"
+  case 69:
+#line 385 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s", (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].str));
                free((yyvsp[(1) - (2)].str));
                free((yyvsp[(2) - (2)].str));;}
     break;
 
-  case 67:
-#line 392 "ael.y"
+  case 70:
+#line 389 "ael.y"
     {
                asprintf(&((yyval.str)), "%s:%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str));
                free((yyvsp[(1) - (3)].str));
                free((yyvsp[(3) - (3)].str));;}
     break;
 
-  case 68:
-#line 398 "ael.y"
+  case 71:
+#line 395 "ael.y"
     {
                (yyval.pval) = npval2(PV_SWITCH, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (5)].str);
                (yyval.pval)->u2.statements = (yyvsp[(4) - (5)].pval); set_dads((yyval.pval),(yyvsp[(4) - (5)].pval));;}
     break;
 
-  case 69:
-#line 407 "ael.y"
+  case 72:
+#line 404 "ael.y"
     {
                (yyval.pval) = npval2(PV_STATEMENTBLOCK, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.list = (yyvsp[(2) - (3)].pval); set_dads((yyval.pval),(yyvsp[(2) - (3)].pval));;}
     break;
 
-  case 70:
-#line 410 "ael.y"
+  case 73:
+#line 407 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (1)].pval); ;}
     break;
 
-  case 71:
-#line 411 "ael.y"
+  case 74:
+#line 408 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (1)].pval); ;}
     break;
 
-  case 72:
-#line 412 "ael.y"
+  case 75:
+#line 409 "ael.y"
     {
                (yyval.pval) = npval2(PV_GOTO, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.list = (yyvsp[(2) - (3)].pval);;}
     break;
 
-  case 73:
-#line 415 "ael.y"
+  case 76:
+#line 412 "ael.y"
     {
                (yyval.pval) = npval2(PV_GOTO, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.list = (yyvsp[(2) - (3)].pval);;}
     break;
 
-  case 74:
-#line 418 "ael.y"
+  case 77:
+#line 415 "ael.y"
     {
                (yyval.pval) = npval2(PV_LABEL, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
                (yyval.pval)->u1.str = (yyvsp[(1) - (2)].str); ;}
     break;
 
-  case 75:
-#line 421 "ael.y"
+  case 78:
+#line 418 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
-  case 76:
-#line 422 "ael.y"
+  case 79:
+#line 419 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
-  case 77:
-#line 423 "ael.y"
+  case 80:
+#line 420 "ael.y"
     {reset_parencount(parseio->scanner);;}
     break;
 
-  case 78:
-#line 423 "ael.y"
+  case 81:
+#line 420 "ael.y"
     { /* XXX word_list maybe ? */
                (yyval.pval) = npval2(PV_FOR, &(yylsp[(1) - (12)]), &(yylsp[(12) - (12)]));
                (yyval.pval)->u1.for_init = (yyvsp[(4) - (12)].str);
@@ -2573,43 +2587,43 @@ yyreduce:
                (yyval.pval)->u4.for_statements = (yyvsp[(12) - (12)].pval); set_dads((yyval.pval),(yyvsp[(12) - (12)].pval));;}
     break;
 
-  case 79:
-#line 429 "ael.y"
+  case 82:
+#line 426 "ael.y"
     {
                (yyval.pval) = npval2(PV_WHILE, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (3)].str);
                (yyval.pval)->u2.statements = (yyvsp[(3) - (3)].pval); set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 80:
-#line 433 "ael.y"
+  case 83:
+#line 430 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (1)].pval); ;}
     break;
 
-  case 81:
-#line 434 "ael.y"
+  case 84:
+#line 431 "ael.y"
     { (yyval.pval) = update_last((yyvsp[(2) - (3)].pval), &(yylsp[(2) - (3)])); ;}
     break;
 
-  case 82:
-#line 435 "ael.y"
+  case 85:
+#line 432 "ael.y"
     { (yyval.pval) = update_last((yyvsp[(1) - (2)].pval), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 83:
-#line 436 "ael.y"
+  case 86:
+#line 433 "ael.y"
     {
                (yyval.pval)= npval2(PV_APPLICATION_CALL, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)]));
                (yyval.pval)->u1.str = (yyvsp[(1) - (2)].str);;}
     break;
 
-  case 84:
-#line 439 "ael.y"
+  case 87:
+#line 436 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
-  case 85:
-#line 439 "ael.y"
+  case 88:
+#line 436 "ael.y"
     {
                char *bufx;
                int tot=0;
@@ -2645,127 +2659,127 @@ yyreduce:
        ;}
     break;
 
-  case 86:
-#line 472 "ael.y"
+  case 89:
+#line 469 "ael.y"
     { (yyval.pval) = npval2(PV_BREAK, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 87:
-#line 473 "ael.y"
+  case 90:
+#line 470 "ael.y"
     { (yyval.pval) = npval2(PV_RETURN, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 88:
-#line 474 "ael.y"
+  case 91:
+#line 471 "ael.y"
     { (yyval.pval) = npval2(PV_CONTINUE, &(yylsp[(1) - (2)]), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 89:
-#line 475 "ael.y"
+  case 92:
+#line 472 "ael.y"
     {
                (yyval.pval) = update_last((yyvsp[(1) - (3)].pval), &(yylsp[(2) - (3)]));
                (yyval.pval)->u2.statements = (yyvsp[(2) - (3)].pval); set_dads((yyval.pval),(yyvsp[(2) - (3)].pval));
                (yyval.pval)->u3.else_statements = (yyvsp[(3) - (3)].pval);set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 90:
-#line 479 "ael.y"
+  case 93:
+#line 476 "ael.y"
     { (yyval.pval)=0; ;}
     break;
 
-  case 91:
-#line 482 "ael.y"
+  case 94:
+#line 479 "ael.y"
     { (yyval.pval) = (yyvsp[(2) - (2)].pval); ;}
     break;
 
-  case 92:
-#line 483 "ael.y"
+  case 95:
+#line 480 "ael.y"
     { (yyval.pval) = NULL ; ;}
     break;
 
-  case 93:
-#line 486 "ael.y"
+  case 96:
+#line 483 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 94:
-#line 487 "ael.y"
+  case 97:
+#line 484 "ael.y"
     {
                (yyval.pval) = nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)])); ;}
     break;
 
-  case 95:
-#line 490 "ael.y"
+  case 98:
+#line 487 "ael.y"
     {
                (yyval.pval) = nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)])); ;}
     break;
 
-  case 96:
-#line 493 "ael.y"
+  case 99:
+#line 490 "ael.y"
     {
                (yyval.pval) = nword((yyvsp[(1) - (5)].str), &(yylsp[(1) - (5)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
                (yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 97:
-#line 497 "ael.y"
+  case 100:
+#line 494 "ael.y"
     {
                (yyval.pval) = nword((yyvsp[(1) - (5)].str), &(yylsp[(1) - (5)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
                (yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 98:
-#line 501 "ael.y"
+  case 101:
+#line 498 "ael.y"
     {
                (yyval.pval) = nword(strdup("default"), &(yylsp[(1) - (5)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
                (yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 99:
-#line 505 "ael.y"
+  case 102:
+#line 502 "ael.y"
     {
                (yyval.pval) = nword(strdup("default"), &(yylsp[(1) - (5)]));
                (yyval.pval)->next = nword((yyvsp[(3) - (5)].str), &(yylsp[(3) - (5)]));
                (yyval.pval)->next->next = nword((yyvsp[(5) - (5)].str), &(yylsp[(5) - (5)])); ;}
     break;
 
-  case 100:
-#line 511 "ael.y"
+  case 103:
+#line 508 "ael.y"
     { (yyval.str) = strdup("1"); ;}
     break;
 
-  case 101:
-#line 512 "ael.y"
+  case 104:
+#line 509 "ael.y"
     { (yyval.str) = (yyvsp[(2) - (2)].str); ;}
     break;
 
-  case 102:
-#line 516 "ael.y"
+  case 105:
+#line 513 "ael.y"
     {                  /* ext[, pri] default 1 */
                (yyval.pval) = nword((yyvsp[(1) - (2)].str), &(yylsp[(1) - (2)]));
                (yyval.pval)->next = nword((yyvsp[(2) - (2)].str), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 103:
-#line 519 "ael.y"
+  case 106:
+#line 516 "ael.y"
     {  /* context, ext, pri */
                (yyval.pval) = nword((yyvsp[(4) - (4)].str), &(yylsp[(4) - (4)]));
                (yyval.pval)->next = nword((yyvsp[(1) - (4)].str), &(yylsp[(1) - (4)]));
                (yyval.pval)->next->next = nword((yyvsp[(2) - (4)].str), &(yylsp[(2) - (4)])); ;}
     break;
 
-  case 104:
-#line 525 "ael.y"
+  case 107:
+#line 522 "ael.y"
     {reset_argcount(parseio->scanner);;}
     break;
 
-  case 105:
-#line 525 "ael.y"
+  case 108:
+#line 522 "ael.y"
     {
                /* XXX original code had @2 but i think we need @5 */
                (yyval.pval) = npval2(PV_MACRO_CALL, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
@@ -2773,20 +2787,20 @@ yyreduce:
                (yyval.pval)->u2.arglist = (yyvsp[(4) - (5)].pval);;}
     break;
 
-  case 106:
-#line 530 "ael.y"
+  case 109:
+#line 527 "ael.y"
     {
                (yyval.pval)= npval2(PV_MACRO_CALL, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.str = (yyvsp[(1) - (3)].str); ;}
     break;
 
-  case 107:
-#line 538 "ael.y"
+  case 110:
+#line 535 "ael.y"
     {reset_argcount(parseio->scanner);;}
     break;
 
-  case 108:
-#line 538 "ael.y"
+  case 111:
+#line 535 "ael.y"
     {
                if (strcasecmp((yyvsp[(1) - (3)].str),"goto") == 0) {
                        (yyval.pval) = npval2(PV_GOTO, &(yylsp[(1) - (3)]), &(yylsp[(2) - (3)]));
@@ -2798,8 +2812,8 @@ yyreduce:
                } ;}
     break;
 
-  case 109:
-#line 549 "ael.y"
+  case 112:
+#line 546 "ael.y"
     {
                (yyval.pval) = update_last((yyvsp[(1) - (3)].pval), &(yylsp[(3) - (3)]));
                if( (yyval.pval)->type == PV_GOTO )
@@ -2809,179 +2823,179 @@ yyreduce:
        ;}
     break;
 
-  case 110:
-#line 556 "ael.y"
+  case 113:
+#line 553 "ael.y"
     { (yyval.pval) = update_last((yyvsp[(1) - (2)].pval), &(yylsp[(2) - (2)])); ;}
     break;
 
-  case 111:
-#line 559 "ael.y"
+  case 114:
+#line 556 "ael.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str) ;}
     break;
 
-  case 112:
-#line 560 "ael.y"
+  case 115:
+#line 557 "ael.y"
     { (yyval.str) = strdup(""); ;}
     break;
 
-  case 113:
-#line 563 "ael.y"
+  case 116:
+#line 560 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 114:
-#line 564 "ael.y"
+  case 117:
+#line 561 "ael.y"
     {
                (yyval.pval)= npval(PV_WORD,0/*@1.first_line*/,0/*@1.last_line*/,0/* @1.first_column*/, 0/*@1.last_column*/);
                (yyval.pval)->u1.str = strdup(""); ;}
     break;
 
-  case 115:
-#line 567 "ael.y"
+  case 118:
+#line 564 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), nword((yyvsp[(3) - (3)].str), &(yylsp[(3) - (3)]))); ;}
     break;
 
-  case 116:
-#line 570 "ael.y"
+  case 119:
+#line 567 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 117:
-#line 571 "ael.y"
+  case 120:
+#line 568 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 118:
-#line 574 "ael.y"
+  case 121:
+#line 571 "ael.y"
     {
                (yyval.pval) = npval2(PV_CASE, &(yylsp[(1) - (4)]), &(yylsp[(3) - (4)])); /* XXX 3 or 4 ? */
                (yyval.pval)->u1.str = (yyvsp[(2) - (4)].str);
                (yyval.pval)->u2.statements = (yyvsp[(4) - (4)].pval); set_dads((yyval.pval),(yyvsp[(4) - (4)].pval));;}
     break;
 
-  case 119:
-#line 578 "ael.y"
+  case 122:
+#line 575 "ael.y"
     {
                (yyval.pval) = npval2(PV_DEFAULT, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));
                (yyval.pval)->u1.str = NULL;
                (yyval.pval)->u2.statements = (yyvsp[(3) - (3)].pval);set_dads((yyval.pval),(yyvsp[(3) - (3)].pval));;}
     break;
 
-  case 120:
-#line 582 "ael.y"
+  case 123:
+#line 579 "ael.y"
     {
                (yyval.pval) = npval2(PV_PATTERN, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)])); /* XXX@3 or @4 ? */
                (yyval.pval)->u1.str = (yyvsp[(2) - (4)].str);
                (yyval.pval)->u2.statements = (yyvsp[(4) - (4)].pval);set_dads((yyval.pval),(yyvsp[(4) - (4)].pval));;}
     break;
 
-  case 121:
-#line 588 "ael.y"
+  case 124:
+#line 585 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 122:
-#line 589 "ael.y"
+  case 125:
+#line 586 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (2)].pval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
-  case 123:
-#line 592 "ael.y"
+  case 126:
+#line 589 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 124:
-#line 593 "ael.y"
+  case 127:
+#line 590 "ael.y"
     { (yyval.pval)=(yyvsp[(1) - (1)].pval);;}
     break;
 
-  case 125:
-#line 594 "ael.y"
+  case 128:
+#line 591 "ael.y"
     {
                (yyval.pval) = npval2(PV_CATCH, &(yylsp[(1) - (5)]), &(yylsp[(5) - (5)]));
                (yyval.pval)->u1.str = (yyvsp[(2) - (5)].str);
                (yyval.pval)->u2.statements = (yyvsp[(4) - (5)].pval); set_dads((yyval.pval),(yyvsp[(4) - (5)].pval));;}
     break;
 
-  case 126:
-#line 600 "ael.y"
+  case 129:
+#line 597 "ael.y"
     {
                (yyval.pval) = npval2(PV_SWITCHES, &(yylsp[(1) - (4)]), &(yylsp[(2) - (4)]));
                (yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval); set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 127:
-#line 605 "ael.y"
+  case 130:
+#line 602 "ael.y"
     {
                (yyval.pval) = npval2(PV_ESWITCHES, &(yylsp[(1) - (4)]), &(yylsp[(2) - (4)]));
                (yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval); set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 128:
-#line 610 "ael.y"
+  case 131:
+#line 607 "ael.y"
     { (yyval.pval) = NULL; ;}
     break;
 
-  case 129:
-#line 611 "ael.y"
+  case 132:
+#line 608 "ael.y"
     { (yyval.pval) = linku1(nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)])), (yyvsp[(3) - (3)].pval)); ;}
     break;
 
-  case 130:
-#line 612 "ael.y"
+  case 133:
+#line 609 "ael.y"
     { char *x; asprintf(&x,"%s@%s", (yyvsp[(1) - (5)].str),(yyvsp[(3) - (5)].str)); free((yyvsp[(1) - (5)].str)); free((yyvsp[(3) - (5)].str));
                                                                          (yyval.pval) = linku1(nword(x, &(yylsp[(1) - (5)])), (yyvsp[(5) - (5)].pval));;}
     break;
 
-  case 131:
-#line 614 "ael.y"
+  case 134:
+#line 611 "ael.y"
     {(yyval.pval)=(yyvsp[(2) - (2)].pval);;}
     break;
 
-  case 132:
-#line 617 "ael.y"
+  case 135:
+#line 614 "ael.y"
     { (yyval.pval) = nword((yyvsp[(1) - (1)].str), &(yylsp[(1) - (1)])); ;}
     break;
 
-  case 133:
-#line 618 "ael.y"
+  case 136:
+#line 615 "ael.y"
     {
                (yyval.pval) = nword((yyvsp[(1) - (3)].str), &(yylsp[(1) - (3)]));
                (yyval.pval)->u2.arglist = (yyvsp[(3) - (3)].pval);
                prev_word=0; /* XXX sure ? */ ;}
     break;
 
-  case 134:
-#line 625 "ael.y"
+  case 137:
+#line 622 "ael.y"
     { (yyval.pval) = (yyvsp[(1) - (2)].pval); ;}
     break;
 
-  case 135:
-#line 626 "ael.y"
+  case 138:
+#line 623 "ael.y"
     { (yyval.pval) = linku1((yyvsp[(1) - (3)].pval), (yyvsp[(2) - (3)].pval)); ;}
     break;
 
-  case 136:
-#line 627 "ael.y"
+  case 139:
+#line 624 "ael.y"
     {(yyval.pval)=(yyvsp[(1) - (2)].pval);;}
     break;
 
-  case 137:
-#line 630 "ael.y"
+  case 140:
+#line 627 "ael.y"
     {
                (yyval.pval) = npval2(PV_INCLUDES, &(yylsp[(1) - (4)]), &(yylsp[(4) - (4)]));
                (yyval.pval)->u1.list = (yyvsp[(3) - (4)].pval);set_dads((yyval.pval),(yyvsp[(3) - (4)].pval));;}
     break;
 
-  case 138:
-#line 633 "ael.y"
+  case 141:
+#line 630 "ael.y"
     {
                (yyval.pval) = npval2(PV_INCLUDES, &(yylsp[(1) - (3)]), &(yylsp[(3) - (3)]));;}
     break;
 
 
 /* Line 1270 of yacc.c.  */
-#line 2985 "ael.tab.c"
+#line 2999 "ael.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3200,7 +3214,7 @@ yyreturn:
 }
 
 
-#line 638 "ael.y"
+#line 635 "ael.y"
 
 
 static char *token_equivs1[] =
index 4036c07..95b0118 100644 (file)
      KW_ELSE = 276,
      KW_RANDOM = 277,
      KW_ABSTRACT = 278,
-     EXTENMARK = 279,
-     KW_GOTO = 280,
-     KW_JUMP = 281,
-     KW_RETURN = 282,
-     KW_BREAK = 283,
-     KW_CONTINUE = 284,
-     KW_REGEXTEN = 285,
-     KW_HINT = 286,
-     KW_FOR = 287,
-     KW_WHILE = 288,
-     KW_CASE = 289,
-     KW_PATTERN = 290,
-     KW_DEFAULT = 291,
-     KW_CATCH = 292,
-     KW_SWITCHES = 293,
-     KW_ESWITCHES = 294,
-     KW_INCLUDES = 295,
-     KW_LOCAL = 296,
-     word = 297
+     KW_EXTEND = 279,
+     EXTENMARK = 280,
+     KW_GOTO = 281,
+     KW_JUMP = 282,
+     KW_RETURN = 283,
+     KW_BREAK = 284,
+     KW_CONTINUE = 285,
+     KW_REGEXTEN = 286,
+     KW_HINT = 287,
+     KW_FOR = 288,
+     KW_WHILE = 289,
+     KW_CASE = 290,
+     KW_PATTERN = 291,
+     KW_DEFAULT = 292,
+     KW_CATCH = 293,
+     KW_SWITCHES = 294,
+     KW_ESWITCHES = 295,
+     KW_INCLUDES = 296,
+     KW_LOCAL = 297,
+     word = 298
    };
 #endif
 /* Tokens.  */
 #define KW_ELSE 276
 #define KW_RANDOM 277
 #define KW_ABSTRACT 278
-#define EXTENMARK 279
-#define KW_GOTO 280
-#define KW_JUMP 281
-#define KW_RETURN 282
-#define KW_BREAK 283
-#define KW_CONTINUE 284
-#define KW_REGEXTEN 285
-#define KW_HINT 286
-#define KW_FOR 287
-#define KW_WHILE 288
-#define KW_CASE 289
-#define KW_PATTERN 290
-#define KW_DEFAULT 291
-#define KW_CATCH 292
-#define KW_SWITCHES 293
-#define KW_ESWITCHES 294
-#define KW_INCLUDES 295
-#define KW_LOCAL 296
-#define word 297
+#define KW_EXTEND 279
+#define EXTENMARK 280
+#define KW_GOTO 281
+#define KW_JUMP 282
+#define KW_RETURN 283
+#define KW_BREAK 284
+#define KW_CONTINUE 285
+#define KW_REGEXTEN 286
+#define KW_HINT 287
+#define KW_FOR 288
+#define KW_WHILE 289
+#define KW_CASE 290
+#define KW_PATTERN 291
+#define KW_DEFAULT 292
+#define KW_CATCH 293
+#define KW_SWITCHES 294
+#define KW_ESWITCHES 295
+#define KW_INCLUDES 296
+#define KW_LOCAL 297
+#define word 298
 
 
 
@@ -125,7 +127,7 @@ typedef union YYSTYPE
        struct pval *pval;      /* full objects */
 }
 /* Line 1536 of yacc.c.  */
-#line 129 "ael.tab.h"
+#line 131 "ael.tab.h"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
index dc53090..cac4a42 100644 (file)
@@ -80,7 +80,7 @@ static pval *update_last(pval *, YYLTYPE *);
 
 
 %token KW_CONTEXT LC RC LP RP SEMI EQ COMMA COLON AMPER BAR AT
-%token KW_MACRO KW_GLOBALS KW_IGNOREPAT KW_SWITCH KW_IF KW_IFTIME KW_ELSE KW_RANDOM KW_ABSTRACT
+%token KW_MACRO KW_GLOBALS KW_IGNOREPAT KW_SWITCH KW_IF KW_IFTIME KW_ELSE KW_RANDOM KW_ABSTRACT KW_EXTEND
 %token EXTENMARK KW_GOTO KW_JUMP KW_RETURN KW_BREAK KW_CONTINUE KW_REGEXTEN KW_HINT
 %token KW_FOR KW_WHILE KW_CASE KW_PATTERN KW_DEFAULT KW_CATCH KW_SWITCHES KW_ESWITCHES
 %token KW_INCLUDES KW_LOCAL
@@ -202,22 +202,19 @@ context_name : word { $$ = $1; }
        ;
 
 context : opt_abstract KW_CONTEXT context_name LC elements RC {
-               if (!$5) {
-                        ast_log(LOG_WARNING, "==== File: %s, Line %d, Cols: %d-%d: Warning! The empty context %s will be IGNORED!\n", 
-                               my_file, @4.first_line, @4.first_column, @4.last_column, $3 );
-                       $$ = 0;
-                       free($3);
-               } else {
-                       $$ = npval2(PV_CONTEXT, &@1, &@6);
-                       $$->u1.str = $3;
-                       $$->u2.statements = $5;
-                       set_dads($$,$5);
-                       $$->u3.abstract = $1;} }
+               $$ = npval2(PV_CONTEXT, &@1, &@6);
+               $$->u1.str = $3;
+               $$->u2.statements = $5;
+               set_dads($$,$5);
+               $$->u3.abstract = $1;} 
        ;
 
 /* optional "abstract" keyword  XXX there is no regression test for this */
 opt_abstract: KW_ABSTRACT { $$ = 1; }
        | /* nothing */ { $$ = 0; }
+       | KW_EXTEND { $$ = 2; }
+       | KW_EXTEND KW_ABSTRACT { $$=3; }
+       | KW_ABSTRACT KW_EXTEND { $$=3; }
        ;
 
 macro : KW_MACRO word LP arglist RP LC macro_statements RC {
index d6f4f46..0ae6a77 100644 (file)
@@ -345,8 +345,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
        *yy_cp = '\0'; \
        yyg->yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 62
-#define YY_END_OF_BUFFER 63
+#define YY_NUM_RULES 63
+#define YY_END_OF_BUFFER 64
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -354,34 +354,35 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[239] =
+static yyconst flex_int16_t yy_accept[244] =
     {   0,
-        0,    0,    0,    0,    0,    0,    0,    0,   42,   42,
-       63,   62,   49,   47,   48,   50,   50,    9,    3,    4,
-        7,   50,    8,    5,    6,   12,   50,   50,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,    1,   10,    2,   62,   52,   51,   62,   53,
-       62,   58,   59,   60,   62,   62,   54,   55,   56,   62,
-       57,   42,   43,   44,   49,   48,   50,   50,   41,   13,
-       11,   50,   50,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   21,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   50,    0,   52,   51,    0,   53,   52,   51,
-
-       53,    0,   58,   59,   60,    0,   58,   59,   60,    0,
-       54,   55,   56,    0,   57,   54,   55,   56,   57,   42,
-       43,   44,   45,   44,   46,   50,   13,   13,   50,   50,
-       50,   50,   50,   50,   50,   50,   32,   50,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
-       50,   50,   50,   50,   50,   34,   50,   50,   50,   26,
-       50,   50,   27,   25,   50,   50,   50,   28,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,   30,   37,
-       50,   50,   50,   50,   50,   50,   50,   50,   18,   16,
-       50,   50,   50,   50,   50,   33,   50,   50,   50,   50,
-
-       50,   50,   50,   22,   50,   50,   50,   23,   50,   29,
-       20,   50,   50,   14,   50,   35,   50,   17,   50,   50,
-       36,   50,   50,   50,   15,   31,   50,   50,   40,   24,
-       38,    0,   39,   19,    0,    0,   61,    0
+        0,    0,    0,    0,    0,    0,    0,    0,   43,   43,
+       64,   63,   50,   48,   49,   51,   51,    9,    3,    4,
+        7,   51,    8,    5,    6,   12,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,    1,   10,    2,   63,   53,   52,   63,   54,
+       63,   59,   60,   61,   63,   63,   55,   56,   57,   63,
+       58,   43,   44,   45,   50,   49,   51,   51,   42,   13,
+       11,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   22,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,    0,   53,   52,    0,   54,   53,
+
+       52,   54,    0,   59,   60,   61,    0,   59,   60,   61,
+        0,   55,   56,   57,    0,   58,   55,   56,   57,   58,
+       43,   44,   45,   46,   45,   47,   51,   13,   13,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   33,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51,   35,   51,   51,
+       51,   27,   51,   51,   51,   28,   26,   51,   51,   51,
+       29,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   31,   38,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,   19,   17,   51,   51,   51,   51,   51,   34,
+
+       51,   51,   51,   51,   51,   51,   16,   51,   23,   51,
+       51,   51,   24,   51,   30,   21,   51,   51,   14,   51,
+       36,   51,   18,   51,   51,   37,   51,   51,   51,   15,
+       32,   51,   51,   41,   25,   39,    0,   40,   20,    0,
+        0,   62,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -425,186 +426,186 @@ static yyconst flex_int32_t yy_meta[48] =
         3,    3,    3,    3,    3,    1,    3
     } ;
 
-static yyconst flex_int16_t yy_base[252] =
+static yyconst flex_int16_t yy_base[257] =
     {   0,
         0,    0,   39,   42,   81,  120,  159,  198,   47,   54,
-      314,  985,  311,  985,  308,    0,  280,  985,  985,  985,
-      985,   42,  985,  985,  293,  985,  285,  269,   31,  280,
-       32,  269,   33,  274,   45,  262,  266,  279,  278,   48,
-      257,  269,  985,  985,  985,   73,  985,  985,   89,  985,
+      319,  985,  316,  985,  313,    0,  285,  985,  985,  985,
+      985,   42,  985,  985,  298,  985,  290,  274,   31,  285,
+       32,  274,   33,  279,   45,  267,  271,  284,  283,   48,
+      262,  274,  985,  985,  985,   73,  985,  985,   89,  985,
       237,  985,  985,  985,  276,  315,  985,  985,  985,  354,
-      985,  292,  985,   66,  292,  289,    0,  256,    0,  401,
-      985,  250,  262,   64,  252,  259,  243,  238,  241,  242,
-      237,  241,  257,  239,  249,  238,  247,  246,  229,  233,
-       47,  237,  236,  103,  985,  985,  137,  985,  142,  176,
-
-      181,  439,  985,  985,  985,  478,  517,  556,  595,  634,
-      985,  985,  985,  673,  985,  712,  751,  790,  829,  263,
-      985,  103,  985,  104,  985,  240,    0,  876,  223,  240,
-      235,  236,  219,  233,  228,  223,    0,  229,  214,  209,
-      218,  211,  210,  204,  218,  201,  198,  212,  210,  194,
-      194,  200,  199,  193,  198,    0,  200,  100,  187,    0,
-      186,  202,    0,    0,  189,  183,  175,    0,  182,  178,
-      187,  176,  168,  172,  184,  178,  158,  176,    0,    0,
-      151,  158,  159,  167,  154,  156,  151,  151,    0,    0,
-      137,  140,  132,  130,  131,    0,  134,  131,  114,  112,
-
-      112,  119,  105,    0,  106,  116,  103,    0,  111,    0,
-      110,  106,   91,    0,   95,    0,   94,    0,   96,   68,
-        0,   64,   57,   76,    0,    0,   52,   44,    0,    0,
-        0,  168,    0,    0,    0,   50,  985,  985,  922,  927,
-      932,  937,  940,  945,  950,  955,  960,  964,  969,  974,
-      979
+      985,  300,  985,   66,  300,  297,    0,  264,    0,  401,
+      985,  259,  268,   64,  258,  265,  252,  247,  248,  249,
+      250,  242,  245,  261,  243,  253,  242,  251,  250,  233,
+      237,   51,  241,  240,  103,  985,  985,  137,  985,  142,
+
+      176,  181,  439,  985,  985,  985,  478,  517,  556,  595,
+      634,  985,  985,  985,  673,  985,  712,  751,  790,  829,
+      267,  985,  103,  985,  104,  985,  244,    0,  876,  227,
+      244,  239,  240,  223,  240,  235,  230,  233,    0,  232,
+      218,  213,  222,  214,  216,  211,  225,  205,  201,  215,
+      213,  197,  197,  203,  202,  196,  201,    0,  203,  100,
+      190,    0,  190,  194,  206,    0,    0,  192,  186,  182,
+        0,  188,  180,  189,  178,  170,  174,  187,  184,  167,
+      182,    0,    0,  156,  163,  161,  169,  167,  158,  161,
+      156,  152,    0,    0,  138,  141,  134,  137,  136,    0,
+
+      135,  135,  115,  113,  113,  123,    0,  109,    0,  107,
+      117,  107,    0,  112,    0,  111,  110,   92,    0,  105,
+        0,   95,    0,   85,   60,    0,   61,   48,  117,    0,
+        0,   45,   37,    0,    0,    0,  168,    0,    0,    0,
+       50,  985,  985,  922,  927,  932,  937,  940,  945,  950,
+      955,  960,  964,  969,  974,  979
     } ;
 
-static yyconst flex_int16_t yy_def[252] =
+static yyconst flex_int16_t yy_def[257] =
     {   0,
-      238,    1,  239,  239,  240,  240,  241,  241,  242,  242,
-      238,  238,  238,  238,  238,  243,  243,  238,  238,  238,
-      238,  243,  238,  238,  238,  238,  243,  243,  243,  243,
+      243,    1,  244,  244,  245,  245,  246,  246,  247,  247,
+      243,  243,  243,  243,  243,  248,  248,  243,  243,  243,
+      243,  248,  243,  243,  243,  243,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  243,  243,  243,  249,  243,  243,  249,  243,
+      250,  243,  243,  243,  250,  251,  243,  243,  243,  251,
+      243,  252,  243,  253,  243,  243,  248,  248,  248,  254,
+      243,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  249,  243,  243,  249,  243,  249,
+
+      249,  249,  250,  243,  243,  243,  250,  250,  250,  250,
+      251,  243,  243,  243,  251,  243,  251,  251,  251,  251,
+      252,  243,  253,  243,  253,  243,  248,  255,  254,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
+      248,  248,  248,  248,  248,  248,  243,  248,  248,  256,
+      256,  243,    0,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243
+    } ;
+
+static yyconst flex_int16_t yy_nxt[1033] =
+    {   0,
+       12,   13,   14,   15,   16,   16,   17,   18,   19,   20,
+       16,   21,   22,   23,   24,   25,   16,   26,   16,   16,
+       12,   16,   27,   28,   29,   30,   31,   32,   33,   34,
+       35,   36,   16,   37,   38,   16,   16,   39,   40,   41,
+       16,   16,   42,   16,   43,   44,   45,   47,   48,   63,
+       47,   48,   69,   74,   70,  242,   63,   64,   47,   49,
+       50,   47,   49,   50,   64,   77,   81,   75,  124,   82,
+       91,   78,   84,   85,   92,   79,  125,  239,  126,  151,
+       86,   96,   97,   47,  238,   50,   47,  236,   50,   52,
+       53,  152,   96,   98,   99,   54,  235,  100,  101,  234,
+
+       52,   55,   53,  132,  133,  124,  124,  233,  100,   98,
+      102,   96,   97,  243,  125,  243,  243,   96,  237,   99,
+      237,  232,   96,   98,   99,   52,  184,   53,   52,   53,
+      185,  231,  230,  100,   54,  102,  229,  228,  227,   52,
+       55,   53,  226,  225,  224,  100,  101,   96,  223,   99,
+       96,   97,  222,  221,  220,  219,  100,   98,  102,  218,
+      217,   96,   98,   99,   52,  216,   53,   57,   58,  237,
+       59,  237,  215,  240,  214,  213,  212,  211,   57,   60,
+       61,  100,  210,  102,   96,   97,   96,  209,   99,   96,
+       97,  208,  207,  206,  205,   96,   98,   99,  204,  203,
+
+       96,   98,   99,   57,  202,   61,   57,   58,  201,   59,
+      200,  199,  198,  197,  196,  195,  194,   57,   60,   61,
+       96,  193,   99,  192,  191,   96,  190,   99,  189,  188,
+      187,  186,  183,  182,  181,  180,  179,  178,  177,  176,
+      175,  174,   57,  173,   61,  104,  105,  172,  171,  170,
+      169,  106,  168,  167,  166,  165,  104,  107,  105,  164,
+      163,  162,  161,  160,  159,  158,  157,  156,  155,  122,
+      154,  153,  150,  149,  148,  147,  146,  145,  144,  143,
+      142,  104,  141,  105,  108,  109,  140,  139,  138,  137,
+      110,  136,  135,  134,  131,  108,  107,  109,  130,  127,
+
+       66,   65,  122,   94,   93,   90,   89,   88,   87,   83,
+       80,   76,   73,   72,   71,   68,   66,   65,  243,  243,
+      108,  243,  109,  112,  113,  243,  114,  243,  243,  243,
+      243,  243,  243,  243,  112,  115,  116,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
-      243,  243,  238,  238,  238,  244,  238,  238,  244,  238,
-      245,  238,  238,  238,  245,  246,  238,  238,  238,  246,
-      238,  247,  238,  248,  238,  238,  243,  243,  243,  249,
-      238,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  112,
+      243,  116,  117,  118,  243,  119,  243,  243,  243,  243,
+      243,  243,  243,  117,  115,  120,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
-      243,  243,  243,  244,  238,  238,  244,  238,  244,  244,
+      243,  243,  243,  243,  243,  243,  243,  243,  117,  243,
 
-      244,  245,  238,  238,  238,  245,  245,  245,  245,  246,
-      238,  238,  238,  246,  238,  246,  246,  246,  246,  247,
-      238,  248,  238,  248,  238,  243,  250,  249,  243,  243,
+      120,  128,  128,  243,  128,  243,  243,  243,  128,  128,
+      128,  243,  128,  243,  128,  128,  128,  243,  128,  243,
+      243,  128,  243,  243,  243,  243,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  128,  104,  105,  243,
+      243,  243,  243,  106,  243,  243,  243,  243,  104,  107,
+      105,  243,  243,  243,  243,  243,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  104,  243,  105,  108,  109,  243,  243,
+      243,  243,  110,  243,  243,  243,  243,  108,  107,  109,
+
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  108,  243,  109,  104,  105,  243,  243,  243,
+      243,  106,  243,  243,  243,  243,  104,  107,  105,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  104,  243,  105,  104,  105,  243,  243,  243,  243,
+      106,  243,  243,  243,  243,  104,  107,  105,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
 
+      104,  243,  105,  104,  105,  243,  243,  243,  243,  106,
+      243,  243,  243,  243,  104,  107,  105,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  104,
+      243,  105,  112,  113,  243,  114,  243,  243,  243,  243,
+      243,  243,  243,  112,  115,  116,  243,  243,  243,  243,
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  112,  243,
+      116,  117,  118,  243,  119,  243,  243,  243,  243,  243,
+      243,  243,  117,  115,  120,  243,  243,  243,  243,  243,
+
       243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
-      243,  238,  243,  243,  251,  251,  238,    0,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238
-    } ;
+      243,  243,  243,  243,  243,  243,  243,  117,  243,  120,
+      112,  113,  243,  114,  243,  243,  243,  243,  243,  243,
+      243,  112,  115,  116,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  112,  243,  116,  112,
+      113,  243,  114,  243,  243,  243,  243,  243,  243,  243,
+      112,  115,  116,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  112,  243,  116,  112,  113,
 
-static yyconst flex_int16_t yy_nxt[1033] =
-    {   0,
-       12,   13,   14,   15,   16,   16,   17,   18,   19,   20,
-       16,   21,   22,   23,   24,   25,   16,   26,   16,   16,
-       12,   16,   27,   28,   29,   30,   31,   32,   33,   34,
-       35,   36,   16,   37,   38,   16,   16,   39,   40,   41,
-       16,   16,   42,   16,   43,   44,   45,   47,   48,   63,
-       47,   48,   69,   74,   70,  237,   63,   64,   47,   49,
-       50,   47,   49,   50,   64,   77,   80,   75,  123,   81,
-       90,   78,   83,   84,   91,  149,  124,  232,  125,  232,
-       85,   95,   96,   47,  234,   50,   47,  150,   50,   52,
-       53,  233,   95,   97,   98,   54,  231,   99,  100,  230,
-
-       52,   55,   53,  131,  132,  123,  123,  229,   99,   97,
-      101,   95,   96,  238,  124,  238,  238,   95,  228,   98,
-      227,  226,   95,   97,   98,   52,  181,   53,   52,   53,
-      182,  225,  224,   99,   54,  101,  223,  222,  221,   52,
-       55,   53,  220,  219,  218,   99,  100,   95,  217,   98,
-       95,   96,  216,  215,  214,  213,   99,   97,  101,  212,
-      211,   95,   97,   98,   52,  210,   53,   57,   58,  232,
-       59,  232,  209,  235,  208,  207,  206,  205,   57,   60,
-       61,   99,  204,  101,   95,   96,   95,  203,   98,   95,
-       96,  202,  201,  200,  199,   95,   97,   98,  198,  197,
-
-       95,   97,   98,   57,  196,   61,   57,   58,  195,   59,
-      194,  193,  192,  191,  190,  189,  188,   57,   60,   61,
-       95,  187,   98,  186,  185,   95,  184,   98,  183,  180,
-      179,  178,  177,  176,  175,  174,  173,  172,  171,  170,
-      169,  168,   57,  167,   61,  103,  104,  166,  165,  164,
-      163,  105,  162,  161,  160,  159,  103,  106,  104,  158,
-      157,  156,  155,  154,  153,  121,  152,  151,  148,  147,
-      146,  145,  144,  143,  142,  141,  140,  139,  138,  137,
-      136,  103,  135,  104,  107,  108,  134,  133,  130,  129,
-      109,  126,   66,   65,  121,  107,  106,  108,   93,   92,
-
-       89,   88,   87,   86,   82,   79,   76,   73,   72,   71,
-       68,   66,   65,  238,  238,  238,  238,  238,  238,  238,
-      107,  238,  108,  111,  112,  238,  113,  238,  238,  238,
-      238,  238,  238,  238,  111,  114,  115,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  111,
-      238,  115,  116,  117,  238,  118,  238,  238,  238,  238,
-      238,  238,  238,  116,  114,  119,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  116,  238,
-
-      119,  127,  127,  238,  127,  238,  238,  238,  127,  127,
-      127,  238,  127,  238,  127,  127,  127,  238,  127,  238,
-      238,  127,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  127,  103,  104,  238,
-      238,  238,  238,  105,  238,  238,  238,  238,  103,  106,
-      104,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  103,  238,  104,  107,  108,  238,  238,
-      238,  238,  109,  238,  238,  238,  238,  107,  106,  108,
-
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  107,  238,  108,  103,  104,  238,  238,  238,
-      238,  105,  238,  238,  238,  238,  103,  106,  104,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  103,  238,  104,  103,  104,  238,  238,  238,  238,
-      105,  238,  238,  238,  238,  103,  106,  104,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-
-      103,  238,  104,  103,  104,  238,  238,  238,  238,  105,
-      238,  238,  238,  238,  103,  106,  104,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  103,
-      238,  104,  111,  112,  238,  113,  238,  238,  238,  238,
-      238,  238,  238,  111,  114,  115,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  111,  238,
-      115,  116,  117,  238,  118,  238,  238,  238,  238,  238,
-      238,  238,  116,  114,  119,  238,  238,  238,  238,  238,
-
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  116,  238,  119,
-      111,  112,  238,  113,  238,  238,  238,  238,  238,  238,
-      238,  111,  114,  115,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  111,  238,  115,  111,
-      112,  238,  113,  238,  238,  238,  238,  238,  238,  238,
-      111,  114,  115,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  111,  238,  115,  111,  112,
-
-      238,  113,  238,  238,  238,  238,  238,  238,  238,  111,
-      114,  115,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  111,  238,  115,  111,  112,  238,
-      113,  238,  238,  238,  238,  238,  238,  238,  111,  114,
-      115,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  111,  238,  115,  127,  127,  238,  127,
-      238,  238,  238,  127,  127,  127,  238,  127,  238,  127,
-      127,  127,  238,  127,  238,  238,  127,  238,  238,  238,
-
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  127,   46,   46,   46,   46,   46,   51,   51,   51,
+      243,  114,  243,  243,  243,  243,  243,  243,  243,  112,
+      115,  116,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  112,  243,  116,  112,  113,  243,
+      114,  243,  243,  243,  243,  243,  243,  243,  112,  115,
+      116,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  112,  243,  116,  128,  128,  243,  128,
+      243,  243,  243,  128,  128,  128,  243,  128,  243,  128,
+      128,  128,  243,  128,  243,  243,  128,  243,  243,  243,
+
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  128,   46,   46,   46,   46,   46,   51,   51,   51,
        51,   51,   56,   56,   56,   56,   56,   62,   62,   62,
-       62,   62,   67,   67,   67,   94,   94,   94,   94,   94,
-      102,  102,  102,  102,  102,  110,  110,  110,  110,  110,
-      120,  120,  120,  120,  122,  122,  122,  122,  122,  128,
-      238,  128,  128,  128,  127,  238,  127,  127,  127,  236,
-      236,  236,  238,  236,   11,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238
+       62,   62,   67,   67,   67,   95,   95,   95,   95,   95,
+      103,  103,  103,  103,  103,  111,  111,  111,  111,  111,
+      121,  121,  121,  121,  123,  123,  123,  123,  123,  129,
+      243,  129,  129,  129,  128,  243,  128,  128,  128,  241,
+      241,  241,  243,  241,   11,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243
     } ;
 
 static yyconst flex_int16_t yy_chk[1033] =
@@ -614,36 +615,36 @@ static yyconst flex_int16_t yy_chk[1033] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    3,    3,    9,
-        4,    4,   22,   29,   22,  236,   10,    9,    3,    3,
+        4,    4,   22,   29,   22,  241,   10,    9,    3,    3,
         3,    4,    4,    4,   10,   31,   33,   29,   64,   33,
-       40,   31,   35,   35,   40,   91,   64,  224,   64,  224,
-       35,   46,   46,    3,  228,    3,    4,   91,    4,    5,
-        5,  227,   46,   46,   46,    5,  223,   49,   49,  222,
-
-        5,    5,    5,   74,   74,  122,  124,  220,   49,   49,
-       49,   94,   94,  122,  124,  122,  124,   46,  219,   46,
-      217,  215,   94,   94,   94,    5,  158,    5,    6,    6,
-      158,  213,  212,   49,    6,   49,  211,  209,  207,    6,
-        6,    6,  206,  205,  203,   97,   97,   94,  202,   94,
-       99,   99,  201,  200,  199,  198,   97,   97,   97,  197,
-      195,   99,   99,   99,    6,  194,    6,    7,    7,  232,
-        7,  232,  193,  232,  192,  191,  188,  187,    7,    7,
-        7,   97,  186,   97,  100,  100,   99,  185,   99,  101,
-      101,  184,  183,  182,  181,  100,  100,  100,  178,  177,
-
-      101,  101,  101,    7,  176,    7,    8,    8,  175,    8,
-      174,  173,  172,  171,  170,  169,  167,    8,    8,    8,
-      100,  166,  100,  165,  162,  101,  161,  101,  159,  157,
-      155,  154,  153,  152,  151,  150,  149,  148,  147,  146,
-      145,  144,    8,  143,    8,   51,   51,  142,  141,  140,
-      139,   51,  138,  136,  135,  134,   51,   51,   51,  133,
-      132,  131,  130,  129,  126,  120,   93,   92,   90,   89,
-       88,   87,   86,   85,   84,   83,   82,   81,   80,   79,
-       78,   51,   77,   51,   55,   55,   76,   75,   73,   72,
-       55,   68,   66,   65,   62,   55,   55,   55,   42,   41,
-
-       39,   38,   37,   36,   34,   32,   30,   28,   27,   25,
-       17,   15,   13,   11,    0,    0,    0,    0,    0,    0,
+       40,   31,   35,   35,   40,   31,   64,  233,   64,   92,
+       35,   46,   46,    3,  232,    3,    4,  228,    4,    5,
+        5,   92,   46,   46,   46,    5,  227,   49,   49,  225,
+
+        5,    5,    5,   74,   74,  123,  125,  224,   49,   49,
+       49,   95,   95,  123,  125,  123,  125,   46,  229,   46,
+      229,  222,   95,   95,   95,    5,  160,    5,    6,    6,
+      160,  220,  218,   49,    6,   49,  217,  216,  214,    6,
+        6,    6,  212,  211,  210,   98,   98,   95,  208,   95,
+      100,  100,  206,  205,  204,  203,   98,   98,   98,  202,
+      201,  100,  100,  100,    6,  199,    6,    7,    7,  237,
+        7,  237,  198,  237,  197,  196,  195,  192,    7,    7,
+        7,   98,  191,   98,  101,  101,  100,  190,  100,  102,
+      102,  189,  188,  187,  186,  101,  101,  101,  185,  184,
+
+      102,  102,  102,    7,  181,    7,    8,    8,  180,    8,
+      179,  178,  177,  176,  175,  174,  173,    8,    8,    8,
+      101,  172,  101,  170,  169,  102,  168,  102,  165,  164,
+      163,  161,  159,  157,  156,  155,  154,  153,  152,  151,
+      150,  149,    8,  148,    8,   51,   51,  147,  146,  145,
+      144,   51,  143,  142,  141,  140,   51,   51,   51,  138,
+      137,  136,  135,  134,  133,  132,  131,  130,  127,  121,
+       94,   93,   91,   90,   89,   88,   87,   86,   85,   84,
+       83,   51,   82,   51,   55,   55,   81,   80,   79,   78,
+       55,   77,   76,   75,   73,   55,   55,   55,   72,   68,
+
+       66,   65,   62,   42,   41,   39,   38,   37,   36,   34,
+       32,   30,   28,   27,   25,   17,   15,   13,   11,    0,
        55,    0,   55,   56,   56,    0,   56,    0,    0,    0,
         0,    0,    0,    0,   56,   56,   56,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -657,72 +658,72 @@ static yyconst flex_int16_t yy_chk[1033] =
        70,    0,   70,    0,   70,   70,   70,    0,   70,    0,
         0,   70,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   70,  102,  102,    0,
-        0,    0,    0,  102,    0,    0,    0,    0,  102,  102,
-      102,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   70,  103,  103,    0,
+        0,    0,    0,  103,    0,    0,    0,    0,  103,  103,
+      103,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  102,    0,  102,  106,  106,    0,    0,
-        0,    0,  106,    0,    0,    0,    0,  106,  106,  106,
+        0,    0,    0,  103,    0,  103,  107,  107,    0,    0,
+        0,    0,  107,    0,    0,    0,    0,  107,  107,  107,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  106,    0,  106,  107,  107,    0,    0,    0,
-        0,  107,    0,    0,    0,    0,  107,  107,  107,    0,
+        0,    0,  107,    0,  107,  108,  108,    0,    0,    0,
+        0,  108,    0,    0,    0,    0,  108,  108,  108,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  107,    0,  107,  108,  108,    0,    0,    0,    0,
-      108,    0,    0,    0,    0,  108,  108,  108,    0,    0,
+        0,  108,    0,  108,  109,  109,    0,    0,    0,    0,
+      109,    0,    0,    0,    0,  109,  109,  109,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-      108,    0,  108,  109,  109,    0,    0,    0,    0,  109,
-        0,    0,    0,    0,  109,  109,  109,    0,    0,    0,
+      109,    0,  109,  110,  110,    0,    0,    0,    0,  110,
+        0,    0,    0,    0,  110,  110,  110,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  109,
-        0,  109,  110,  110,    0,  110,    0,    0,    0,    0,
-        0,    0,    0,  110,  110,  110,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  110,
+        0,  110,  111,  111,    0,  111,    0,    0,    0,    0,
+        0,    0,    0,  111,  111,  111,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  110,    0,
-      110,  114,  114,    0,  114,    0,    0,    0,    0,    0,
-        0,    0,  114,  114,  114,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  111,    0,
+      111,  115,  115,    0,  115,    0,    0,    0,    0,    0,
+        0,    0,  115,  115,  115,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  114,    0,  114,
-      116,  116,    0,  116,    0,    0,    0,    0,    0,    0,
-        0,  116,  116,  116,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  115,    0,  115,
+      117,  117,    0,  117,    0,    0,    0,    0,    0,    0,
+        0,  117,  117,  117,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  116,    0,  116,  117,
-      117,    0,  117,    0,    0,    0,    0,    0,    0,    0,
-      117,  117,  117,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  117,    0,  117,  118,
+      118,    0,  118,    0,    0,    0,    0,    0,    0,    0,
+      118,  118,  118,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  117,    0,  117,  118,  118,
+        0,    0,    0,    0,    0,  118,    0,  118,  119,  119,
 
-        0,  118,    0,    0,    0,    0,    0,    0,    0,  118,
-      118,  118,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  119,    0,    0,    0,    0,    0,    0,    0,  119,
+      119,  119,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  118,    0,  118,  119,  119,    0,
-      119,    0,    0,    0,    0,    0,    0,    0,  119,  119,
-      119,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  119,    0,  119,  120,  120,    0,
+      120,    0,    0,    0,    0,    0,    0,    0,  120,  120,
+      120,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  119,    0,  119,  128,  128,    0,  128,
-        0,    0,    0,  128,  128,  128,    0,  128,    0,  128,
-      128,  128,    0,  128,    0,    0,  128,    0,    0,    0,
+        0,    0,    0,  120,    0,  120,  129,  129,    0,  129,
+        0,    0,    0,  129,  129,  129,    0,  129,    0,  129,
+      129,  129,    0,  129,    0,    0,  129,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  128,  239,  239,  239,  239,  239,  240,  240,  240,
-      240,  240,  241,  241,  241,  241,  241,  242,  242,  242,
-      242,  242,  243,  243,  243,  244,  244,  244,  244,  244,
-      245,  245,  245,  245,  245,  246,  246,  246,  246,  246,
-      247,  247,  247,  247,  248,  248,  248,  248,  248,  249,
-        0,  249,  249,  249,  250,    0,  250,  250,  250,  251,
-      251,  251,    0,  251,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238
+        0,  129,  244,  244,  244,  244,  244,  245,  245,  245,
+      245,  245,  246,  246,  246,  246,  246,  247,  247,  247,
+      247,  247,  248,  248,  248,  249,  249,  249,  249,  249,
+      250,  250,  250,  250,  250,  251,  251,  251,  251,  251,
+      252,  252,  252,  252,  253,  253,  253,  253,  253,  254,
+        0,  254,  254,  254,  255,    0,  255,  255,  255,  256,
+      256,  256,    0,  256,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -891,7 +892,7 @@ static void pbcwhere(const char *text, int *line, int *col )
 #define        STORE_POS
 #define        STORE_LOC
 #endif
-#line 894 "ael_lex.c"
+#line 895 "ael_lex.c"
 
 #define INITIAL 0
 #define paren 1
@@ -1135,7 +1136,7 @@ YY_DECL
 #line 181 "ael.flex"
 
 
-#line 1138 "ael_lex.c"
+#line 1139 "ael_lex.c"
 
     yylval = yylval_param;
 
@@ -1198,13 +1199,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 239 )
+                               if ( yy_current_state >= 244 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 238 );
+               while ( yy_current_state != 243 );
                yy_cp = yyg->yy_last_accepting_cpos;
                yy_current_state = yyg->yy_last_accepting_state;
 
@@ -1302,179 +1303,184 @@ YY_RULE_SETUP
 case 16:
 YY_RULE_SETUP
 #line 198 "ael.flex"
-{ STORE_POS; return KW_MACRO;};
+{ STORE_POS; return KW_EXTEND;}
        YY_BREAK
 case 17:
 YY_RULE_SETUP
 #line 199 "ael.flex"
-{ STORE_POS; return KW_GLOBALS;}
+{ STORE_POS; return KW_MACRO;};
        YY_BREAK
 case 18:
 YY_RULE_SETUP
 #line 200 "ael.flex"
-{ STORE_POS; return KW_LOCAL;}
+{ STORE_POS; return KW_GLOBALS;}
        YY_BREAK
 case 19:
 YY_RULE_SETUP
 #line 201 "ael.flex"
-{ STORE_POS; return KW_IGNOREPAT;}
+{ STORE_POS; return KW_LOCAL;}
        YY_BREAK
 case 20:
 YY_RULE_SETUP
 #line 202 "ael.flex"
-{ STORE_POS; return KW_SWITCH;}
+{ STORE_POS; return KW_IGNOREPAT;}
        YY_BREAK
 case 21:
 YY_RULE_SETUP
 #line 203 "ael.flex"
-{ STORE_POS; return KW_IF;}
+{ STORE_POS; return KW_SWITCH;}
        YY_BREAK
 case 22:
 YY_RULE_SETUP
 #line 204 "ael.flex"
-{ STORE_POS; return KW_IFTIME;}
+{ STORE_POS; return KW_IF;}
        YY_BREAK
 case 23:
 YY_RULE_SETUP
 #line 205 "ael.flex"
-{ STORE_POS; return KW_RANDOM;}
+{ STORE_POS; return KW_IFTIME;}
        YY_BREAK
 case 24:
 YY_RULE_SETUP
 #line 206 "ael.flex"
-{ STORE_POS; return KW_REGEXTEN;}
+{ STORE_POS; return KW_RANDOM;}
        YY_BREAK
 case 25:
 YY_RULE_SETUP
 #line 207 "ael.flex"
-{ STORE_POS; return KW_HINT;}
+{ STORE_POS; return KW_REGEXTEN;}
        YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 208 "ael.flex"
-{ STORE_POS; return KW_ELSE;}
+{ STORE_POS; return KW_HINT;}
        YY_BREAK
 case 27:
 YY_RULE_SETUP
 #line 209 "ael.flex"
-{ STORE_POS; return KW_GOTO;}
+{ STORE_POS; return KW_ELSE;}
        YY_BREAK
 case 28:
 YY_RULE_SETUP
 #line 210 "ael.flex"
-{ STORE_POS; return KW_JUMP;}
+{ STORE_POS; return KW_GOTO;}
        YY_BREAK
 case 29:
 YY_RULE_SETUP
 #line 211 "ael.flex"
-{ STORE_POS; return KW_RETURN;}
+{ STORE_POS; return KW_JUMP;}
        YY_BREAK
 case 30:
 YY_RULE_SETUP
 #line 212 "ael.flex"
-{ STORE_POS; return KW_BREAK;}
+{ STORE_POS; return KW_RETURN;}
        YY_BREAK
 case 31:
 YY_RULE_SETUP
 #line 213 "ael.flex"
-{ STORE_POS; return KW_CONTINUE;}
+{ STORE_POS; return KW_BREAK;}
        YY_BREAK
 case 32:
 YY_RULE_SETUP
 #line 214 "ael.flex"
-{ STORE_POS; return KW_FOR;}
+{ STORE_POS; return KW_CONTINUE;}
        YY_BREAK
 case 33:
 YY_RULE_SETUP
 #line 215 "ael.flex"
-{ STORE_POS; return KW_WHILE;}
+{ STORE_POS; return KW_FOR;}
        YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 216 "ael.flex"
-{ STORE_POS; return KW_CASE;}
+{ STORE_POS; return KW_WHILE;}
        YY_BREAK
 case 35:
 YY_RULE_SETUP
 #line 217 "ael.flex"
-{ STORE_POS; return KW_DEFAULT;}
+{ STORE_POS; return KW_CASE;}
        YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 218 "ael.flex"
-{ STORE_POS; return KW_PATTERN;}
+{ STORE_POS; return KW_DEFAULT;}
        YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 219 "ael.flex"
-{ STORE_POS; return KW_CATCH;}
+{ STORE_POS; return KW_PATTERN;}
        YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 220 "ael.flex"
-{ STORE_POS; return KW_SWITCHES;}
+{ STORE_POS; return KW_CATCH;}
        YY_BREAK
 case 39:
 YY_RULE_SETUP
 #line 221 "ael.flex"
-{ STORE_POS; return KW_ESWITCHES;}
+{ STORE_POS; return KW_SWITCHES;}
        YY_BREAK
 case 40:
 YY_RULE_SETUP
 #line 222 "ael.flex"
-{ STORE_POS; return KW_INCLUDES;}
+{ STORE_POS; return KW_ESWITCHES;}
        YY_BREAK
 case 41:
 YY_RULE_SETUP
 #line 223 "ael.flex"
-{ BEGIN(comment); my_col += 2; }
+{ STORE_POS; return KW_INCLUDES;}
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 225 "ael.flex"
-{ my_col += yyleng; }
+#line 224 "ael.flex"
+{ BEGIN(comment); my_col += 2; }
        YY_BREAK
 case 43:
-/* rule 43 can match eol */
 YY_RULE_SETUP
 #line 226 "ael.flex"
-{ ++my_lineno; my_col=1;}
+{ my_col += yyleng; }
        YY_BREAK
 case 44:
+/* rule 44 can match eol */
 YY_RULE_SETUP
 #line 227 "ael.flex"
-{ my_col += yyleng; }
+{ ++my_lineno; my_col=1;}
        YY_BREAK
 case 45:
-/* rule 45 can match eol */
 YY_RULE_SETUP
 #line 228 "ael.flex"
-{ ++my_lineno; my_col=1;}
+{ my_col += yyleng; }
        YY_BREAK
 case 46:
+/* rule 46 can match eol */
 YY_RULE_SETUP
 #line 229 "ael.flex"
-{ my_col += 2; BEGIN(INITIAL); }
+{ ++my_lineno; my_col=1;}
        YY_BREAK
 case 47:
-/* rule 47 can match eol */
 YY_RULE_SETUP
-#line 231 "ael.flex"
-{ my_lineno++; my_col = 1; }
+#line 230 "ael.flex"
+{ my_col += 2; BEGIN(INITIAL); }
        YY_BREAK
 case 48:
+/* rule 48 can match eol */
 YY_RULE_SETUP
 #line 232 "ael.flex"
-{ my_col += yyleng; }
+{ my_lineno++; my_col = 1; }
        YY_BREAK
 case 49:
 YY_RULE_SETUP
 #line 233 "ael.flex"
-{ my_col += (yyleng*8)-(my_col%8); }
+{ my_col += yyleng; }
        YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 235 "ael.flex"
+#line 234 "ael.flex"
+{ my_col += (yyleng*8)-(my_col%8); }
+       YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 236 "ael.flex"
 {
                STORE_POS;
                yylval->str = strdup(yytext);
@@ -1489,10 +1495,10 @@ YY_RULE_SETUP
         * A comma at the top level is valid here, unlike in argg where it
         * is an argument separator so it must be returned as a token.
         */
-case 51:
-/* rule 51 can match eol */
+case 52:
+/* rule 52 can match eol */
 YY_RULE_SETUP
-#line 251 "ael.flex"
+#line 252 "ael.flex"
 {
                if ( pbcpop(')') ) {    /* error */
                        STORE_LOC;
@@ -1515,10 +1521,10 @@ YY_RULE_SETUP
                }
        }
        YY_BREAK
-case 52:
-/* rule 52 can match eol */
+case 53:
+/* rule 53 can match eol */
 YY_RULE_SETUP
-#line 273 "ael.flex"
+#line 274 "ael.flex"
 {
                char c = yytext[yyleng-1];
                if (c == '(')
@@ -1527,10 +1533,10 @@ YY_RULE_SETUP
                yymore();
        }
        YY_BREAK
-case 53:
-/* rule 53 can match eol */
+case 54:
+/* rule 54 can match eol */
 YY_RULE_SETUP
-#line 281 "ael.flex"
+#line 282 "ael.flex"
 {
                char c = yytext[yyleng-1];
                if ( pbcpop(c))  { /* error */
@@ -1552,10 +1558,10 @@ YY_RULE_SETUP
         * of the (external) call, which happens when parencount == 0
         * before the decrement.
         */
-case 54:
-/* rule 54 can match eol */
+case 55:
+/* rule 55 can match eol */
 YY_RULE_SETUP
-#line 303 "ael.flex"
+#line 304 "ael.flex"
 {
                char c = yytext[yyleng-1];
                if (c == '(')
@@ -1564,10 +1570,10 @@ YY_RULE_SETUP
                yymore();
        }
        YY_BREAK
-case 55:
-/* rule 55 can match eol */
+case 56:
+/* rule 56 can match eol */
 YY_RULE_SETUP
-#line 311 "ael.flex"
+#line 312 "ael.flex"
 {
                if ( pbcpop(')') ) { /* error */
                        STORE_LOC;
@@ -1592,10 +1598,10 @@ YY_RULE_SETUP
                }
        }
        YY_BREAK
-case 56:
-/* rule 56 can match eol */
+case 57:
+/* rule 57 can match eol */
 YY_RULE_SETUP
-#line 335 "ael.flex"
+#line 336 "ael.flex"
 {
                if( parencount != 0) { /* printf("Folding in a comma!\n"); */
                        yymore();
@@ -1610,10 +1616,10 @@ YY_RULE_SETUP
                }
        }
        YY_BREAK
-case 57:
-/* rule 57 can match eol */
+case 58:
+/* rule 58 can match eol */
 YY_RULE_SETUP
-#line 349 "ael.flex"
+#line 350 "ael.flex"
 {
                char c = yytext[yyleng-1];
                if ( pbcpop(c) ) { /* error */
@@ -1631,20 +1637,20 @@ YY_RULE_SETUP
         * or in the first and second operand of a 'for'. As above, match
         * commas and use ';' as a separator (hence return it as a separate token).
         */
-case 58:
-/* rule 58 can match eol */
+case 59:
+/* rule 59 can match eol */
 YY_RULE_SETUP
-#line 366 "ael.flex"
+#line 367 "ael.flex"
 {
                char c = yytext[yyleng-1];
                yymore();
                pbcpush(c);
        }
        YY_BREAK
-case 59:
-/* rule 59 can match eol */
+case 60:
+/* rule 60 can match eol */
 YY_RULE_SETUP
-#line 372 "ael.flex"
+#line 373 "ael.flex"
 {
                char c = yytext[yyleng-1];
                if ( pbcpop(c) ) { /* error */
@@ -1657,10 +1663,10 @@ YY_RULE_SETUP
                yymore();
        }
        YY_BREAK
-case 60:
-/* rule 60 can match eol */
+case 61:
+/* rule 61 can match eol */
 YY_RULE_SETUP
-#line 384 "ael.flex"
+#line 385 "ael.flex"
 {
                STORE_LOC;
                yylval->str = strdup(yytext);
@@ -1670,10 +1676,10 @@ YY_RULE_SETUP
                return word;
        }
        YY_BREAK
-case 61:
-/* rule 61 can match eol */
+case 62:
+/* rule 62 can match eol */
 YY_RULE_SETUP
-#line 393 "ael.flex"
+#line 394 "ael.flex"
 {
                char fnamebuf[1024],*p1,*p2;
                int glob_ret;
@@ -1723,7 +1729,7 @@ case YY_STATE_EOF(paren):
 case YY_STATE_EOF(semic):
 case YY_STATE_EOF(argg):
 case YY_STATE_EOF(comment):
-#line 438 "ael.flex"
+#line 439 "ael.flex"
 {
                char fnamebuf[2048];
                if (include_stack_index > 0 && include_stack[include_stack_index-1].globbuf_pos < include_stack[include_stack_index-1].globbuf.gl_pathc-1) {
@@ -1758,12 +1764,12 @@ case YY_STATE_EOF(comment):
                }
        }
        YY_BREAK
-case 62:
+case 63:
 YY_RULE_SETUP
-#line 472 "ael.flex"
+#line 473 "ael.flex"
 ECHO;
        YY_BREAK
-#line 1766 "ael_lex.c"
+#line 1772 "ael_lex.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2048,7 +2054,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 239 )
+                       if ( yy_current_state >= 244 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2077,11 +2083,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 239 )
+               if ( yy_current_state >= 244 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 238);
+       yy_is_jam = (yy_current_state == 243);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2899,7 +2905,7 @@ void ael_yyfree (void * ptr , yyscan_t yyscanner)
 #undef YY_DECL_IS_OURS
 #undef YY_DECL
 #endif
-#line 472 "ael.flex"
+#line 473 "ael.flex"
 
 
 
index b53f9fe..184560f 100644 (file)
@@ -2293,9 +2293,9 @@ static void check_context_names(void)
                if (i->type == PV_CONTEXT || i->type == PV_MACRO) {
                        for (j=i->next; j; j=j->next) {
                                if ( j->type == PV_CONTEXT || j->type == PV_MACRO ) {
-                                       if ( !strcmp(i->u1.str, j->u1.str) )
+                                       if ( !strcmp(i->u1.str, j->u1.str) && !(i->u3.abstract&2) && !(j->u3.abstract&2) )
                                        {
-                                               ast_log(LOG_WARNING,"Warning: file %s, line %d-%d: The context name (%s) is also declared in file %s, line %d-%d!\n",
+                                               ast_log(LOG_WARNING,"Warning: file %s, line %d-%d: The context name (%s) is also declared in file %s, line %d-%d! (and neither is marked 'extend')\n",
                                                                i->filename, i->startline, i->endline, i->u1.str,  j->filename, j->startline, j->endline);
                                                warns++;
                                        }
@@ -4031,7 +4031,7 @@ void ast_compile_ael2(struct ast_context **local_contexts, struct pval *root)
                        break;
                        
                case PV_CONTEXT:
-                       context = ast_context_create(local_contexts, p->u1.str, registrar);
+                       context = ast_context_find_or_create(local_contexts, p->u1.str, registrar);
                        
                        /* contexts contain: ignorepat, includes, switches, eswitches, extensions,  */
                        for (p2=p->u2.statements; p2; p2=p2->next) {
index 58939f9..8955aa0 100644 (file)
@@ -91,6 +91,7 @@ int ast_add_extension2(struct ast_context *con,
                                           const char *registrar);
 void pbx_builtin_setvar(void *chan, void *data);
 struct ast_context * ast_context_create(void **extcontexts, const char *name, const char *registrar);
+struct ast_context * ast_context_find_or_create(void **extcontexts, const char *name, const char *registrar);
 void ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar);
 void ast_context_add_include2(struct ast_context *con, const char *value, const char *registrar);
 void ast_context_add_switch2(struct ast_context *con, const char *value, const char *data, int eval, const char *registrar);
@@ -359,6 +360,21 @@ struct ast_context * ast_context_create(void **extcontexts, const char *name, co
        return x;
 }
 
+struct ast_context * ast_context_find_or_create(void **extcontexts, const char *name, const char *registrar)
+{
+       struct ast_context *x = calloc(1, sizeof(*x));
+       if (!x)
+               return NULL;
+       x->next = context_list;
+       context_list = x;
+       if (!no_comp)
+               printf("Executed ast_context_find_or_create(conts, name=%s, registrar=%s);\n", name, registrar);
+       conts++;
+       strncpy(x->name, name, sizeof(x->name) - 1);
+       strncpy(x->registrar, registrar, sizeof(x->registrar) - 1);
+       return x;
+}
+
 void ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)
 {
        if(!no_comp)
index 312ed70..02e7829 100644 (file)
@@ -630,6 +630,13 @@ struct ast_context *ast_context_create(struct ast_context **extcontexts, const c
        return localized_context_create(extcontexts, name, registrar);
 }
 
+struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, const char *name, const char *registrar)
+{
+       printf("find/Creating context %s, registrar=%s\n", name, registrar);
+       
+       return localized_context_create(extcontexts, name, registrar);
+}
+
 void ast_cli_register_multiple(void);
 
 void ast_cli_register_multiple(void)