charmxi: Parse entry method template declarations in .ci and emit accordingly
authorPhil Miller <mille121@illinois.edu>
Fri, 30 Mar 2012 01:50:40 +0000 (20:50 -0500)
committerPhil Miller <mille121@illinois.edu>
Thu, 5 Apr 2012 21:17:52 +0000 (16:17 -0500)
All of the generated code in .decl.h/.def.h files are templated
according to whether the corresponding entry method is templated.
Push #ifdef CK_TEMPLATES_ONLY down to each element, so it can switch
on whether it's templated or not.

No syntactic support for instantiating entry method templates yet,
though it can be done manually.

src/xlat-i/xi-grammar.tab.C
src/xlat-i/xi-grammar.y
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index 03e4679ac8076f04b354806250ebfb632dad5516..e68075b963b6514dc5eda1bea9c1aa263a3acb38 100644 (file)
@@ -540,16 +540,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  9
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   718
+#define YYLAST   740
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  90
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  110
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  281
+#define YYNRULES  282
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  588
+#define YYNSTATES  591
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -618,18 +618,18 @@ static const yytype_uint16 yyprhs[] =
      436,   439,   442,   445,   448,   451,   453,   458,   459,   462,
      465,   468,   471,   474,   478,   482,   486,   490,   497,   507,
      511,   518,   522,   529,   539,   549,   551,   555,   557,   560,
-     562,   570,   576,   589,   595,   598,   600,   602,   603,   607,
-     609,   613,   615,   617,   619,   621,   623,   625,   627,   629,
-     631,   633,   635,   637,   640,   642,   644,   646,   648,   650,
-     651,   653,   657,   658,   660,   666,   672,   678,   683,   687,
-     689,   691,   693,   697,   702,   706,   708,   710,   712,   714,
-     719,   723,   728,   733,   738,   742,   750,   756,   763,   765,
-     769,   771,   775,   779,   782,   786,   789,   790,   794,   795,
-     797,   801,   803,   806,   808,   811,   812,   817,   819,   823,
-     825,   826,   833,   842,   847,   851,   857,   862,   874,   884,
-     897,   912,   919,   928,   934,   942,   946,   950,   951,   954,
-     959,   961,   965,   967,   969,   972,   978,   980,   984,   986,
-     988,   991
+     564,   566,   574,   580,   593,   599,   602,   604,   606,   607,
+     611,   613,   617,   619,   621,   623,   625,   627,   629,   631,
+     633,   635,   637,   639,   641,   644,   646,   648,   650,   652,
+     654,   655,   657,   661,   662,   664,   670,   676,   682,   687,
+     691,   693,   695,   697,   701,   706,   710,   712,   714,   716,
+     718,   723,   727,   732,   737,   742,   746,   754,   760,   767,
+     769,   773,   775,   779,   783,   786,   790,   793,   794,   798,
+     799,   801,   805,   807,   810,   812,   815,   816,   821,   823,
+     827,   829,   830,   837,   846,   851,   855,   861,   866,   878,
+     888,   901,   916,   923,   932,   938,   946,   950,   954,   955,
+     958,   963,   965,   969,   971,   973,   976,   982,   984,   988,
+     990,   992,   995
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -691,50 +691,50 @@ static const yytype_int16 yyrhs[] =
      119,    96,    79,   102,    80,    82,   119,    83,    -1,     9,
       85,    68,    86,   119,    96,    82,   119,    83,    -1,   107,
       -1,   107,    78,   158,    -1,    57,    -1,   161,    74,    -1,
-     155,    -1,    39,   164,   163,    95,   180,   182,   183,    -1,
-      39,   164,    95,   180,   183,    -1,    39,    85,    68,    86,
-      35,    95,   180,   181,   171,   169,   172,    95,    -1,    71,
-     171,   169,   172,    74,    -1,    71,    74,    -1,    35,    -1,
-     109,    -1,    -1,    85,   165,    86,    -1,   166,    -1,   166,
-      78,   165,    -1,    21,    -1,    23,    -1,    24,    -1,    25,
-      -1,    31,    -1,    32,    -1,    33,    -1,    34,    -1,    26,
-      -1,    27,    -1,    28,    -1,    52,    -1,    51,   125,    -1,
-      72,    -1,    73,    -1,    57,    -1,    56,    -1,    96,    -1,
-      -1,    58,    -1,    58,    78,   168,    -1,    -1,    58,    -1,
-      58,    85,   169,    86,   169,    -1,    58,    76,   169,    77,
-     169,    -1,    58,    82,   168,    83,   169,    -1,    82,   169,
-      83,   169,    -1,   113,    95,    85,    -1,    76,    -1,    77,
-      -1,   113,    -1,   113,    95,   130,    -1,   113,    95,    87,
-     167,    -1,   170,   169,    86,    -1,     6,    -1,    69,    -1,
-      70,    -1,    95,    -1,   175,    88,    80,    95,    -1,   175,
-      89,    95,    -1,   175,    85,   175,    86,    -1,   175,    85,
-      56,    86,    -1,   175,    82,   175,    83,    -1,   170,   169,
-      86,    -1,   174,    75,   113,    95,    79,   175,    80,    -1,
-     113,    95,    79,   175,    80,    -1,   174,    75,   176,    79,
-     175,    80,    -1,   173,    -1,   173,    78,   178,    -1,   177,
-      -1,   177,    78,   179,    -1,    82,   178,    83,    -1,    82,
-      83,    -1,    85,   179,    86,    -1,    85,    86,    -1,    -1,
-      20,    87,    56,    -1,    -1,   189,    -1,    76,   184,    77,
-      -1,   189,    -1,   189,   184,    -1,   189,    -1,   189,   184,
-      -1,    -1,    50,    82,   187,    83,    -1,    55,    -1,    55,
-      78,   187,    -1,    57,    -1,    -1,    45,   188,   171,   169,
-     172,   186,    -1,    49,    82,    55,   180,    83,   171,   169,
-      77,    -1,    43,   195,    76,    77,    -1,    43,   195,   189,
-      -1,    43,   195,    76,   184,    77,    -1,    44,    76,   185,
-      77,    -1,    40,   193,   169,    74,   169,    74,   169,   192,
-      76,   184,    77,    -1,    40,   193,   169,    74,   169,    74,
-     169,   192,   189,    -1,    41,    85,    55,    86,   193,   169,
-      75,   169,    78,   169,   192,   189,    -1,    41,    85,    55,
-      86,   193,   169,    75,   169,    78,   169,   192,    76,   184,
-      77,    -1,    47,   193,   169,   192,   189,   190,    -1,    47,
-     193,   169,   192,    76,   184,    77,   190,    -1,    42,   193,
-     169,   192,   189,    -1,    42,   193,   169,   192,    76,   184,
-      77,    -1,    46,   191,    74,    -1,   171,   169,   172,    -1,
-      -1,    48,   189,    -1,    48,    76,   184,    77,    -1,    55,
-      -1,    55,    78,   191,    -1,    83,    -1,    82,    -1,    55,
-     180,    -1,    55,   196,   169,   197,   180,    -1,   194,    -1,
-     194,    78,   195,    -1,    85,    -1,    86,    -1,    59,    95,
-      -1,    60,    95,    -1
+     151,   161,    74,    -1,   155,    -1,    39,   164,   163,    95,
+     180,   182,   183,    -1,    39,   164,    95,   180,   183,    -1,
+      39,    85,    68,    86,    35,    95,   180,   181,   171,   169,
+     172,    95,    -1,    71,   171,   169,   172,    74,    -1,    71,
+      74,    -1,    35,    -1,   109,    -1,    -1,    85,   165,    86,
+      -1,   166,    -1,   166,    78,   165,    -1,    21,    -1,    23,
+      -1,    24,    -1,    25,    -1,    31,    -1,    32,    -1,    33,
+      -1,    34,    -1,    26,    -1,    27,    -1,    28,    -1,    52,
+      -1,    51,   125,    -1,    72,    -1,    73,    -1,    57,    -1,
+      56,    -1,    96,    -1,    -1,    58,    -1,    58,    78,   168,
+      -1,    -1,    58,    -1,    58,    85,   169,    86,   169,    -1,
+      58,    76,   169,    77,   169,    -1,    58,    82,   168,    83,
+     169,    -1,    82,   169,    83,   169,    -1,   113,    95,    85,
+      -1,    76,    -1,    77,    -1,   113,    -1,   113,    95,   130,
+      -1,   113,    95,    87,   167,    -1,   170,   169,    86,    -1,
+       6,    -1,    69,    -1,    70,    -1,    95,    -1,   175,    88,
+      80,    95,    -1,   175,    89,    95,    -1,   175,    85,   175,
+      86,    -1,   175,    85,    56,    86,    -1,   175,    82,   175,
+      83,    -1,   170,   169,    86,    -1,   174,    75,   113,    95,
+      79,   175,    80,    -1,   113,    95,    79,   175,    80,    -1,
+     174,    75,   176,    79,   175,    80,    -1,   173,    -1,   173,
+      78,   178,    -1,   177,    -1,   177,    78,   179,    -1,    82,
+     178,    83,    -1,    82,    83,    -1,    85,   179,    86,    -1,
+      85,    86,    -1,    -1,    20,    87,    56,    -1,    -1,   189,
+      -1,    76,   184,    77,    -1,   189,    -1,   189,   184,    -1,
+     189,    -1,   189,   184,    -1,    -1,    50,    82,   187,    83,
+      -1,    55,    -1,    55,    78,   187,    -1,    57,    -1,    -1,
+      45,   188,   171,   169,   172,   186,    -1,    49,    82,    55,
+     180,    83,   171,   169,    77,    -1,    43,   195,    76,    77,
+      -1,    43,   195,   189,    -1,    43,   195,    76,   184,    77,
+      -1,    44,    76,   185,    77,    -1,    40,   193,   169,    74,
+     169,    74,   169,   192,    76,   184,    77,    -1,    40,   193,
+     169,    74,   169,    74,   169,   192,   189,    -1,    41,    85,
+      55,    86,   193,   169,    75,   169,    78,   169,   192,   189,
+      -1,    41,    85,    55,    86,   193,   169,    75,   169,    78,
+     169,   192,    76,   184,    77,    -1,    47,   193,   169,   192,
+     189,   190,    -1,    47,   193,   169,   192,    76,   184,    77,
+     190,    -1,    42,   193,   169,   192,   189,    -1,    42,   193,
+     169,   192,    76,   184,    77,    -1,    46,   191,    74,    -1,
+     171,   169,   172,    -1,    -1,    48,   189,    -1,    48,    76,
+     184,    77,    -1,    55,    -1,    55,    78,   191,    -1,    83,
+      -1,    82,    -1,    55,   180,    -1,    55,   196,   169,   197,
+     180,    -1,   194,    -1,   194,    78,   195,    -1,    85,    -1,
+      86,    -1,    59,    95,    -1,    60,    95,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -757,18 +757,18 @@ static const yytype_uint16 yyrline[] =
      572,   574,   576,   578,   580,   584,   586,   591,   609,   613,
      615,   617,   618,   620,   622,   624,   628,   630,   632,   638,
      641,   646,   648,   650,   656,   664,   666,   669,   673,   675,
-     679,   690,   706,   724,   726,   730,   732,   737,   738,   742,
-     744,   748,   750,   752,   754,   756,   758,   760,   762,   764,
-     766,   768,   770,   772,   774,   776,   780,   782,   784,   789,
-     790,   792,   801,   802,   804,   810,   816,   822,   830,   837,
-     845,   852,   854,   856,   858,   865,   866,   867,   870,   871,
-     872,   873,   880,   886,   895,   902,   908,   914,   922,   924,
-     928,   930,   934,   936,   940,   942,   947,   948,   953,   954,
-     956,   960,   962,   966,   968,   973,   974,   978,   980,   984,
-     987,   990,   994,  1008,  1010,  1012,  1014,  1016,  1019,  1022,
-    1025,  1028,  1030,  1032,  1034,  1036,  1038,  1042,  1043,  1045,
-    1048,  1050,  1054,  1058,  1062,  1070,  1078,  1080,  1084,  1087,
-    1091,  1095
+     680,   684,   695,   711,   729,   731,   735,   737,   742,   743,
+     747,   749,   753,   755,   757,   759,   761,   763,   765,   767,
+     769,   771,   773,   775,   777,   779,   781,   785,   787,   789,
+     794,   795,   797,   806,   807,   809,   815,   821,   827,   835,
+     842,   850,   857,   859,   861,   863,   870,   871,   872,   875,
+     876,   877,   878,   885,   891,   900,   907,   913,   919,   927,
+     929,   933,   935,   939,   941,   945,   947,   952,   953,   958,
+     959,   961,   965,   967,   971,   973,   978,   979,   983,   985,
+     989,   992,   995,   999,  1013,  1015,  1017,  1019,  1021,  1024,
+    1027,  1030,  1033,  1035,  1037,  1039,  1041,  1043,  1047,  1048,
+    1050,  1053,  1055,  1059,  1063,  1067,  1075,  1083,  1085,  1089,
+    1092,  1096,  1100
 };
 #endif
 
@@ -853,18 +853,18 @@ static const yytype_uint8 yyr1[] =
      152,   152,   152,   152,   152,   153,   153,   154,   154,   155,
      155,   155,   155,   155,   155,   155,   156,   156,   156,   156,
      156,   157,   157,   157,   157,   158,   158,   159,   160,   160,
-     161,   161,   161,   162,   162,   163,   163,   164,   164,   165,
-     165,   166,   166,   166,   166,   166,   166,   166,   166,   166,
-     166,   166,   166,   166,   166,   166,   167,   167,   167,   168,
-     168,   168,   169,   169,   169,   169,   169,   169,   170,   171,
-     172,   173,   173,   173,   173,   174,   174,   174,   175,   175,
-     175,   175,   175,   175,   176,   177,   177,   177,   178,   178,
-     179,   179,   180,   180,   181,   181,   182,   182,   183,   183,
-     183,   184,   184,   185,   185,   186,   186,   187,   187,   188,
-     188,   189,   189,   189,   189,   189,   189,   189,   189,   189,
-     189,   189,   189,   189,   189,   189,   189,   190,   190,   190,
-     191,   191,   192,   193,   194,   194,   195,   195,   196,   197,
-     198,   199
+     160,   161,   161,   161,   162,   162,   163,   163,   164,   164,
+     165,   165,   166,   166,   166,   166,   166,   166,   166,   166,
+     166,   166,   166,   166,   166,   166,   166,   167,   167,   167,
+     168,   168,   168,   169,   169,   169,   169,   169,   169,   170,
+     171,   172,   173,   173,   173,   173,   174,   174,   174,   175,
+     175,   175,   175,   175,   175,   176,   177,   177,   177,   178,
+     178,   179,   179,   180,   180,   181,   181,   182,   182,   183,
+     183,   183,   184,   184,   185,   185,   186,   186,   187,   187,
+     188,   188,   189,   189,   189,   189,   189,   189,   189,   189,
+     189,   189,   189,   189,   189,   189,   189,   189,   190,   190,
+     190,   191,   191,   192,   193,   194,   194,   195,   195,   196,
+     197,   198,   199
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -886,19 +886,19 @@ static const yytype_uint8 yyr2[] =
        2,     0,     2,     2,     3,     2,     3,     1,     3,     4,
        2,     2,     2,     2,     2,     1,     4,     0,     2,     2,
        2,     2,     2,     3,     3,     3,     3,     6,     9,     3,
-       6,     3,     6,     9,     9,     1,     3,     1,     2,     1,
-       7,     5,    12,     5,     2,     1,     1,     0,     3,     1,
-       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     2,     1,     1,     1,     1,     1,     0,
-       1,     3,     0,     1,     5,     5,     5,     4,     3,     1,
-       1,     1,     3,     4,     3,     1,     1,     1,     1,     4,
-       3,     4,     4,     4,     3,     7,     5,     6,     1,     3,
-       1,     3,     3,     2,     3,     2,     0,     3,     0,     1,
-       3,     1,     2,     1,     2,     0,     4,     1,     3,     1,
-       0,     6,     8,     4,     3,     5,     4,    11,     9,    12,
-      14,     6,     8,     5,     7,     3,     3,     0,     2,     4,
-       1,     3,     1,     1,     2,     5,     1,     3,     1,     1,
-       2,     2
+       6,     3,     6,     9,     9,     1,     3,     1,     2,     3,
+       1,     7,     5,    12,     5,     2,     1,     1,     0,     3,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     2,     1,     1,     1,     1,     1,
+       0,     1,     3,     0,     1,     5,     5,     5,     4,     3,
+       1,     1,     1,     3,     4,     3,     1,     1,     1,     1,
+       4,     3,     4,     4,     4,     3,     7,     5,     6,     1,
+       3,     1,     3,     3,     2,     3,     2,     0,     3,     0,
+       1,     3,     1,     2,     1,     2,     0,     4,     1,     3,
+       1,     0,     6,     8,     4,     3,     5,     4,    11,     9,
+      12,    14,     6,     8,     5,     7,     3,     3,     0,     2,
+       4,     1,     3,     1,     1,     2,     5,     1,     3,     1,
+       1,     2,     2
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -909,62 +909,63 @@ static const yytype_uint16 yydefact[] =
        3,     0,     0,     0,     2,     3,     9,     0,     0,     1,
        4,    14,     5,    12,    13,     6,     0,     0,     0,     0,
        0,     0,     0,     5,    32,    30,    31,     0,     0,    10,
-       0,   280,   281,   174,   209,   202,     0,    80,    80,    80,
+       0,   281,   282,   175,   210,   203,     0,    80,    80,    80,
        0,    88,    88,    88,    88,     0,    82,     0,     0,     0,
        5,    22,     0,     0,     0,    25,    26,    27,    28,     0,
       29,    23,     0,     0,     7,    17,     5,     0,    21,     0,
-     203,   202,     0,     0,    56,     0,    42,    43,    44,    45,
+     204,   203,     0,     0,    56,     0,    42,    43,    44,    45,
       53,    54,     0,    40,    59,    60,    65,    66,    67,    68,
       72,     0,    81,     0,     0,     0,     0,   165,     0,     0,
        0,     0,     0,     0,     0,     0,    95,     0,     0,     0,
      167,     0,     0,     0,   149,   150,    24,    88,    88,    88,
       88,     0,    82,   140,   141,   142,   143,   144,   152,   151,
-       8,    15,     0,    20,     0,   202,   199,   202,     0,   210,
+       8,    15,     0,    20,     0,   203,   200,   203,     0,   211,
        0,     0,    69,    52,    55,    46,    47,    50,    51,    38,
       58,    61,    62,    63,    70,     0,    71,    76,   159,   156,
        0,   161,     0,   153,    99,   100,     0,    90,    40,   110,
      110,   110,   110,    94,     0,     0,    97,     0,     0,     0,
        0,     0,    86,    87,     0,    84,   108,   155,   154,     0,
       68,     0,   137,     0,     7,     0,     0,     0,     0,     0,
-       0,    19,    11,     0,   200,     0,     0,   202,   173,     0,
+       0,    19,    11,     0,   201,     0,     0,   203,   174,     0,
       48,    49,    34,    35,    36,    39,     0,    33,     0,     0,
       76,    78,    80,     0,    80,    80,     0,    80,   166,    89,
        0,    57,     0,     0,     0,     0,     0,     0,   119,     0,
       96,   110,   110,    83,     0,   101,   129,     0,   135,   131,
-       0,   139,    18,   110,   110,   110,   110,   110,     0,   202,
-     199,   202,   202,   207,    79,     0,    41,     0,    73,    74,
+       0,   139,    18,   110,   110,   110,   110,   110,     0,   203,
+     200,   203,   203,   208,    79,     0,    41,     0,    73,    74,
        0,    77,     0,     0,     0,     0,     0,     0,    91,   112,
      111,   145,   147,   114,   115,   116,   117,   118,    98,     0,
        0,    85,   102,     0,   101,     0,     0,   134,   132,   133,
-     136,   138,     0,     0,     0,     0,     0,   127,   101,   205,
-     201,   206,   204,    37,     0,    75,   160,     0,   157,     0,
-       0,   162,     0,   177,     0,   169,   147,     0,   120,   121,
-       0,   107,   109,   130,   122,   123,   124,   125,   126,     0,
-       0,    80,    80,    80,   113,     0,     0,     7,   148,   168,
-     103,     0,   211,   202,   228,     0,     0,     0,     0,   181,
-     182,   183,   184,   189,   190,   191,   185,   186,   187,   188,
-      92,   192,     0,   194,   195,     0,   179,    56,    10,     0,
-       0,   176,     0,   146,     0,     0,   128,   101,     0,     0,
-      64,   158,   164,   163,    93,   193,     0,   178,     0,     0,
-     238,     0,   104,   105,   208,     0,   212,   214,   229,     0,
-     180,   233,     0,     0,     0,     0,     0,     0,   250,     0,
-       0,     0,   209,   202,   171,   239,   236,   197,   196,   198,
-     213,     0,   232,   273,   202,     0,   202,     0,   276,     0,
-       0,   249,     0,   270,     0,   202,     0,     0,   241,     0,
-       0,   238,     0,     0,     0,     0,   278,   274,   202,     0,
-     209,   254,     0,   243,   202,     0,   265,     0,     0,   240,
-     242,   266,     0,   170,     0,     0,   202,     0,   272,     0,
-       0,   277,   253,     0,   256,   244,     0,   271,     0,     0,
-     237,   215,   216,   217,   235,     0,     0,   230,     0,   202,
-       0,   202,   209,   263,   279,     0,   255,   245,   209,   267,
-       0,     0,     0,     0,   234,     0,   202,     0,     0,   275,
-       0,   251,     0,     0,   261,   202,     0,     0,   202,     0,
-     231,     0,     0,   202,   264,     0,   267,   209,   268,     0,
-     218,     0,     0,     0,     0,   172,     0,     0,   247,     0,
-     262,     0,   252,   226,     0,     0,     0,     0,     0,   224,
-       0,   209,   258,   202,     0,   246,   269,     0,     0,     0,
-       0,   220,     0,   227,     0,     0,   248,   223,   222,   221,
-     219,   225,   257,     0,   209,   259,     0,   260
+     136,   138,     0,     0,     0,     0,     0,   127,   101,   206,
+     202,   207,   205,    37,     0,    75,   160,     0,   157,     0,
+       0,   162,     0,   178,     0,     0,   170,   147,     0,   120,
+     121,     0,   107,   109,   130,   122,   123,   124,   125,   126,
+       0,     0,    80,    80,    80,   113,     0,     0,     0,     7,
+     148,   168,   103,     0,   212,   203,   229,     0,     0,     0,
+       0,   182,   183,   184,   185,   190,   191,   192,   186,   187,
+     188,   189,    92,   193,     0,   195,   196,     0,   180,    56,
+      10,     0,     0,   177,     0,   169,   146,     0,     0,   128,
+     101,     0,     0,    64,   158,   164,   163,    93,   194,     0,
+     179,     0,     0,   239,     0,   104,   105,   209,     0,   213,
+     215,   230,     0,   181,   234,     0,     0,     0,     0,     0,
+       0,   251,     0,     0,     0,   210,   203,   172,   240,   237,
+     198,   197,   199,   214,     0,   233,   274,   203,     0,   203,
+       0,   277,     0,     0,   250,     0,   271,     0,   203,     0,
+       0,   242,     0,     0,   239,     0,     0,     0,     0,   279,
+     275,   203,     0,   210,   255,     0,   244,   203,     0,   266,
+       0,     0,   241,   243,   267,     0,   171,     0,     0,   203,
+       0,   273,     0,     0,   278,   254,     0,   257,   245,     0,
+     272,     0,     0,   238,   216,   217,   218,   236,     0,     0,
+     231,     0,   203,     0,   203,   210,   264,   280,     0,   256,
+     246,   210,   268,     0,     0,     0,     0,   235,     0,   203,
+       0,     0,   276,     0,   252,     0,     0,   262,   203,     0,
+       0,   203,     0,   232,     0,     0,   203,   265,     0,   268,
+     210,   269,     0,   219,     0,     0,     0,     0,   173,     0,
+       0,   248,     0,   263,     0,   253,   227,     0,     0,     0,
+       0,     0,   225,     0,   210,   259,   203,     0,   247,   270,
+       0,     0,     0,     0,   221,     0,   228,     0,     0,   249,
+     224,   223,   222,   220,   226,   258,     0,   210,   260,     0,
+     261
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
@@ -973,253 +974,260 @@ static const yytype_int16 yydefgoto[] =
       -1,     3,     4,    21,   131,   168,    83,     5,    13,    22,
       23,   214,   215,   216,   150,    84,   169,    85,    86,    87,
       88,    89,    90,   217,   270,   220,   221,    52,    53,    93,
-     108,   184,   185,   100,   166,   395,   176,   105,   177,   167,
-     293,   385,   294,   295,    54,   233,   280,    55,    56,    57,
+     108,   184,   185,   100,   166,   398,   176,   105,   177,   167,
+     293,   388,   294,   295,    54,   233,   280,    55,    56,    57,
      106,    58,   123,   124,   125,   126,   127,   297,   248,   192,
-     193,    59,    60,   283,   324,   325,    62,    63,    98,   111,
-     326,   327,    24,   382,   346,   375,   376,   430,   205,    72,
-     353,   423,   140,   354,   496,   541,   529,   497,   355,   498,
-     400,   475,   451,   424,   447,   462,   521,   549,   442,   448,
-     524,   444,   479,   434,   438,   439,   458,   505,    25,    26
+     193,   324,    60,   283,   325,   326,    62,    63,    98,   111,
+     327,   328,    24,   384,   347,   377,   378,   433,   205,    72,
+     355,   426,   140,   356,   499,   544,   532,   500,   357,   501,
+     403,   478,   454,   427,   450,   465,   524,   552,   445,   451,
+     527,   447,   482,   437,   441,   442,   461,   508,    25,    26
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -459
+#define YYPACT_NINF -506
 static const yytype_int16 yypact[] =
 {
-     149,   -20,   -20,    58,  -459,   149,  -459,   222,   222,  -459,
-    -459,  -459,     9,  -459,  -459,  -459,   -20,   108,   -20,   -20,
-     252,   270,    -6,     9,  -459,  -459,  -459,    44,   109,  -459,
-     117,  -459,  -459,  -459,  -459,   -26,   255,   145,   145,    30,
-     109,   101,   101,   101,   101,   116,   129,   -20,   180,   166,
-       9,  -459,   176,   198,   225,  -459,  -459,  -459,  -459,   422,
-    -459,  -459,   228,   241,   253,  -459,     9,   152,  -459,   269,
-      62,   -26,   277,   569,  -459,   556,  -459,    77,  -459,  -459,
-    -459,  -459,   172,   114,  -459,  -459,   249,   286,   295,  -459,
-      12,   109,  -459,   109,   109,   282,   109,   302,   308,     6,
-     -20,   -20,   -20,   -20,   160,   313,   321,   323,   -20,   333,
-    -459,   335,   365,   310,  -459,  -459,  -459,   101,   101,   101,
-     101,   313,   129,  -459,  -459,  -459,  -459,  -459,  -459,  -459,
-    -459,  -459,   344,  -459,   367,   -26,   381,   -26,   340,  -459,
-     378,   360,    13,  -459,  -459,  -459,   304,  -459,  -459,   484,
-    -459,  -459,  -459,  -459,  -459,   373,  -459,    -8,   -41,   100,
-     369,   218,   109,  -459,  -459,  -459,   370,   384,   391,   388,
-     388,   388,   388,  -459,   -20,   385,   394,   387,   316,   -20,
-     425,   -20,  -459,  -459,   389,   399,   402,  -459,  -459,   -20,
-      87,   -20,   405,   412,   253,   -20,   -20,   -20,   -20,   -20,
-     -20,  -459,  -459,   407,   417,   423,   430,   -26,  -459,   -20,
-    -459,  -459,  -459,  -459,   440,  -459,   441,  -459,   -20,   318,
-     437,  -459,   145,   484,   145,   145,   484,   145,  -459,  -459,
-       6,  -459,   109,   267,   267,   267,   267,   438,  -459,   425,
-    -459,   388,   388,  -459,   323,   506,   442,   322,  -459,   444,
-     365,  -459,  -459,   388,   388,   388,   388,   388,   273,   -26,
-     381,   -26,   -26,  -459,  -459,   484,  -459,   445,  -459,   452,
-     447,  -459,   451,   455,   453,   109,   457,   459,  -459,   460,
-    -459,  -459,   123,  -459,  -459,  -459,  -459,  -459,  -459,   267,
-     267,  -459,  -459,   556,    16,   475,   556,  -459,  -459,  -459,
-    -459,  -459,   267,   267,   267,   267,   267,  -459,   506,  -459,
-    -459,  -459,  -459,  -459,   473,  -459,  -459,   486,  -459,   -23,
-     496,  -459,   109,   481,   511,  -459,   123,   516,  -459,  -459,
-     -20,  -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,   519,
-     556,   145,   145,   145,  -459,   280,   590,   253,  -459,  -459,
-     508,   521,   -20,   -26,   520,   514,   517,   522,   524,  -459,
-    -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,
-     542,  -459,   515,  -459,  -459,   523,   525,   547,   526,   528,
-     249,  -459,   -20,  -459,   527,   538,  -459,    34,   529,   556,
-    -459,  -459,  -459,  -459,  -459,  -459,   579,  -459,   197,   424,
-     211,   528,  -459,  -459,  -459,    33,  -459,  -459,  -459,   -20,
-    -459,  -459,   543,   545,   544,   545,   573,   561,   581,   584,
-     545,   558,   348,   -26,  -459,  -459,   621,  -459,  -459,   452,
-    -459,   528,  -459,  -459,   -26,   587,   -26,    40,   565,   404,
-     348,  -459,   568,   570,   572,   -26,   592,   582,   348,   277,
-     562,   211,   575,   576,   577,   578,  -459,  -459,   -26,   573,
-     293,  -459,   585,   348,   -26,   584,  -459,   578,   528,  -459,
-    -459,  -459,   602,  -459,   177,   568,   -26,   545,  -459,   456,
-     580,  -459,  -459,   588,  -459,  -459,   277,  -459,   468,   586,
-    -459,  -459,  -459,  -459,  -459,   -20,   589,   593,   591,   -26,
-     594,   -26,   348,  -459,  -459,   528,  -459,   617,   348,   622,
-     568,   595,   556,   349,  -459,   277,   -26,   597,   596,  -459,
-     598,  -459,   599,   518,  -459,   -26,   -20,   -20,   -26,   600,
-    -459,   -20,   578,   -26,  -459,   620,   622,   348,  -459,   601,
-    -459,    69,    81,   603,   -20,  -459,   530,   604,   605,   607,
-    -459,   608,  -459,  -459,   -20,   347,   606,   -20,   -20,  -459,
-      96,   348,  -459,   -26,   620,  -459,  -459,   274,   609,   379,
-     -20,  -459,   179,  -459,   610,   578,  -459,  -459,  -459,  -459,
-    -459,  -459,  -459,   540,   348,  -459,   611,  -459
+     223,     4,     4,    47,  -506,   223,  -506,   240,   240,  -506,
+    -506,  -506,     9,  -506,  -506,  -506,     4,   218,     4,     4,
+     275,   271,    -2,     9,  -506,  -506,  -506,    38,    65,  -506,
+     141,  -506,  -506,  -506,  -506,   -21,   256,   117,   117,    23,
+      65,    79,    79,    79,    79,   104,   152,     4,   188,   181,
+       9,  -506,   190,   220,   234,  -506,  -506,  -506,  -506,   525,
+    -506,  -506,   241,   253,   257,  -506,     9,   176,  -506,   270,
+      56,   -21,   258,   372,  -506,   487,  -506,    60,  -506,  -506,
+    -506,  -506,   172,   107,  -506,  -506,   284,   287,   289,  -506,
+      12,    65,  -506,    65,    65,   309,    65,   301,   319,     6,
+       4,     4,     4,     4,   124,   313,   324,   230,     4,   336,
+    -506,   378,   351,   363,  -506,  -506,  -506,    79,    79,    79,
+      79,   313,   152,  -506,  -506,  -506,  -506,  -506,  -506,  -506,
+    -506,  -506,   376,  -506,   401,   -21,   406,   -21,   382,  -506,
+     385,   386,    13,  -506,  -506,  -506,   236,  -506,  -506,   277,
+    -506,  -506,  -506,  -506,  -506,   387,  -506,    40,   -41,    55,
+     388,    72,    65,  -506,  -506,  -506,   389,   395,   397,   403,
+     403,   403,   403,  -506,     4,   393,   402,   400,   326,     4,
+     430,     4,  -506,  -506,   409,   405,   411,  -506,  -506,     4,
+      75,     4,   420,   429,   257,     4,     4,     4,     4,     4,
+       4,  -506,  -506,   442,   443,   441,   439,   -21,  -506,     4,
+    -506,  -506,  -506,  -506,   448,  -506,   447,  -506,     4,   335,
+     445,  -506,   117,   277,   117,   117,   277,   117,  -506,  -506,
+       6,  -506,    65,   276,   276,   276,   276,   446,  -506,   430,
+    -506,   403,   403,  -506,   230,   514,   456,   339,  -506,   457,
+     351,  -506,  -506,   403,   403,   403,   403,   403,   290,   -21,
+     406,   -21,   -21,  -506,  -506,   277,  -506,   451,  -506,   470,
+     469,  -506,   475,   489,   488,    65,   501,   508,  -506,   515,
+    -506,  -506,   366,  -506,  -506,  -506,  -506,  -506,  -506,   276,
+     276,  -506,  -506,   487,    16,   518,   487,  -506,  -506,  -506,
+    -506,  -506,   276,   276,   276,   276,   276,  -506,   514,  -506,
+    -506,  -506,  -506,  -506,   524,  -506,  -506,   526,  -506,    67,
+     528,  -506,    65,   511,   572,   535,  -506,   366,   539,  -506,
+    -506,     4,  -506,  -506,  -506,  -506,  -506,  -506,  -506,  -506,
+     538,   487,   117,   117,   117,  -506,   398,   559,   542,   257,
+    -506,  -506,   532,   544,     4,   -21,   549,   545,   546,   547,
+     548,  -506,  -506,  -506,  -506,  -506,  -506,  -506,  -506,  -506,
+    -506,  -506,   575,  -506,   550,  -506,  -506,   551,   555,   580,
+     556,   557,   284,  -506,     4,  -506,  -506,   554,   567,  -506,
+      15,   560,   487,  -506,  -506,  -506,  -506,  -506,  -506,   607,
+    -506,   197,   427,   125,   557,  -506,  -506,  -506,   136,  -506,
+    -506,  -506,     4,  -506,  -506,   561,   563,   562,   563,   588,
+     573,   591,   595,   563,   569,   212,   -21,  -506,  -506,   632,
+    -506,  -506,   470,  -506,   557,  -506,  -506,   -21,   598,   -21,
+     129,   576,   459,   212,  -506,   579,   578,   583,   -21,   603,
+     582,   212,   258,   574,   125,   577,   586,   581,   585,  -506,
+    -506,   -21,   588,   260,  -506,   587,   212,   -21,   595,  -506,
+     585,   557,  -506,  -506,  -506,   609,  -506,   177,   579,   -21,
+     563,  -506,   471,   584,  -506,  -506,   589,  -506,  -506,   258,
+    -506,   521,   590,  -506,  -506,  -506,  -506,  -506,     4,   594,
+     593,   592,   -21,   600,   -21,   212,  -506,  -506,   557,  -506,
+     613,   212,   624,   579,   596,   487,   293,  -506,   258,   -21,
+     601,   602,  -506,   599,  -506,   605,   533,  -506,   -21,     4,
+       4,   -21,   604,  -506,     4,   585,   -21,  -506,   622,   624,
+     212,  -506,   608,  -506,    51,    -8,   606,     4,  -506,   543,
+     610,   611,   597,  -506,   614,  -506,  -506,     4,   348,   615,
+       4,     4,  -506,    96,   212,  -506,   -21,   622,  -506,  -506,
+     359,   612,   369,     4,  -506,   312,  -506,   616,   585,  -506,
+    -506,  -506,  -506,  -506,  -506,  -506,   558,   212,  -506,   617,
+    -506
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -459,  -459,   676,  -459,  -188,    -1,    -9,   663,   683,     0,
-    -459,  -459,  -151,  -459,   531,  -459,   -63,   -27,   -71,   346,
-    -459,  -105,   618,   -31,  -459,  -459,   474,  -459,  -459,   -18,
-     574,   454,  -459,   -13,   467,  -459,  -459,   612,   461,  -459,
-     314,  -459,  -459,  -247,  -459,  -144,   380,  -459,  -459,  -459,
-     -68,  -459,  -459,  -459,  -459,  -459,  -459,  -459,   458,  -459,
-     462,  -459,  -459,  -134,   377,   684,  -459,  -459,   546,  -459,
-    -459,  -459,  -459,  -459,  -459,   306,  -459,  -459,   446,   -59,
-     199,   -17,  -407,  -459,  -459,  -418,  -459,  -459,  -265,   196,
-    -377,  -459,  -459,   259,  -438,  -459,  -459,   150,  -459,  -396,
-     181,   248,  -458,  -404,  -459,   256,  -459,  -459,  -459,  -459
+    -506,  -506,   679,  -506,  -188,    -1,    -9,   665,   682,     0,
+    -506,  -506,  -102,  -506,   519,  -506,   -63,   -27,   -71,   349,
+    -506,  -105,   625,   -31,  -506,  -506,   477,  -506,  -506,   -18,
+     618,   455,  -506,   -13,   472,  -506,  -506,   619,   462,  -506,
+     314,  -506,  -506,  -229,  -506,  -144,   381,  -506,  -506,  -506,
+     -54,  -506,  -506,  -506,  -506,  -506,  -506,  -506,   458,  -506,
+     460,   684,  -506,  -146,   379,   687,  -506,  -506,   552,  -506,
+    -506,   391,  -506,  -506,  -506,   308,  -506,  -506,   452,   -59,
+     196,   -17,  -417,  -506,  -506,  -505,  -506,  -506,  -273,   200,
+    -380,  -506,  -506,   259,  -441,  -506,  -506,   150,  -506,  -399,
+     179,   251,  -461,  -407,  -506,   261,  -506,  -506,  -506,  -506
 };
 
 /* 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 -176
+#define YYTABLE_NINF -177
 static const yytype_int16 yytable[] =
 {
-       7,     8,   141,    35,   425,    91,   252,   190,    30,   488,
-     470,   436,   138,    97,    15,    27,   445,    31,    32,    67,
-      94,    96,   483,    65,   426,   485,   234,   235,   236,   101,
-     102,   103,    70,   292,    69,     6,   164,   179,   170,   171,
-     172,   222,   471,   461,   463,   186,   109,   331,   154,   154,
-     113,   292,    69,   199,   452,   425,    71,   165,     9,   342,
-     457,   339,    16,    17,   518,    92,   132,    69,    18,    19,
-     522,    64,   273,   501,   546,   276,   203,   219,   206,   507,
-      20,   191,   157,   503,   158,   159,   -16,   161,    29,   427,
-     428,   489,   509,  -106,   155,   155,   156,   289,   290,   551,
-     284,   285,   286,   175,   195,   196,   197,   198,   531,   302,
-     303,   304,   305,   306,   313,    95,   241,   583,   242,   404,
-      66,   405,   399,   574,   408,   456,   560,   538,   519,    36,
-      37,    38,    39,    40,   412,    97,   567,   569,   135,   143,
-     572,    47,    48,   144,   136,   190,   586,   137,   263,   553,
-     562,   554,     1,     2,   555,   328,   329,   556,   557,   383,
-     558,    28,   323,    29,    29,  -131,   404,  -131,   334,   335,
-     336,   337,   338,   237,   247,    69,   573,   175,   554,   223,
-      92,   555,   224,   491,   556,   557,    99,   585,   246,    69,
-     249,    68,    69,   149,   253,   254,   255,   256,   257,   258,
-     309,   104,   311,   312,   272,   279,   274,   275,   264,   277,
-     269,   173,    74,    75,   107,     6,   174,   267,   359,   191,
-     360,   361,   362,   363,   364,   365,   133,    69,   366,   367,
-     368,   369,    29,   145,   146,   147,   148,   110,    76,    77,
-      78,    79,    80,    81,    82,   112,   492,   493,   370,   371,
-     114,   413,   414,   415,   416,   417,   418,   419,   420,   581,
-     421,   554,   330,   494,   555,   333,   319,   556,   557,   373,
-     374,    73,   115,     1,     2,   380,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,   422,    47,    48,
-      74,    75,    49,    69,   388,   279,    11,   226,    12,   116,
-     227,   359,   128,   360,   361,   362,   363,   364,   365,   352,
-      29,   366,   367,   368,   369,   129,    76,    77,    78,    79,
-      80,    81,    82,   356,   357,   358,    33,   130,    34,   350,
-     151,   370,   371,   413,   414,   415,   416,   417,   418,   419,
-     420,   281,   421,   282,   134,   379,    50,   307,   372,   308,
-     160,   387,   373,   374,   139,   491,   554,   577,   352,   555,
-     182,   183,   556,   557,   449,   210,   211,   152,   352,    34,
-     482,     6,   174,    29,   268,   453,   153,   455,   298,   299,
-     162,   401,   163,   189,    74,    75,   467,   194,   413,   414,
-     415,   416,   417,   418,   419,   420,   429,   421,   178,   480,
-      74,    75,     6,   568,    29,   486,   180,   187,   431,   188,
-      76,    77,    78,    79,    80,    81,    82,   500,   492,   493,
-      29,   201,   202,   207,    34,   464,    76,    77,    78,    79,
-      80,    81,    82,   117,   118,   119,   120,   121,   122,   204,
-     515,   209,   517,   495,   413,   414,   415,   416,   417,   418,
-     419,   420,   208,   421,   218,   225,   229,   532,   499,    74,
-      75,   554,   230,   232,   555,   579,   539,   556,   557,   543,
-     149,   238,   239,   240,   547,   243,   173,   244,   245,    29,
-     460,   527,   495,   250,   259,    76,    77,    78,    79,    80,
-      81,    82,   251,   525,   511,   260,   413,   414,   415,   416,
-     417,   418,   419,   420,   575,   421,   261,   411,   413,   414,
-     415,   416,   417,   418,   419,   420,   262,   421,   265,    74,
-      75,   266,   219,   292,   287,   540,   542,    69,   314,   296,
-     545,   247,   502,   315,   316,   317,   318,   320,   322,    29,
-     212,   213,   321,   540,   508,    76,    77,    78,    79,    80,
-      81,    82,   332,   540,   540,   340,   571,   540,   413,   414,
-     415,   416,   417,   418,   419,   420,   345,   421,   341,   580,
-     413,   414,   415,   416,   417,   418,   419,   420,   343,   421,
-     413,   414,   415,   416,   417,   418,   419,   420,   347,   421,
-     349,    74,    75,   384,   537,   386,   351,   390,   389,   394,
-     391,   396,  -175,   398,    74,   392,   561,   393,    -9,   397,
-     399,    29,   403,   402,   409,   407,   584,    76,    77,    78,
-      79,    80,    81,    82,    29,   377,   432,   433,   437,   435,
-      76,    77,    78,    79,    80,    81,    82,   440,   441,   443,
-     446,   450,   454,   459,    34,   378,   466,   468,   465,   472,
-     476,    76,    77,    78,    79,    80,    81,    82,   490,   469,
-     474,   478,   484,   477,   512,   506,   504,   520,   516,   510,
-     523,   513,   533,   534,   526,   548,   536,   514,   552,   544,
-     535,    10,   563,   564,    51,   566,   570,   582,   587,   559,
-     565,    14,   381,   142,   271,   578,   200,   278,   291,   231,
-     288,   406,   344,   348,   410,    61,   310,   300,   228,   530,
-     473,   528,   301,   487,   576,   481,     0,   550,   181
+       7,     8,   141,    35,   428,    91,   252,   190,    30,   491,
+     473,   439,   138,    97,    15,    27,   448,    31,    32,    67,
+      94,    96,   486,    65,   429,   488,   234,   235,   236,   101,
+     102,   103,   292,   292,    69,   474,   164,    70,   170,   171,
+     172,   222,   563,   464,   466,   186,   109,     9,   154,   154,
+     113,   179,   570,   572,   455,   428,   575,   165,    92,     6,
+     460,    71,    16,    17,   521,   332,   132,   199,    18,    19,
+     525,   561,   510,   504,   549,    64,   203,   407,   206,   340,
+      20,   191,   157,   506,   158,   159,   -16,   161,   284,   285,
+     286,   492,   512,  -106,   155,   155,   156,   289,   290,   554,
+     407,   534,   408,   175,   195,   196,   197,   198,    95,   302,
+     303,   304,   305,   306,    66,    69,   241,   586,   242,   411,
+      29,   273,   143,   577,   276,   219,   144,   541,   522,   415,
+      69,   556,   135,   557,   223,    97,   558,   224,   136,   559,
+     560,   137,    69,   329,   330,   190,   589,    69,   263,   343,
+     565,   226,    92,  -131,   227,  -131,   335,   336,   337,   338,
+     339,   386,   247,   313,    99,   416,   417,   418,   419,   420,
+     421,   422,   423,   237,   424,   173,   576,   175,   557,     6,
+     174,   558,    69,   494,   559,   560,   149,   588,   246,   104,
+     249,    29,   430,   431,   253,   254,   255,   256,   257,   258,
+     309,   425,   311,   312,   272,   279,   274,   275,   264,   277,
+     269,   402,    74,    75,   459,    68,    69,   267,   361,   191,
+     362,   363,   364,   365,   366,   367,     1,     2,   368,   369,
+     370,   371,    29,   145,   146,   147,   148,   107,    76,    77,
+      78,    79,    80,    81,    82,   110,   495,   496,   372,   373,
+     133,    69,   416,   417,   418,   419,   420,   421,   422,   423,
+     112,   424,   331,   497,   114,   334,   319,   182,   183,   375,
+     376,    28,    73,    29,     1,     2,   382,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    34,    47,
+      48,    74,    75,    49,   115,   279,   391,   210,   211,   494,
+     416,   417,   418,   419,   420,   421,   422,   423,   116,   424,
+     354,    29,    74,    75,    11,   128,    12,    76,    77,    78,
+      79,    80,    81,    82,   358,   359,   360,   129,    74,    75,
+     352,   130,    29,   212,   213,   139,    34,   485,    76,    77,
+      78,    79,    80,    81,    82,   134,   381,    50,    29,    33,
+     281,    34,   282,   390,    76,    77,    78,    79,    80,    81,
+      82,   354,   495,   496,   307,   151,   308,   452,   152,   189,
+     153,   354,    36,    37,    38,    39,    40,   160,   456,   162,
+     458,     6,   174,   404,    47,    48,    74,    75,    49,   470,
+      29,   268,   584,   163,   557,   298,   299,   558,   178,   432,
+     559,   560,   483,     6,   571,   323,    29,    74,   489,   180,
+     187,   434,    76,    77,    78,    79,    80,    81,    82,   361,
+     503,   362,   363,   364,   365,   366,   367,    29,   467,   368,
+     369,   370,   371,    76,    77,    78,    79,    80,    81,    82,
+     194,   557,   580,   518,   558,   520,   498,   559,   560,   372,
+     373,   557,   188,   201,   558,   582,   202,   559,   560,   208,
+     535,   502,    74,    75,   204,   207,   374,   209,   218,   542,
+     375,   376,   546,   230,   225,   229,   149,   550,   232,   238,
+     239,   173,    29,   244,   530,   498,   240,   245,    76,    77,
+      78,    79,    80,    81,    82,   243,   528,   514,   250,   416,
+     417,   418,   419,   420,   421,   422,   423,   578,   424,   251,
+     414,   416,   417,   418,   419,   420,   421,   422,   423,   259,
+     424,   260,    74,    75,   261,   262,   265,   266,   543,   545,
+     219,   292,   287,   548,   314,   463,   117,   118,   119,   120,
+     121,   122,    29,   296,   247,    69,   543,   505,    76,    77,
+      78,    79,    80,    81,    82,   315,   543,   543,   316,   574,
+     543,   416,   417,   418,   419,   420,   421,   422,   423,   317,
+     424,   318,   583,   416,   417,   418,   419,   420,   421,   422,
+     423,   320,   424,   416,   417,   418,   419,   420,   421,   422,
+     423,   321,   424,   322,   379,   333,   346,   511,   416,   417,
+     418,   419,   420,   421,   422,   423,   341,   424,   342,   540,
+     344,   323,   349,   351,   380,   353,   385,   387,   389,   564,
+      76,    77,    78,    79,    80,    81,    82,   392,   393,   394,
+     395,   396,   397,   401,   587,  -176,   399,   400,    -9,   402,
+     405,   406,   412,   440,   435,   436,   410,   438,   444,   443,
+     446,   449,   453,   457,   462,    34,   468,   469,   471,   472,
+     479,   475,   477,   523,   487,   493,   509,   480,   481,   515,
+     507,   516,   526,   513,   519,   529,   536,   551,   517,   537,
+     568,   538,   539,   547,    10,   555,    51,   231,   566,   567,
+      14,   569,   562,   585,   590,   573,   383,   271,   581,   291,
+     142,   288,   278,   345,   409,    59,   350,   300,    61,   413,
+     301,   531,   310,   476,   228,   348,   533,   579,   553,   490,
+       0,     0,     0,   484,     0,   181,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     200
 };
 
 static const yytype_int16 yycheck[] =
 {
-       1,     2,    73,    20,   400,    36,   194,   112,    17,   467,
-     448,   415,    71,    40,     5,    16,   420,    18,    19,    28,
-      38,    39,   460,    23,   401,   463,   170,   171,   172,    42,
-      43,    44,    58,    17,    75,    55,    30,   105,   101,   102,
-     103,    82,   449,   439,   440,   108,    47,   294,    36,    36,
-      50,    17,    75,   121,   431,   451,    82,    51,     0,    82,
-     437,   308,    53,    54,   502,    35,    66,    75,    59,    60,
-     508,    77,   223,   477,   532,   226,   135,    85,   137,   486,
-      71,   112,    91,   479,    93,    94,    77,    96,    55,    56,
-      57,   468,   488,    77,    82,    82,    84,   241,   242,   537,
-     234,   235,   236,   104,   117,   118,   119,   120,   515,   253,
-     254,   255,   256,   257,   265,    85,   179,   575,   181,    85,
-      76,    87,    82,   561,   389,    85,   544,   523,   505,     6,
-       7,     8,     9,    10,   399,   162,   554,   555,    76,    62,
-     558,    18,    19,    66,    82,   250,   584,    85,   207,    80,
-     546,    82,     3,     4,    85,   289,   290,    88,    89,   347,
-      79,    53,    39,    55,    55,    78,    85,    80,   302,   303,
-     304,   305,   306,   174,    87,    75,    80,   178,    82,    79,
-      35,    85,    82,     6,    88,    89,    85,   583,   189,    75,
-     191,    74,    75,    79,   195,   196,   197,   198,   199,   200,
-     259,    85,   261,   262,   222,   232,   224,   225,   209,   227,
-     219,    51,    35,    36,    85,    55,    56,   218,    21,   250,
-      23,    24,    25,    26,    27,    28,    74,    75,    31,    32,
-      33,    34,    55,    61,    62,    63,    64,    57,    61,    62,
-      63,    64,    65,    66,    67,    79,    69,    70,    51,    52,
-      74,    40,    41,    42,    43,    44,    45,    46,    47,    80,
-      49,    82,   293,    86,    85,   296,   275,    88,    89,    72,
-      73,    16,    74,     3,     4,   346,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    76,    18,    19,
-      35,    36,    22,    75,   353,   322,    74,    79,    76,    74,
-      82,    21,    74,    23,    24,    25,    26,    27,    28,   340,
-      55,    31,    32,    33,    34,    74,    61,    62,    63,    64,
-      65,    66,    67,   341,   342,   343,    74,    74,    76,   330,
-      81,    51,    52,    40,    41,    42,    43,    44,    45,    46,
-      47,    74,    49,    76,    75,   346,    76,    74,    68,    76,
-      68,   352,    72,    73,    77,     6,    82,    83,   389,    85,
-      37,    38,    88,    89,   423,    61,    62,    81,   399,    76,
-      77,    55,    56,    55,    56,   434,    81,   436,    56,    57,
-      78,   382,    74,    18,    35,    36,   445,    77,    40,    41,
-      42,    43,    44,    45,    46,    47,   405,    49,    85,   458,
-      35,    36,    55,    56,    55,   464,    85,    74,   409,    74,
-      61,    62,    63,    64,    65,    66,    67,   476,    69,    70,
-      55,    77,    55,    83,    76,   442,    61,    62,    63,    64,
-      65,    66,    67,    11,    12,    13,    14,    15,    16,    58,
-     499,    81,   501,   474,    40,    41,    42,    43,    44,    45,
-      46,    47,    74,    49,    81,    86,    86,   516,   475,    35,
-      36,    82,    78,    75,    85,    86,   525,    88,    89,   528,
-      79,    86,    78,    86,   533,    86,    51,    78,    76,    55,
-      76,   512,   513,    78,    77,    61,    62,    63,    64,    65,
-      66,    67,    80,   510,   495,    78,    40,    41,    42,    43,
-      44,    45,    46,    47,   563,    49,    83,    83,    40,    41,
-      42,    43,    44,    45,    46,    47,    86,    49,    78,    35,
-      36,    80,    85,    17,    86,   526,   527,    75,    83,    87,
-     531,    87,    76,    86,    83,    80,    83,    80,    78,    55,
-      56,    57,    83,   544,    76,    61,    62,    63,    64,    65,
-      66,    67,    77,   554,   555,    82,   557,   558,    40,    41,
-      42,    43,    44,    45,    46,    47,    85,    49,    82,   570,
-      40,    41,    42,    43,    44,    45,    46,    47,    82,    49,
-      40,    41,    42,    43,    44,    45,    46,    47,    77,    49,
-      74,    35,    36,    85,    76,    74,    77,    83,    78,    57,
-      83,    86,    55,    78,    35,    83,    76,    83,    82,    86,
-      82,    55,    74,    86,    35,    86,    76,    61,    62,    63,
-      64,    65,    66,    67,    55,    35,    83,    82,    55,    85,
-      61,    62,    63,    64,    65,    66,    67,    76,    57,    55,
-      82,    20,    55,    78,    76,    55,    74,    55,    78,    87,
-      74,    61,    62,    63,    64,    65,    66,    67,    56,    77,
-      85,    83,    77,    86,    75,    77,    86,    50,    74,    83,
-      48,    78,    75,    77,    79,    55,    77,    86,    77,    79,
-      82,     5,    78,    78,    21,    77,    80,    77,    77,    86,
-      83,     8,   346,    75,   220,    86,   122,   230,   244,   168,
-     239,   387,   322,   326,   398,    21,   260,   249,   162,   513,
-     451,   512,   250,   465,   564,   459,    -1,   536,   106
+       1,     2,    73,    20,   403,    36,   194,   112,    17,   470,
+     451,   418,    71,    40,     5,    16,   423,    18,    19,    28,
+      38,    39,   463,    23,   404,   466,   170,   171,   172,    42,
+      43,    44,    17,    17,    75,   452,    30,    58,   101,   102,
+     103,    82,   547,   442,   443,   108,    47,     0,    36,    36,
+      50,   105,   557,   558,   434,   454,   561,    51,    35,    55,
+     440,    82,    53,    54,   505,   294,    66,   121,    59,    60,
+     511,    79,   489,   480,   535,    77,   135,    85,   137,   308,
+      71,   112,    91,   482,    93,    94,    77,    96,   234,   235,
+     236,   471,   491,    77,    82,    82,    84,   241,   242,   540,
+      85,   518,    87,   104,   117,   118,   119,   120,    85,   253,
+     254,   255,   256,   257,    76,    75,   179,   578,   181,   392,
+      55,   223,    62,   564,   226,    85,    66,   526,   508,   402,
+      75,    80,    76,    82,    79,   162,    85,    82,    82,    88,
+      89,    85,    75,   289,   290,   250,   587,    75,   207,    82,
+     549,    79,    35,    78,    82,    80,   302,   303,   304,   305,
+     306,   349,    87,   265,    85,    40,    41,    42,    43,    44,
+      45,    46,    47,   174,    49,    51,    80,   178,    82,    55,
+      56,    85,    75,     6,    88,    89,    79,   586,   189,    85,
+     191,    55,    56,    57,   195,   196,   197,   198,   199,   200,
+     259,    76,   261,   262,   222,   232,   224,   225,   209,   227,
+     219,    82,    35,    36,    85,    74,    75,   218,    21,   250,
+      23,    24,    25,    26,    27,    28,     3,     4,    31,    32,
+      33,    34,    55,    61,    62,    63,    64,    85,    61,    62,
+      63,    64,    65,    66,    67,    57,    69,    70,    51,    52,
+      74,    75,    40,    41,    42,    43,    44,    45,    46,    47,
+      79,    49,   293,    86,    74,   296,   275,    37,    38,    72,
+      73,    53,    16,    55,     3,     4,   347,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    76,    18,
+      19,    35,    36,    22,    74,   322,   355,    61,    62,     6,
+      40,    41,    42,    43,    44,    45,    46,    47,    74,    49,
+     341,    55,    35,    36,    74,    74,    76,    61,    62,    63,
+      64,    65,    66,    67,   342,   343,   344,    74,    35,    36,
+     331,    74,    55,    56,    57,    77,    76,    77,    61,    62,
+      63,    64,    65,    66,    67,    75,   347,    76,    55,    74,
+      74,    76,    76,   354,    61,    62,    63,    64,    65,    66,
+      67,   392,    69,    70,    74,    81,    76,   426,    81,    18,
+      81,   402,     6,     7,     8,     9,    10,    68,   437,    78,
+     439,    55,    56,   384,    18,    19,    35,    36,    22,   448,
+      55,    56,    80,    74,    82,    56,    57,    85,    85,   408,
+      88,    89,   461,    55,    56,    39,    55,    35,   467,    85,
+      74,   412,    61,    62,    63,    64,    65,    66,    67,    21,
+     479,    23,    24,    25,    26,    27,    28,    55,   445,    31,
+      32,    33,    34,    61,    62,    63,    64,    65,    66,    67,
+      77,    82,    83,   502,    85,   504,   477,    88,    89,    51,
+      52,    82,    74,    77,    85,    86,    55,    88,    89,    74,
+     519,   478,    35,    36,    58,    83,    68,    81,    81,   528,
+      72,    73,   531,    78,    86,    86,    79,   536,    75,    86,
+      78,    51,    55,    78,   515,   516,    86,    76,    61,    62,
+      63,    64,    65,    66,    67,    86,   513,   498,    78,    40,
+      41,    42,    43,    44,    45,    46,    47,   566,    49,    80,
+      83,    40,    41,    42,    43,    44,    45,    46,    47,    77,
+      49,    78,    35,    36,    83,    86,    78,    80,   529,   530,
+      85,    17,    86,   534,    83,    76,    11,    12,    13,    14,
+      15,    16,    55,    87,    87,    75,   547,    76,    61,    62,
+      63,    64,    65,    66,    67,    86,   557,   558,    83,   560,
+     561,    40,    41,    42,    43,    44,    45,    46,    47,    80,
+      49,    83,   573,    40,    41,    42,    43,    44,    45,    46,
+      47,    80,    49,    40,    41,    42,    43,    44,    45,    46,
+      47,    83,    49,    78,    35,    77,    85,    76,    40,    41,
+      42,    43,    44,    45,    46,    47,    82,    49,    82,    76,
+      82,    39,    77,    74,    55,    77,    74,    85,    74,    76,
+      61,    62,    63,    64,    65,    66,    67,    78,    83,    83,
+      83,    83,    57,    78,    76,    55,    86,    86,    82,    82,
+      86,    74,    35,    55,    83,    82,    86,    85,    57,    76,
+      55,    82,    20,    55,    78,    76,    78,    74,    55,    77,
+      74,    87,    85,    50,    77,    56,    77,    86,    83,    75,
+      86,    78,    48,    83,    74,    79,    75,    55,    86,    77,
+      83,    82,    77,    79,     5,    77,    21,   168,    78,    78,
+       8,    77,    86,    77,    77,    80,   347,   220,    86,   244,
+      75,   239,   230,   322,   390,    21,   327,   249,    21,   401,
+     250,   515,   260,   454,   162,   324,   516,   567,   539,   468,
+      -1,    -1,    -1,   462,    -1,   106,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     122
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1258,33 +1266,34 @@ static const yytype_uint8 yystos[] =
      135,   121,    17,   130,   132,   133,    87,   147,    56,    57,
      148,   150,   135,   135,   135,   135,   135,    74,    76,   169,
      168,   169,   169,   102,    83,    86,    83,    80,    83,    96,
-      80,    83,    78,    39,   154,   155,   160,   161,   153,   153,
-     113,   133,    77,   113,   153,   153,   153,   153,   153,   133,
-      82,    82,    82,    82,   136,    85,   164,    77,   154,    74,
-      95,    77,   113,   170,   173,   178,   119,   119,   119,    21,
-      23,    24,    25,    26,    27,    28,    31,    32,    33,    34,
-      51,    52,    68,    72,    73,   165,   166,    35,    55,    95,
-     108,   109,   163,    94,    85,   131,    74,    95,   169,    78,
-      83,    83,    83,    83,    57,   125,    86,    86,    78,    82,
-     180,    95,    86,    74,    85,    87,   130,    86,   178,    35,
-     165,    83,   178,    40,    41,    42,    43,    44,    45,    46,
-      47,    49,    76,   171,   183,   189,   180,    56,    57,    96,
-     167,    95,    83,    82,   193,    85,   193,    55,   194,   195,
-      76,    57,   188,    55,   191,   193,    82,   184,   189,   169,
-      20,   182,   180,   169,    55,   169,    85,   180,   196,    78,
-      76,   189,   185,   189,   171,    78,    74,   169,    55,    77,
-     184,   172,    87,   183,    85,   181,    74,    86,    83,   192,
-     169,   195,    77,   184,    77,   184,   169,   191,   192,   180,
-      56,     6,    69,    70,    86,   113,   174,   177,   179,   171,
-     169,   193,    76,   189,    86,   197,    77,   172,    76,   189,
-      83,    95,    75,    78,    86,   169,    74,   169,   184,   180,
-      50,   186,   184,    48,   190,   171,    79,   113,   170,   176,
-     179,   172,   169,    75,    77,    82,    77,    76,   189,   169,
-      95,   175,    95,   169,    79,    95,   192,   169,    55,   187,
-     190,   184,    77,    80,    82,    85,    88,    89,    79,    86,
-     175,    76,   189,    78,    78,    83,    77,   175,    56,   175,
-      80,    95,   175,    80,   184,   169,   187,    83,    86,    86,
-      95,    80,    77,   192,    76,   189,   184,    77
+      80,    83,    78,    39,   151,   154,   155,   160,   161,   153,
+     153,   113,   133,    77,   113,   153,   153,   153,   153,   153,
+     133,    82,    82,    82,    82,   136,    85,   164,   161,    77,
+     154,    74,    95,    77,   113,   170,   173,   178,   119,   119,
+     119,    21,    23,    24,    25,    26,    27,    28,    31,    32,
+      33,    34,    51,    52,    68,    72,    73,   165,   166,    35,
+      55,    95,   108,   109,   163,    74,    94,    85,   131,    74,
+      95,   169,    78,    83,    83,    83,    83,    57,   125,    86,
+      86,    78,    82,   180,    95,    86,    74,    85,    87,   130,
+      86,   178,    35,   165,    83,   178,    40,    41,    42,    43,
+      44,    45,    46,    47,    49,    76,   171,   183,   189,   180,
+      56,    57,    96,   167,    95,    83,    82,   193,    85,   193,
+      55,   194,   195,    76,    57,   188,    55,   191,   193,    82,
+     184,   189,   169,    20,   182,   180,   169,    55,   169,    85,
+     180,   196,    78,    76,   189,   185,   189,   171,    78,    74,
+     169,    55,    77,   184,   172,    87,   183,    85,   181,    74,
+      86,    83,   192,   169,   195,    77,   184,    77,   184,   169,
+     191,   192,   180,    56,     6,    69,    70,    86,   113,   174,
+     177,   179,   171,   169,   193,    76,   189,    86,   197,    77,
+     172,    76,   189,    83,    95,    75,    78,    86,   169,    74,
+     169,   184,   180,    50,   186,   184,    48,   190,   171,    79,
+     113,   170,   176,   179,   172,   169,    75,    77,    82,    77,
+      76,   189,   169,    95,   175,    95,   169,    79,    95,   192,
+     169,    55,   187,   190,   184,    77,    80,    82,    85,    88,
+      89,    79,    86,   175,    76,   189,    78,    78,    83,    77,
+     175,    56,   175,    80,    95,   175,    80,   184,   169,   187,
+      83,    86,    86,    95,    80,    77,   192,    76,   189,   184,
+      77
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -3317,13 +3326,23 @@ yyreduce:
 
 /* Line 1455 of yacc.c  */
 #line 676 "xi-grammar.y"
-    { (yyval.member) = (yyvsp[(1) - (1)].member); }
+    {
+                  (yyvsp[(2) - (3)].entry)->tspec = (yyvsp[(1) - (3)].tvarlist);
+                  (yyval.member) = (yyvsp[(2) - (3)].entry);
+                }
     break;
 
   case 170:
 
 /* Line 1455 of yacc.c  */
-#line 680 "xi-grammar.y"
+#line 681 "xi-grammar.y"
+    { (yyval.member) = (yyvsp[(1) - (1)].member); }
+    break;
+
+  case 171:
+
+/* Line 1455 of yacc.c  */
+#line 685 "xi-grammar.y"
     { 
                  if ((yyvsp[(7) - (7)].sc) != 0) { 
                    (yyvsp[(7) - (7)].sc)->con1 = new SdagConstruct(SIDENT, (yyvsp[(4) - (7)].strval));
@@ -3336,10 +3355,10 @@ yyreduce:
                }
     break;
 
-  case 171:
+  case 172:
 
 /* Line 1455 of yacc.c  */
-#line 691 "xi-grammar.y"
+#line 696 "xi-grammar.y"
     { 
                  if ((yyvsp[(5) - (5)].sc) != 0) {
                    (yyvsp[(5) - (5)].sc)->con1 = new SdagConstruct(SIDENT, (yyvsp[(3) - (5)].strval));
@@ -3357,10 +3376,10 @@ yyreduce:
                }
     break;
 
-  case 172:
+  case 173:
 
 /* Line 1455 of yacc.c  */
-#line 707 "xi-grammar.y"
+#line 712 "xi-grammar.y"
     {
                   int attribs = SACCEL;
                   const char* name = (yyvsp[(6) - (12)].strval);
@@ -3378,206 +3397,206 @@ yyreduce:
                 }
     break;
 
-  case 173:
+  case 174:
 
 /* Line 1455 of yacc.c  */
-#line 725 "xi-grammar.y"
+#line 730 "xi-grammar.y"
     { (yyval.accelBlock) = new AccelBlock(lineno, new XStr((yyvsp[(3) - (5)].strval))); }
     break;
 
-  case 174:
+  case 175:
 
 /* Line 1455 of yacc.c  */
-#line 727 "xi-grammar.y"
+#line 732 "xi-grammar.y"
     { (yyval.accelBlock) = new AccelBlock(lineno, NULL); }
     break;
 
-  case 175:
+  case 176:
 
 /* Line 1455 of yacc.c  */
-#line 731 "xi-grammar.y"
+#line 736 "xi-grammar.y"
     { (yyval.type) = new BuiltinType("void"); }
     break;
 
-  case 176:
+  case 177:
 
 /* Line 1455 of yacc.c  */
-#line 733 "xi-grammar.y"
+#line 738 "xi-grammar.y"
     { (yyval.type) = (yyvsp[(1) - (1)].ptype); }
     break;
 
-  case 177:
+  case 178:
 
 /* Line 1455 of yacc.c  */
-#line 737 "xi-grammar.y"
+#line 742 "xi-grammar.y"
     { (yyval.intval) = 0; }
     break;
 
-  case 178:
+  case 179:
 
 /* Line 1455 of yacc.c  */
-#line 739 "xi-grammar.y"
+#line 744 "xi-grammar.y"
     { (yyval.intval) = (yyvsp[(2) - (3)].intval); }
     break;
 
-  case 179:
+  case 180:
 
 /* Line 1455 of yacc.c  */
-#line 743 "xi-grammar.y"
+#line 748 "xi-grammar.y"
     { (yyval.intval) = (yyvsp[(1) - (1)].intval); }
     break;
 
-  case 180:
+  case 181:
 
 /* Line 1455 of yacc.c  */
-#line 745 "xi-grammar.y"
+#line 750 "xi-grammar.y"
     { (yyval.intval) = (yyvsp[(1) - (3)].intval) | (yyvsp[(3) - (3)].intval); }
     break;
 
-  case 181:
+  case 182:
 
 /* Line 1455 of yacc.c  */
-#line 749 "xi-grammar.y"
+#line 754 "xi-grammar.y"
     { (yyval.intval) = STHREADED; }
     break;
 
-  case 182:
+  case 183:
 
 /* Line 1455 of yacc.c  */
-#line 751 "xi-grammar.y"
+#line 756 "xi-grammar.y"
     { (yyval.intval) = SSYNC; }
     break;
 
-  case 183:
+  case 184:
 
 /* Line 1455 of yacc.c  */
-#line 753 "xi-grammar.y"
+#line 758 "xi-grammar.y"
     { (yyval.intval) = SIGET; }
     break;
 
-  case 184:
+  case 185:
 
 /* Line 1455 of yacc.c  */
-#line 755 "xi-grammar.y"
+#line 760 "xi-grammar.y"
     { (yyval.intval) = SLOCKED; }
     break;
 
-  case 185:
+  case 186:
 
 /* Line 1455 of yacc.c  */
-#line 757 "xi-grammar.y"
+#line 762 "xi-grammar.y"
     { (yyval.intval) = SCREATEHERE; }
     break;
 
-  case 186:
+  case 187:
 
 /* Line 1455 of yacc.c  */
-#line 759 "xi-grammar.y"
+#line 764 "xi-grammar.y"
     { (yyval.intval) = SCREATEHOME; }
     break;
 
-  case 187:
+  case 188:
 
 /* Line 1455 of yacc.c  */
-#line 761 "xi-grammar.y"
+#line 766 "xi-grammar.y"
     { (yyval.intval) = SNOKEEP; }
     break;
 
-  case 188:
+  case 189:
 
 /* Line 1455 of yacc.c  */
-#line 763 "xi-grammar.y"
+#line 768 "xi-grammar.y"
     { (yyval.intval) = SNOTRACE; }
     break;
 
-  case 189:
+  case 190:
 
 /* Line 1455 of yacc.c  */
-#line 765 "xi-grammar.y"
+#line 770 "xi-grammar.y"
     { (yyval.intval) = SIMMEDIATE; }
     break;
 
-  case 190:
+  case 191:
 
 /* Line 1455 of yacc.c  */
-#line 767 "xi-grammar.y"
+#line 772 "xi-grammar.y"
     { (yyval.intval) = SSKIPSCHED; }
     break;
 
-  case 191:
+  case 192:
 
 /* Line 1455 of yacc.c  */
-#line 769 "xi-grammar.y"
+#line 774 "xi-grammar.y"
     { (yyval.intval) = SINLINE; }
     break;
 
-  case 192:
+  case 193:
 
 /* Line 1455 of yacc.c  */
-#line 771 "xi-grammar.y"
+#line 776 "xi-grammar.y"
     { (yyval.intval) = SLOCAL; }
     break;
 
-  case 193:
+  case 194:
 
 /* Line 1455 of yacc.c  */
-#line 773 "xi-grammar.y"
+#line 778 "xi-grammar.y"
     { (yyval.intval) = SPYTHON; }
     break;
 
-  case 194:
+  case 195:
 
 /* Line 1455 of yacc.c  */
-#line 775 "xi-grammar.y"
+#line 780 "xi-grammar.y"
     { (yyval.intval) = SMEM; }
     break;
 
-  case 195:
+  case 196:
 
 /* Line 1455 of yacc.c  */
-#line 777 "xi-grammar.y"
+#line 782 "xi-grammar.y"
     { (yyval.intval) = SREDUCE; }
     break;
 
-  case 196:
+  case 197:
 
 /* Line 1455 of yacc.c  */
-#line 781 "xi-grammar.y"
+#line 786 "xi-grammar.y"
     { (yyval.val) = new Value((yyvsp[(1) - (1)].strval)); }
     break;
 
-  case 197:
+  case 198:
 
 /* Line 1455 of yacc.c  */
-#line 783 "xi-grammar.y"
+#line 788 "xi-grammar.y"
     { (yyval.val) = new Value((yyvsp[(1) - (1)].strval)); }
     break;
 
-  case 198:
+  case 199:
 
 /* Line 1455 of yacc.c  */
-#line 785 "xi-grammar.y"
+#line 790 "xi-grammar.y"
     { (yyval.val) = new Value((yyvsp[(1) - (1)].strval)); }
     break;
 
-  case 199:
+  case 200:
 
 /* Line 1455 of yacc.c  */
-#line 789 "xi-grammar.y"
+#line 794 "xi-grammar.y"
     { (yyval.strval) = ""; }
     break;
 
-  case 200:
+  case 201:
 
 /* Line 1455 of yacc.c  */
-#line 791 "xi-grammar.y"
+#line 796 "xi-grammar.y"
     { (yyval.strval) = (yyvsp[(1) - (1)].strval); }
     break;
 
-  case 201:
+  case 202:
 
 /* Line 1455 of yacc.c  */
-#line 793 "xi-grammar.y"
+#line 798 "xi-grammar.y"
     {  /*Returned only when in_bracket*/
                        char *tmp = new char[strlen((yyvsp[(1) - (3)].strval))+strlen((yyvsp[(3) - (3)].strval))+3];
                        sprintf(tmp,"%s, %s", (yyvsp[(1) - (3)].strval), (yyvsp[(3) - (3)].strval));
@@ -3585,24 +3604,24 @@ yyreduce:
                }
     break;
 
-  case 202:
+  case 203:
 
 /* Line 1455 of yacc.c  */
-#line 801 "xi-grammar.y"
+#line 806 "xi-grammar.y"
     { (yyval.strval) = ""; }
     break;
 
-  case 203:
+  case 204:
 
 /* Line 1455 of yacc.c  */
-#line 803 "xi-grammar.y"
+#line 808 "xi-grammar.y"
     { (yyval.strval) = (yyvsp[(1) - (1)].strval); }
     break;
 
-  case 204:
+  case 205:
 
 /* Line 1455 of yacc.c  */
-#line 805 "xi-grammar.y"
+#line 810 "xi-grammar.y"
     {  /*Returned only when in_bracket*/
                        char *tmp = new char[strlen((yyvsp[(1) - (5)].strval))+strlen((yyvsp[(3) - (5)].strval))+strlen((yyvsp[(5) - (5)].strval))+3];
                        sprintf(tmp,"%s[%s]%s", (yyvsp[(1) - (5)].strval), (yyvsp[(3) - (5)].strval), (yyvsp[(5) - (5)].strval));
@@ -3610,10 +3629,10 @@ yyreduce:
                }
     break;
 
-  case 205:
+  case 206:
 
 /* Line 1455 of yacc.c  */
-#line 811 "xi-grammar.y"
+#line 816 "xi-grammar.y"
     { /*Returned only when in_braces*/
                        char *tmp = new char[strlen((yyvsp[(1) - (5)].strval))+strlen((yyvsp[(3) - (5)].strval))+strlen((yyvsp[(5) - (5)].strval))+3];
                        sprintf(tmp,"%s{%s}%s", (yyvsp[(1) - (5)].strval), (yyvsp[(3) - (5)].strval), (yyvsp[(5) - (5)].strval));
@@ -3621,10 +3640,10 @@ yyreduce:
                }
     break;
 
-  case 206:
+  case 207:
 
 /* Line 1455 of yacc.c  */
-#line 817 "xi-grammar.y"
+#line 822 "xi-grammar.y"
     { /*Returned only when in_braces*/
                        char *tmp = new char[strlen((yyvsp[(1) - (5)].strval))+strlen((yyvsp[(3) - (5)].strval))+strlen((yyvsp[(5) - (5)].strval))+3];
                        sprintf(tmp,"%s(%s)%s", (yyvsp[(1) - (5)].strval), (yyvsp[(3) - (5)].strval), (yyvsp[(5) - (5)].strval));
@@ -3632,10 +3651,10 @@ yyreduce:
                }
     break;
 
-  case 207:
+  case 208:
 
 /* Line 1455 of yacc.c  */
-#line 823 "xi-grammar.y"
+#line 828 "xi-grammar.y"
     { /*Returned only when in_braces*/
                        char *tmp = new char[strlen((yyvsp[(2) - (4)].strval))+strlen((yyvsp[(4) - (4)].strval))+3];
                        sprintf(tmp,"(%s)%s", (yyvsp[(2) - (4)].strval), (yyvsp[(4) - (4)].strval));
@@ -3643,20 +3662,20 @@ yyreduce:
                }
     break;
 
-  case 208:
+  case 209:
 
 /* Line 1455 of yacc.c  */
-#line 831 "xi-grammar.y"
+#line 836 "xi-grammar.y"
     {  /*Start grabbing CPROGRAM segments*/
                        in_bracket=1;
                        (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (3)].type),(yyvsp[(2) - (3)].strval));
                }
     break;
 
-  case 209:
+  case 210:
 
 /* Line 1455 of yacc.c  */
-#line 838 "xi-grammar.y"
+#line 843 "xi-grammar.y"
     { 
                    /*Start grabbing CPROGRAM segments*/
                        in_braces=1;
@@ -3664,93 +3683,93 @@ yyreduce:
                }
     break;
 
-  case 210:
+  case 211:
 
 /* Line 1455 of yacc.c  */
-#line 846 "xi-grammar.y"
+#line 851 "xi-grammar.y"
     { 
                        in_braces=0;
                        (yyval.intval) = 0;
                }
     break;
 
-  case 211:
+  case 212:
 
 /* Line 1455 of yacc.c  */
-#line 853 "xi-grammar.y"
+#line 858 "xi-grammar.y"
     { (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (1)].type));}
     break;
 
-  case 212:
+  case 213:
 
 /* Line 1455 of yacc.c  */
-#line 855 "xi-grammar.y"
+#line 860 "xi-grammar.y"
     { (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (3)].type),(yyvsp[(2) - (3)].strval)); (yyval.pname)->setConditional((yyvsp[(3) - (3)].intval)); }
     break;
 
-  case 213:
+  case 214:
 
 /* Line 1455 of yacc.c  */
-#line 857 "xi-grammar.y"
+#line 862 "xi-grammar.y"
     { (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (4)].type),(yyvsp[(2) - (4)].strval),0,(yyvsp[(4) - (4)].val));}
     break;
 
-  case 214:
+  case 215:
 
 /* Line 1455 of yacc.c  */
-#line 859 "xi-grammar.y"
+#line 864 "xi-grammar.y"
     { /*Stop grabbing CPROGRAM segments*/
                        in_bracket=0;
                        (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (3)].pname)->getType(), (yyvsp[(1) - (3)].pname)->getName() ,(yyvsp[(2) - (3)].strval));
                }
     break;
 
-  case 215:
+  case 216:
 
 /* Line 1455 of yacc.c  */
-#line 865 "xi-grammar.y"
+#line 870 "xi-grammar.y"
     { (yyval.intval) = Parameter::ACCEL_BUFFER_TYPE_READONLY; }
     break;
 
-  case 216:
+  case 217:
 
 /* Line 1455 of yacc.c  */
-#line 866 "xi-grammar.y"
+#line 871 "xi-grammar.y"
     { (yyval.intval) = Parameter::ACCEL_BUFFER_TYPE_READWRITE; }
     break;
 
-  case 217:
+  case 218:
 
 /* Line 1455 of yacc.c  */
-#line 867 "xi-grammar.y"
+#line 872 "xi-grammar.y"
     { (yyval.intval) = Parameter::ACCEL_BUFFER_TYPE_WRITEONLY; }
     break;
 
-  case 218:
+  case 219:
 
 /* Line 1455 of yacc.c  */
-#line 870 "xi-grammar.y"
+#line 875 "xi-grammar.y"
     { (yyval.xstrptr) = new XStr((yyvsp[(1) - (1)].strval)); }
     break;
 
-  case 219:
+  case 220:
 
 /* Line 1455 of yacc.c  */
-#line 871 "xi-grammar.y"
+#line 876 "xi-grammar.y"
     { (yyval.xstrptr) = new XStr(""); *((yyval.xstrptr)) << *((yyvsp[(1) - (4)].xstrptr)) << "->" << (yyvsp[(4) - (4)].strval); }
     break;
 
-  case 220:
+  case 221:
 
 /* Line 1455 of yacc.c  */
-#line 872 "xi-grammar.y"
+#line 877 "xi-grammar.y"
     { (yyval.xstrptr) = new XStr(""); *((yyval.xstrptr)) << *((yyvsp[(1) - (3)].xstrptr)) << "." << (yyvsp[(3) - (3)].strval); }
     break;
 
-  case 221:
+  case 222:
 
 /* Line 1455 of yacc.c  */
-#line 874 "xi-grammar.y"
+#line 879 "xi-grammar.y"
     {
                   (yyval.xstrptr) = new XStr("");
                   *((yyval.xstrptr)) << *((yyvsp[(1) - (4)].xstrptr)) << "[" << *((yyvsp[(3) - (4)].xstrptr)) << "]";
@@ -3759,10 +3778,10 @@ yyreduce:
                 }
     break;
 
-  case 222:
+  case 223:
 
 /* Line 1455 of yacc.c  */
-#line 881 "xi-grammar.y"
+#line 886 "xi-grammar.y"
     {
                   (yyval.xstrptr) = new XStr("");
                   *((yyval.xstrptr)) << *((yyvsp[(1) - (4)].xstrptr)) << "[" << (yyvsp[(3) - (4)].strval) << "]";
@@ -3770,10 +3789,10 @@ yyreduce:
                 }
     break;
 
-  case 223:
+  case 224:
 
 /* Line 1455 of yacc.c  */
-#line 887 "xi-grammar.y"
+#line 892 "xi-grammar.y"
     {
                   (yyval.xstrptr) = new XStr("");
                   *((yyval.xstrptr)) << *((yyvsp[(1) - (4)].xstrptr)) << "(" << *((yyvsp[(3) - (4)].xstrptr)) << ")";
@@ -3782,20 +3801,20 @@ yyreduce:
                 }
     break;
 
-  case 224:
+  case 225:
 
 /* Line 1455 of yacc.c  */
-#line 896 "xi-grammar.y"
+#line 901 "xi-grammar.y"
     {
                   in_bracket = 0;
                   (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (3)].pname)->getType(), (yyvsp[(1) - (3)].pname)->getName(), (yyvsp[(2) - (3)].strval));
                 }
     break;
 
-  case 225:
+  case 226:
 
 /* Line 1455 of yacc.c  */
-#line 903 "xi-grammar.y"
+#line 908 "xi-grammar.y"
     {
                   (yyval.pname) = new Parameter(lineno, (yyvsp[(3) - (7)].type), (yyvsp[(4) - (7)].strval));
                   (yyval.pname)->setAccelInstName((yyvsp[(6) - (7)].xstrptr));
@@ -3803,10 +3822,10 @@ yyreduce:
                 }
     break;
 
-  case 226:
+  case 227:
 
 /* Line 1455 of yacc.c  */
-#line 909 "xi-grammar.y"
+#line 914 "xi-grammar.y"
     {
                  (yyval.pname) = new Parameter(lineno, (yyvsp[(1) - (5)].type), (yyvsp[(2) - (5)].strval));
                   (yyval.pname)->setAccelInstName((yyvsp[(4) - (5)].xstrptr));
@@ -3814,10 +3833,10 @@ yyreduce:
                }
     break;
 
-  case 227:
+  case 228:
 
 /* Line 1455 of yacc.c  */
-#line 915 "xi-grammar.y"
+#line 920 "xi-grammar.y"
     {
                   (yyval.pname) = (yyvsp[(3) - (6)].pname);
                   (yyval.pname)->setAccelInstName((yyvsp[(5) - (6)].xstrptr));
@@ -3825,180 +3844,180 @@ yyreduce:
                }
     break;
 
-  case 228:
+  case 229:
 
 /* Line 1455 of yacc.c  */
-#line 923 "xi-grammar.y"
+#line 928 "xi-grammar.y"
     { (yyval.plist) = new ParamList((yyvsp[(1) - (1)].pname)); }
     break;
 
-  case 229:
+  case 230:
 
 /* Line 1455 of yacc.c  */
-#line 925 "xi-grammar.y"
+#line 930 "xi-grammar.y"
     { (yyval.plist) = new ParamList((yyvsp[(1) - (3)].pname),(yyvsp[(3) - (3)].plist)); }
     break;
 
-  case 230:
+  case 231:
 
 /* Line 1455 of yacc.c  */
-#line 929 "xi-grammar.y"
+#line 934 "xi-grammar.y"
     { (yyval.plist) = new ParamList((yyvsp[(1) - (1)].pname)); }
     break;
 
-  case 231:
+  case 232:
 
 /* Line 1455 of yacc.c  */
-#line 931 "xi-grammar.y"
+#line 936 "xi-grammar.y"
     { (yyval.plist) = new ParamList((yyvsp[(1) - (3)].pname),(yyvsp[(3) - (3)].plist)); }
     break;
 
-  case 232:
+  case 233:
 
 /* Line 1455 of yacc.c  */
-#line 935 "xi-grammar.y"
+#line 940 "xi-grammar.y"
     { (yyval.plist) = (yyvsp[(2) - (3)].plist); }
     break;
 
-  case 233:
+  case 234:
 
 /* Line 1455 of yacc.c  */
-#line 937 "xi-grammar.y"
+#line 942 "xi-grammar.y"
     { (yyval.plist) = 0; }
     break;
 
-  case 234:
+  case 235:
 
 /* Line 1455 of yacc.c  */
-#line 941 "xi-grammar.y"
+#line 946 "xi-grammar.y"
     { (yyval.plist) = (yyvsp[(2) - (3)].plist); }
     break;
 
-  case 235:
+  case 236:
 
 /* Line 1455 of yacc.c  */
-#line 943 "xi-grammar.y"
+#line 948 "xi-grammar.y"
     { (yyval.plist) = 0; }
     break;
 
-  case 236:
+  case 237:
 
 /* Line 1455 of yacc.c  */
-#line 947 "xi-grammar.y"
+#line 952 "xi-grammar.y"
     { (yyval.val) = 0; }
     break;
 
-  case 237:
+  case 238:
 
 /* Line 1455 of yacc.c  */
-#line 949 "xi-grammar.y"
+#line 954 "xi-grammar.y"
     { (yyval.val) = new Value((yyvsp[(3) - (3)].strval)); }
     break;
 
-  case 238:
+  case 239:
 
 /* Line 1455 of yacc.c  */
-#line 953 "xi-grammar.y"
+#line 958 "xi-grammar.y"
     { (yyval.sc) = 0; }
     break;
 
-  case 239:
+  case 240:
 
 /* Line 1455 of yacc.c  */
-#line 955 "xi-grammar.y"
+#line 960 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SSDAGENTRY, (yyvsp[(1) - (1)].sc)); }
     break;
 
-  case 240:
+  case 241:
 
 /* Line 1455 of yacc.c  */
-#line 957 "xi-grammar.y"
+#line 962 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SSDAGENTRY, (yyvsp[(2) - (3)].sc)); }
     break;
 
-  case 241:
+  case 242:
 
 /* Line 1455 of yacc.c  */
-#line 961 "xi-grammar.y"
+#line 966 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SSLIST, (yyvsp[(1) - (1)].sc)); }
     break;
 
-  case 242:
+  case 243:
 
 /* Line 1455 of yacc.c  */
-#line 963 "xi-grammar.y"
+#line 968 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SSLIST, (yyvsp[(1) - (2)].sc), (yyvsp[(2) - (2)].sc));  }
     break;
 
-  case 243:
+  case 244:
 
 /* Line 1455 of yacc.c  */
-#line 967 "xi-grammar.y"
+#line 972 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SOLIST, (yyvsp[(1) - (1)].sc)); }
     break;
 
-  case 244:
+  case 245:
 
 /* Line 1455 of yacc.c  */
-#line 969 "xi-grammar.y"
+#line 974 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SOLIST, (yyvsp[(1) - (2)].sc), (yyvsp[(2) - (2)].sc)); }
     break;
 
-  case 245:
+  case 246:
 
 /* Line 1455 of yacc.c  */
-#line 973 "xi-grammar.y"
+#line 978 "xi-grammar.y"
     { (yyval.sc) = 0; }
     break;
 
-  case 246:
+  case 247:
 
 /* Line 1455 of yacc.c  */
-#line 975 "xi-grammar.y"
+#line 980 "xi-grammar.y"
     { (yyval.sc) = (yyvsp[(3) - (4)].sc); }
     break;
 
-  case 247:
+  case 248:
 
 /* Line 1455 of yacc.c  */
-#line 979 "xi-grammar.y"
+#line 984 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, (yyvsp[(1) - (1)].strval))); }
     break;
 
-  case 248:
+  case 249:
 
 /* Line 1455 of yacc.c  */
-#line 981 "xi-grammar.y"
+#line 986 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, (yyvsp[(1) - (3)].strval)), (yyvsp[(3) - (3)].sc));  }
     break;
 
-  case 249:
+  case 250:
 
 /* Line 1455 of yacc.c  */
-#line 985 "xi-grammar.y"
+#line 990 "xi-grammar.y"
     { (yyval.strval) = (yyvsp[(1) - (1)].strval); }
     break;
 
-  case 250:
+  case 251:
 
 /* Line 1455 of yacc.c  */
-#line 987 "xi-grammar.y"
+#line 992 "xi-grammar.y"
     { (yyval.strval) = 0; }
     break;
 
-  case 251:
+  case 252:
 
 /* Line 1455 of yacc.c  */
-#line 991 "xi-grammar.y"
+#line 996 "xi-grammar.y"
     {
                   (yyval.sc) = buildAtomic((yyvsp[(4) - (6)].strval), (yyvsp[(6) - (6)].sc), (yyvsp[(2) - (6)].strval));
                 }
     break;
 
-  case 252:
+  case 253:
 
 /* Line 1455 of yacc.c  */
-#line 995 "xi-grammar.y"
+#line 1000 "xi-grammar.y"
     {  
                   in_braces = 0;
                   if (((yyvsp[(4) - (8)].plist)->isVoid() == 0) && ((yyvsp[(4) - (8)].plist)->isMessage() == 0))
@@ -4014,161 +4033,161 @@ yyreduce:
                }
     break;
 
-  case 253:
+  case 254:
 
 /* Line 1455 of yacc.c  */
-#line 1009 "xi-grammar.y"
+#line 1014 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SWHEN, 0, 0, 0,0,0, 0,  (yyvsp[(2) - (4)].entrylist)); }
     break;
 
-  case 254:
+  case 255:
 
 /* Line 1455 of yacc.c  */
-#line 1011 "xi-grammar.y"
+#line 1016 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SWHEN, 0, 0, 0,0,0, (yyvsp[(3) - (3)].sc), (yyvsp[(2) - (3)].entrylist)); }
     break;
 
-  case 255:
+  case 256:
 
 /* Line 1455 of yacc.c  */
-#line 1013 "xi-grammar.y"
+#line 1018 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SWHEN, 0, 0, 0,0,0, (yyvsp[(4) - (5)].sc), (yyvsp[(2) - (5)].entrylist)); }
     break;
 
-  case 256:
+  case 257:
 
 /* Line 1455 of yacc.c  */
-#line 1015 "xi-grammar.y"
+#line 1020 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SOVERLAP,0, 0,0,0,0,(yyvsp[(3) - (4)].sc), 0); }
     break;
 
-  case 257:
+  case 258:
 
 /* Line 1455 of yacc.c  */
-#line 1017 "xi-grammar.y"
+#line 1022 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, (yyvsp[(3) - (11)].strval)), new SdagConstruct(SINT_EXPR, (yyvsp[(5) - (11)].strval)),
                             new SdagConstruct(SINT_EXPR, (yyvsp[(7) - (11)].strval)), 0, (yyvsp[(10) - (11)].sc), 0); }
     break;
 
-  case 258:
+  case 259:
 
 /* Line 1455 of yacc.c  */
-#line 1020 "xi-grammar.y"
+#line 1025 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, (yyvsp[(3) - (9)].strval)), new SdagConstruct(SINT_EXPR, (yyvsp[(5) - (9)].strval)), 
                         new SdagConstruct(SINT_EXPR, (yyvsp[(7) - (9)].strval)), 0, (yyvsp[(9) - (9)].sc), 0); }
     break;
 
-  case 259:
+  case 260:
 
 /* Line 1455 of yacc.c  */
-#line 1023 "xi-grammar.y"
+#line 1028 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, (yyvsp[(3) - (12)].strval)), new SdagConstruct(SINT_EXPR, (yyvsp[(6) - (12)].strval)), 
                             new SdagConstruct(SINT_EXPR, (yyvsp[(8) - (12)].strval)), new SdagConstruct(SINT_EXPR, (yyvsp[(10) - (12)].strval)), (yyvsp[(12) - (12)].sc), 0); }
     break;
 
-  case 260:
+  case 261:
 
 /* Line 1455 of yacc.c  */
-#line 1026 "xi-grammar.y"
+#line 1031 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, (yyvsp[(3) - (14)].strval)), new SdagConstruct(SINT_EXPR, (yyvsp[(6) - (14)].strval)), 
                                 new SdagConstruct(SINT_EXPR, (yyvsp[(8) - (14)].strval)), new SdagConstruct(SINT_EXPR, (yyvsp[(10) - (14)].strval)), (yyvsp[(13) - (14)].sc), 0); }
     break;
 
-  case 261:
+  case 262:
 
 /* Line 1455 of yacc.c  */
-#line 1029 "xi-grammar.y"
+#line 1034 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, (yyvsp[(3) - (6)].strval)), (yyvsp[(6) - (6)].sc),0,0,(yyvsp[(5) - (6)].sc),0); }
     break;
 
-  case 262:
+  case 263:
 
 /* Line 1455 of yacc.c  */
-#line 1031 "xi-grammar.y"
+#line 1036 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, (yyvsp[(3) - (8)].strval)), (yyvsp[(8) - (8)].sc),0,0,(yyvsp[(6) - (8)].sc),0); }
     break;
 
-  case 263:
+  case 264:
 
 /* Line 1455 of yacc.c  */
-#line 1033 "xi-grammar.y"
+#line 1038 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, (yyvsp[(3) - (5)].strval)), 0,0,0,(yyvsp[(5) - (5)].sc),0); }
     break;
 
-  case 264:
+  case 265:
 
 /* Line 1455 of yacc.c  */
-#line 1035 "xi-grammar.y"
+#line 1040 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SWHILE, 0, new SdagConstruct(SINT_EXPR, (yyvsp[(3) - (7)].strval)), 0,0,0,(yyvsp[(6) - (7)].sc),0); }
     break;
 
-  case 265:
+  case 266:
 
 /* Line 1455 of yacc.c  */
-#line 1037 "xi-grammar.y"
+#line 1042 "xi-grammar.y"
     { (yyval.sc) = (yyvsp[(2) - (3)].sc); }
     break;
 
-  case 266:
+  case 267:
 
 /* Line 1455 of yacc.c  */
-#line 1039 "xi-grammar.y"
+#line 1044 "xi-grammar.y"
     { (yyval.sc) = buildAtomic((yyvsp[(2) - (3)].strval), NULL, NULL); }
     break;
 
-  case 267:
+  case 268:
 
 /* Line 1455 of yacc.c  */
-#line 1042 "xi-grammar.y"
+#line 1047 "xi-grammar.y"
     { (yyval.sc) = 0; }
     break;
 
-  case 268:
+  case 269:
 
 /* Line 1455 of yacc.c  */
-#line 1044 "xi-grammar.y"
+#line 1049 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SELSE, 0,0,0,0,0, (yyvsp[(2) - (2)].sc),0); }
     break;
 
-  case 269:
+  case 270:
 
 /* Line 1455 of yacc.c  */
-#line 1046 "xi-grammar.y"
+#line 1051 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SELSE, 0,0,0,0,0, (yyvsp[(3) - (4)].sc),0); }
     break;
 
-  case 270:
+  case 271:
 
 /* Line 1455 of yacc.c  */
-#line 1049 "xi-grammar.y"
+#line 1054 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, (yyvsp[(1) - (1)].strval))); }
     break;
 
-  case 271:
+  case 272:
 
 /* Line 1455 of yacc.c  */
-#line 1051 "xi-grammar.y"
+#line 1056 "xi-grammar.y"
     { (yyval.sc) = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, (yyvsp[(1) - (3)].strval)), (yyvsp[(3) - (3)].sc));  }
     break;
 
-  case 272:
+  case 273:
 
 /* Line 1455 of yacc.c  */
-#line 1055 "xi-grammar.y"
+#line 1060 "xi-grammar.y"
     { in_int_expr = 0; (yyval.intval) = 0; }
     break;
 
-  case 273:
+  case 274:
 
 /* Line 1455 of yacc.c  */
-#line 1059 "xi-grammar.y"
+#line 1064 "xi-grammar.y"
     { in_int_expr = 1; (yyval.intval) = 0; }
     break;
 
-  case 274:
+  case 275:
 
 /* Line 1455 of yacc.c  */
-#line 1063 "xi-grammar.y"
+#line 1068 "xi-grammar.y"
     { 
                  if ((yyvsp[(2) - (2)].plist) != 0)
                     (yyval.entry) = new Entry(lineno, 0, 0, (yyvsp[(1) - (2)].strval), (yyvsp[(2) - (2)].plist), 0, 0, 0, 0); 
@@ -4178,10 +4197,10 @@ yyreduce:
                }
     break;
 
-  case 275:
+  case 276:
 
 /* Line 1455 of yacc.c  */
-#line 1071 "xi-grammar.y"
+#line 1076 "xi-grammar.y"
     { if ((yyvsp[(5) - (5)].plist) != 0)
                    (yyval.entry) = new Entry(lineno, 0, 0, (yyvsp[(1) - (5)].strval), (yyvsp[(5) - (5)].plist), 0, 0, (yyvsp[(3) - (5)].strval), 0); 
                  else
@@ -4189,52 +4208,52 @@ yyreduce:
                }
     break;
 
-  case 276:
+  case 277:
 
 /* Line 1455 of yacc.c  */
-#line 1079 "xi-grammar.y"
+#line 1084 "xi-grammar.y"
     { (yyval.entrylist) = new EntryList((yyvsp[(1) - (1)].entry)); }
     break;
 
-  case 277:
+  case 278:
 
 /* Line 1455 of yacc.c  */
-#line 1081 "xi-grammar.y"
+#line 1086 "xi-grammar.y"
     { (yyval.entrylist) = new EntryList((yyvsp[(1) - (3)].entry),(yyvsp[(3) - (3)].entrylist)); }
     break;
 
-  case 278:
+  case 279:
 
 /* Line 1455 of yacc.c  */
-#line 1085 "xi-grammar.y"
+#line 1090 "xi-grammar.y"
     { in_bracket=1; }
     break;
 
-  case 279:
+  case 280:
 
 /* Line 1455 of yacc.c  */
-#line 1088 "xi-grammar.y"
+#line 1093 "xi-grammar.y"
     { in_bracket=0; }
     break;
 
-  case 280:
+  case 281:
 
 /* Line 1455 of yacc.c  */
-#line 1092 "xi-grammar.y"
+#line 1097 "xi-grammar.y"
     { if (!macroDefined((yyvsp[(2) - (2)].strval), 1)) in_comment = 1; }
     break;
 
-  case 281:
+  case 282:
 
 /* Line 1455 of yacc.c  */
-#line 1096 "xi-grammar.y"
+#line 1101 "xi-grammar.y"
     { if (!macroDefined((yyvsp[(2) - (2)].strval), 0)) in_comment = 1; }
     break;
 
 
 
 /* Line 1455 of yacc.c  */
-#line 4238 "y.tab.c"
+#line 4257 "y.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -4446,7 +4465,7 @@ yyreturn:
 
 
 /* Line 1675 of yacc.c  */
-#line 1099 "xi-grammar.y"
+#line 1104 "xi-grammar.y"
 
 void yyerror(const char *mesg)
 {
index 9a0dd4b29e9a954680084b30a81d547c27d5c9f9..411ca8c54cad7e3b56c26a075e47f7862dcd8c97 100644 (file)
@@ -672,6 +672,11 @@ IncludeFile    : LITERAL
 
 Member         : Entry ';'
                { $$ = $1; }
+                | TemplateSpec Entry ';'
+                {
+                  $2->tspec = $1;
+                  $$ = $2;
+                }
                | NonEntryMember
                { $$ = $1; }
                ;
index 391caef8ed9966db69d91d3a820d3acf84d0d462..c4aff5dd6ede209a2d2dd311356f994031132a27 100644 (file)
@@ -1851,6 +1851,8 @@ Chare::genDefs(XStr& str)
     if(!external) str << "=0";
     str << ";\n";
   }
+  templateGuardEnd(str);
+
   if(list)
   {//Add definitions for all entry points
     list->genDefs(str);
@@ -1865,6 +1867,8 @@ Chare::genDefs(XStr& str)
       forElement=forIndividual;
     }
   }
+
+  templateGuardBegin(isTemplated(), str);
   // define the python routines
   if (isPython()) {
     str << "/* ---------------- python wrapper -------------- */\n";
@@ -2212,14 +2216,23 @@ Template::genVars(XStr& str)
   str << " > ";
 }
 
+XStr generateTemplateSpec(TVarList* tspec)
+{
+  XStr str;
+
+  if(tspec) {
+    str << "template < ";
+    tspec->genLong(str);
+    str << " > ";
+  }
+
+  return str;
+}
+
 void
 Template::genSpec(XStr& str)
 {
-  str << "template ";
-  str << "< ";
-  if(tspec)
-    tspec->genLong(str);
-  str << " >\n";
+  str << generateTemplateSpec(tspec);
 }
 
 void
@@ -3033,9 +3046,19 @@ XStr Entry::epStr(void)
 XStr Entry::epIdx(int fromProxy)
 {
   XStr str;
-  if (fromProxy)
+  if (fromProxy) {
     str << indexName()<<"::";
-  str << "idx_"<<epStr()<<"()";
+    // If the chare is also templated, then we must avoid a parsing ambiguity
+    if (tspec)
+      str << "template ";
+  }
+  str << "idx_" << epStr();
+  if (tspec) {
+    str << "< ";
+    tspec->genShort(str);
+    str << " >";
+  }
+  str << "()";
   return str;
 }
 
@@ -3044,7 +3067,13 @@ XStr Entry::epRegFn(int fromProxy)
   XStr str;
   if (fromProxy)
     str << indexName() << "::";
-  str << "reg_"<<epStr()<<"()";
+  str << "reg_" << epStr();
+  if (tspec) {
+    str << "< ";
+    tspec->genShort(str);
+    str << " >";
+  }
+  str << "()";
   return str;
 }
 
@@ -3061,12 +3090,13 @@ XStr Entry::chareIdx(int fromProxy)
 // this Member's container with the given return type, e.g.
 // template<int N,class foo> void CProxy_bar<N,foo>
 // Works with non-templated Chares as well.
-XStr Member::makeDecl(const XStr &returnType,int forProxy)
+XStr Member::makeDecl(const XStr &returnType, int forProxy)
 {
   XStr str;
 
   if (container->isTemplated())
-    str << container->tspec() << " ";
+    str << container->tspec() << "\n";
+  str << generateTemplateSpec(tspec) << "\n";
   str << returnType<<" ";
   if (forProxy)
        str<<container->proxyName();
@@ -3092,7 +3122,8 @@ void Entry::genChareDecl(XStr& str)
     genChareStaticConstructorDecl(str);
   } else {
     // entry method declaration
-    str << "    "<<retType<<" "<<name<<"("<<paramType(1,1)<<");\n";
+    str << "    " << generateTemplateSpec(tspec) << "\n"
+        << "    " << retType << " " << name << "(" << paramType(1,1) << ");\n";
   }
 }
 
@@ -3169,9 +3200,11 @@ void Entry::genChareStaticConstructorDefs(XStr& str)
 void Entry::genArrayDecl(XStr& str)
 {
   if(isConstructor()) {
+    str << "    " << generateTemplateSpec(tspec) << "\n";
     genArrayStaticConstructorDecl(str);
   } else {
     if ((isSync() || isLocal()) && !container->isForElement()) return; //No sync broadcast
+    str << "    " << generateTemplateSpec(tspec) << "\n";
     if(isIget())
       str << "    "<<"CkFutureID"<<" "<<name<<"("<<paramType(1,1)<<") ;\n"; //no const
     else if(isLocal())
@@ -3353,16 +3386,20 @@ void Entry::genGroupDecl(XStr& str)
   }
 
   if(isConstructor()) {
+    str << "    " << generateTemplateSpec(tspec) << "\n";
     genGroupStaticConstructorDecl(str);
   } else {
     if ((isSync() || isLocal()) && !container->isForElement()) return; //No sync broadcast
+    str << "    " << generateTemplateSpec(tspec) << "\n";
     if (isLocal())
       str << "    "<<retType<<" "<<name<<"("<<paramType(1,1,0)<<");\n";
     else
       str << "    "<<retType<<" "<<name<<"("<<paramType(1,1)<<");\n";
     // entry method on multiple PEs declaration
     if(!container->isForElement() && !container->isForSection() && !isSync() && !isLocal() && !container->isNodeGroup()) {
+      str << "    " << generateTemplateSpec(tspec) << "\n";
       str << "    "<<retType<<" "<<name<<"("<<paramComma(1,0)<<"int npes, int *pes"<<eo(1)<<");\n";
+      str << "    " << generateTemplateSpec(tspec) << "\n";
       str << "    "<<retType<<" "<<name<<"("<<paramComma(1,0)<<"CmiGroup &grp"<<eo(1)<<");\n";
     }
   }
@@ -4205,13 +4242,18 @@ void Entry::genAccels_ppe_c_regFuncs(XStr& str) {
 /******************* Shared Entry Point Code **************************/
 void Entry::genIndexDecls(XStr& str)
 {
-  str << "/* DECLS: "; print(str); str << " */";
+  str << "    /* DECLS: "; print(str); str << "     */";
+
+  XStr templateSpecLine;
+  templateSpecLine << "\n    " << generateTemplateSpec(tspec);
 
   // Entry point index storage
   str << "\n    // Entry point registration at startup"
-      << "\n    static int "<<epRegFn(0)<<";" ///< @note: Should this be generated as private?
+      << templateSpecLine
+      << "\n    static int reg_" << epStr() << "();" ///< @note: Should this be generated as private?
       << "\n    // Entry point index lookup"
-      << "\n    inline static int "<<epIdx(0)<<"{"
+      << templateSpecLine
+      << "\n    inline static int idx_" << epStr() << "() {"
       << "\n      static int epidx = " << epRegFn(0) << ";"
       << "\n      return epidx;"
       << "\n    }\n";
@@ -4224,10 +4266,11 @@ void Entry::genIndexDecls(XStr& str)
   #endif
 
   // Index function, so user can find the entry point number
-  str << "    static int ";
+  str << templateSpecLine
+      << "\n    static int ";
   if (isConstructor()) str <<"ckNew";
   else str <<name;
-  str << "("<<paramType(1,0)<<") { return "<<epIdx(0)<<"; }\n";
+  str << "("<<paramType(1,0)<<") { return "<<epIdx(0)<<"; }";
 
   // DMK - Accel Support
   if (isAccel()) {
@@ -4252,17 +4295,20 @@ void Entry::genIndexDecls(XStr& str)
   }
 
   // call function declaration
-  str << "    static void _call_"<<epStr()<<"(void* impl_msg,"<<
-    container->baseName()<<"* impl_obj);\n";
+  str << templateSpecLine
+      << "\n    static void _call_" << epStr() << "(void* impl_msg, void* impl_obj);";
   if(isThreaded()) {
-    str << "    static void _callthr_"<<epStr()<<"(CkThrCallArg *);\n";
+    str  << templateSpecLine
+         << "\n    static void _callthr_"<<epStr()<<"(CkThrCallArg *);";
   }
   if (hasCallMarshall) {
-    str << "    static int _callmarshall_"<<epStr()<<"(char* impl_buf,"<<
-      container->baseName()<<"* impl_obj);\n";
+    str << templateSpecLine
+        << "\n    static int _callmarshall_" << epStr() << "(char* impl_buf,"
+        << container->baseName() << "* impl_obj);";
   }
   if (param->isMarshalled()) {
-    str << "    static void _marshallmessagepup_"<<epStr()<<"(PUP::er &p,void *msg);\n";
+    str << templateSpecLine
+        << "\n    static void _marshallmessagepup_"<<epStr()<<"(PUP::er &p,void *msg);";
   }
 }
 
@@ -4514,7 +4560,12 @@ void Entry::genCall(XStr& str, const XStr &preCall, bool redn_wrapper)
     if(isConstructor()) {//Constructor: call "new (obj) foo(parameters)"
        str << "  new (impl_obj) "<<container->baseName();
     } else {//Regular entry method: call "obj->bar(parameters)"
-       str << "  impl_obj->"<<name;
+      str << "  impl_obj->" << (tspec ? "template " : "") << name;
+      if (tspec) {
+        str << "< ";
+        tspec->genShort(str);
+        str << " >";
+      }
     }
 
     if (isArgcArgv) { //Extract parameters from CkArgMsg (should be parameter marshalled)
@@ -4534,6 +4585,7 @@ void Entry::genDefs(XStr& str)
   XStr containerType=container->baseName();
   XStr preMarshall,preCall,postCall;
 
+  templateGuardBegin(tspec || container->isTemplated(), str);
   str << "/* DEFS: "; print(str); str << " */\n";
 
   if (attribs&SMIGRATE)
@@ -4560,11 +4612,14 @@ void Entry::genDefs(XStr& str)
 
 
   //Prevents repeated call and __idx definitions:
-  if (container->getForWhom()!=forAll) return;
+  if (container->getForWhom()!=forAll) {
+    templateGuardEnd(str);
+    return;
+  }
 
   // Define the entry point registration functions
   str << "\n// Entry point registration function"
-      << "\n" << makeDecl("int") << "::" << epRegFn(0) << " {"
+      << "\n" << makeDecl("int") << "::reg_" << epStr() << "() {"
       << "\n  return " << genRegEp() << ";"
       << "\n}\n\n";
 
@@ -4665,8 +4720,10 @@ void Entry::genDefs(XStr& str)
   }
 
   //Generate the call-method body
-  str << makeDecl("void")<<"::_call_"<<epStr()<<"(void* impl_msg,"<<containerType<<" * impl_obj)\n";
-  str << "{\n";
+  str << makeDecl("void")<<"::_call_"<<epStr()<<"(void* impl_msg, void* impl_obj_void)\n";
+  str << "{\n"
+      << "  " << container->baseName() << "* impl_obj = static_cast<"
+      << container->baseName() << " *>(impl_obj_void);\n";
   if (!isLocal()) {
     if(isThreaded()) str << callThread(epStr());
     str << preMarshall;
@@ -4719,13 +4776,20 @@ void Entry::genDefs(XStr& str)
      }
      str << "}\n";
   }
+  templateGuardEnd(str);
 }
 
 XStr Entry::genRegEp()
 {
   XStr str;
   str << "CkRegisterEp(\"" << name << "("<<paramType(0)<<")\",\n"
-      << "      (CkCallFnPtr)_call_" << epStr() << ", ";
+      << "      _call_" << epStr();
+  if (tspec) {
+    str << "< ";
+    tspec->genShort(str);
+    str << " >";
+  }
+  str << ", ";
   /* messageIdx: */
   if (param->isMarshalled()) {
     if (param->hasConditional())  str<<"MarshallMsg_"<<epStr()<<"::__idx";
@@ -4754,6 +4818,9 @@ XStr Entry::genRegEp()
 
 void Entry::genReg(XStr& str)
 {
+  if (tspec)
+    return;
+
   str << "  // REG: "<<*this;
   str << "  " << epIdx(0) << ";\n";
   if (isReductionTarget())
index 82b40037c15215407a50f3f7ae3525a40c66b07b..e84cdb97a110e9823dd9ddb5f811019b8cf39bb0 100644 (file)
@@ -630,6 +630,8 @@ class Member : public Construct {
   protected:
     Chare *container;
   public:
+    TVarList *tspec;
+    Member() : container(0), tspec(0) { }
     inline Chare *getContainer() const { return container; }
     virtual void setChare(Chare *c) { container = c; }
     virtual int isSdag(void) { return 0; }