new interface for python. for this, the .ci parser has been improved to accept
authorFilippo Gioachin <gioachin@illinois.edu>
Fri, 24 Sep 2004 22:13:46 +0000 (22:13 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Fri, 24 Sep 2004 22:13:46 +0000 (22:13 +0000)
a new parameter named [python], and generate all the support classes needed by
python interface.
still, the python interface is not built by default

12 files changed:
src/libs/ck-libs/pythonCCS/Makefile
src/libs/ck-libs/pythonCCS/PythonCCS.C
src/libs/ck-libs/pythonCCS/PythonCCS.ci
src/libs/ck-libs/pythonCCS/PythonCCS.h
src/scripts/Makefile
src/xlat-i/xi-grammar.tab.C
src/xlat-i/xi-grammar.tab.h
src/xlat-i/xi-grammar.y
src/xlat-i/xi-scan.C
src/xlat-i/xi-scan.l
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index a5e24852e61def3d13779a961df15ecb655f8613..622b91e6751ced039248c48e0a6ed8498ea77f9c 100644 (file)
@@ -8,11 +8,11 @@ DEST=$(CDIR)/lib/libmodulePythonCCS.a
 
 all: $(DEST)
 
-$(DEST): $(OBJS) $(COMPAT) headers
+$(DEST): $(OBJS) $(COMPAT)
        $(CHARMC) $(OBJS) $(COMPAT) -o $@
 
 headers: $(HEADERS)
-       cp $(HEADERS) $(CDIR)/include/
+       ln -s $(HEADERS) $(CDIR)/include/
        touch headers
 
 PythonCCS.o: PythonCCS.C $(HEADDEP)
index a5db6e6ba54d3dd6ee9a62577af5d1499fa83108..db30c30fcb202ab1e5d505576b0b5a50ab869cef 100644 (file)
@@ -1,16 +1,10 @@
 #include "PythonCCS.h"
 
-//CProxy_PythonGroup python;
-
-PythonMain::PythonMain (CkArgMsg *msg) {
-  //CProxy_PythonGroup python = CProxy_PythonGroup::ckNew();
-
-  //CcsRegisterHandler("pyCode", CkCallback(CkIndex_PythonGroup::execute(0),python));
-}
-
-CsvStaticDeclare(CmiNodeLock, pyLock);
-CsvStaticDeclare(PythonTable *, pyWorkers);
-CsvStaticDeclare(int, pyNumber);
+CsvDeclare(CmiNodeLock, pyLock);
+CsvDeclare(PythonTable *, pyWorkers);
+CsvDeclare(PythonThread *, pyThread);
+CsvDeclare(int, pyNumber);
+CtvDeclare(PyObject *, pythonReturnValue);
 
 // One-time per-processor setup routine
 // main interface for python to access common charm methods
@@ -32,16 +26,18 @@ static PyObject *CkPy_numpes(PyObject *self, PyObject *args) {
   return Py_BuildValue("i", CkNumPes());
 }
 
+/*
 static PyObject *CkPy_myindex(PyObject *self, PyObject *args) {
   if (!PyArg_ParseTuple(args, ":myindex")) return NULL;
   int pyNumber = PyInt_AsLong(PyDict_GetItemString(PyModule_GetDict(PyImport_AddModule("__main__")),"charmNumber"));
   CmiLock(CsvAccess(pyLock));
-  PythonArray1D *pyArray = dynamic_cast<PythonArray1D*>((*CsvAccess(pyWorkers))[pyNumber]);
+  ArrayElement1D *pyArray = dynamic_cast<ArrayElement1D>((*CsvAccess(pyWorkers))[pyNumber]);
   CmiUnlock(CsvAccess(pyLock));
   if (pyArray) return Py_BuildValue("i", pyArray->thisIndex);
   else { Py_INCREF(Py_None);return Py_None;}
   //return Py_BuildValue("i", (*CsvAccess(pyWorkers))[0]->thisIndex);
 }
+*/
 
 // method to read a variable and convert it to a python object
 static PyObject *CkPy_read(PyObject *self, PyObject *args) {
@@ -65,61 +61,104 @@ static PyObject *CkPy_write(PyObject *self, PyObject *args) {
   Py_INCREF(Py_None);return Py_None;
 }
 
-static PyMethodDef CkPy_MethodsDefault[] = {
+PyMethodDef PythonObject::CkPy_MethodsCustom[] = {
+  {NULL,      NULL}        /* Sentinel */
+};
+
+PyMethodDef CkPy_MethodsDefault[] = {
   {"printstr", CkPy_printstr , METH_VARARGS},
   {"mype", CkPy_mype, METH_VARARGS},
   {"numpes", CkPy_numpes, METH_VARARGS},
-  {"myindex", CkPy_myindex, METH_VARARGS},
   {"read", CkPy_read, METH_VARARGS},
   {"write", CkPy_write, METH_VARARGS},
   {NULL,      NULL}        /* Sentinel */
 };
 
 void PythonObject::execute (CkCcsRequestMsg *msg) {
-  char pyString[25];
 
   // update the reference number, used to access the current chare
   CmiLock(CsvAccess(pyLock));
   int pyReference = CsvAccess(pyNumber)++;
   CsvAccess(pyNumber) &= ~(1<<31);
   (*CsvAccess(pyWorkers))[pyReference] = this;
-  //printf("map number:%d\n",CsvAccess(pyWorkers)->size());
   CmiUnlock(CsvAccess(pyLock));
-  sprintf(pyString, "charmNumber=%d", pyReference);
 
   // create the new interpreter
   PyEval_AcquireLock();
   PyThreadState *pts = Py_NewInterpreter();
+
   Py_InitModule("ck", CkPy_MethodsDefault);
+  Py_InitModule("charm", getMethods());
 
   // insert into the dictionary a variable with the reference number
   PyObject *mod = PyImport_AddModule("__main__");
   PyObject *dict = PyModule_GetDict(mod);
-  PyRun_String(pyString,Py_file_input,dict,dict);
+
+  PyDict_SetItemString(dict,"charmNumber",PyInt_FromLong(pyReference));
+  PyRun_String("import ck",Py_file_input,dict,dict);
+  PyRun_String("import charm",Py_file_input,dict,dict);
 
   // run the program
-  PyRun_SimpleString((char *)msg->data);
+  //PythonArray1D *pyArray = dynamic_cast<PythonArray1D*>(this);
+  CthResume(CthCreate((CthVoidFn)_callthr_executeThread, new CkThrCallArg(msg,this), 0));
+  //CkIndex_PythonArray1D::_call_executeThread_CkCcsRequestMsg(msg,pyArray);
+  //getMyHandle()[pyArray->thisIndex].executeThread(msg);
+  //getMyHandle().executeThread(msg);
+  //PyRun_SimpleString((char *)msg->data);
 
   // distroy map element in pyWorkers and terminate interpreter
+  /*
   Py_EndInterpreter(pts);
   PyEval_ReleaseLock();
+
+  CmiLock(CsvAccess(pyLock));
+  CsvAccess(pyWorkers)->erase(pyReference);
+  CsvAccess(pyThread)->erase(pyReference);
+  CmiUnlock(CsvAccess(pyLock));
+  delete msg;
+  */
+}
+
+void PythonObject::_callthr_executeThread(CkThrCallArg *impl_arg) {
+  void *impl_msg = impl_arg->msg;
+  PythonObject *impl_obj = (PythonObject *) impl_arg->obj;
+  delete impl_arg;
+  impl_obj->executeThread((CkCcsRequestMsg*)impl_msg);
+}
+
+void PythonObject::executeThread(CkCcsRequestMsg *msg) {
+  // get the information about the running python thread and my reference number
+  PyThreadState *mine = PyThreadState_Get();
+  int pyReference = PyInt_AsLong(PyDict_GetItemString(PyModule_GetDict(PyImport_AddModule("__main__")),"charmNumber"));
+
+  // store the self thread for future suspention
+  CmiLock(CsvAccess(pyLock));
+  ((*CsvAccess(pyThread))[pyReference]).thread=CthSelf();
+  CmiUnlock(CsvAccess(pyLock));
+
+  PyRun_SimpleString((char *)msg->data);
+
+  Py_EndInterpreter(mine);
+  PyEval_ReleaseLock();
+
   CmiLock(CsvAccess(pyLock));
   CsvAccess(pyWorkers)->erase(pyReference);
+  CsvAccess(pyThread)->erase(pyReference);
   CmiUnlock(CsvAccess(pyLock));
   delete msg;
+  // since this function should always be executed in a different thread,
+  // when it is done, destroy the current thread
+  CthFree(CthSelf());
 }
 
 void PythonObject::iterate (CkCcsRequestMsg *msg) {
-  char pyString[25];
 
   // update the reference number, used to access the current chare
   CmiLock(CsvAccess(pyLock));
   int pyReference = CsvAccess(pyNumber)++;
   CsvAccess(pyNumber) &= ~(1<<31);
   (*CsvAccess(pyWorkers))[pyReference] = this;
-  //printf("map number:%d\n",CsvAccess(pyWorkers)->size());
   CmiUnlock(CsvAccess(pyLock));
-  sprintf(pyString, "charmNumber=%d", pyReference);
 
   // create the new interpreter
   PyEval_AcquireLock();
@@ -129,7 +168,8 @@ void PythonObject::iterate (CkCcsRequestMsg *msg) {
   // insert into the dictionary a variable with the reference number
   PyObject *mod = PyImport_AddModule("__main__");
   PyObject *dict = PyModule_GetDict(mod);
-  PyRun_String(pyString,Py_file_input,dict,dict);
+
+  PyDict_SetItemString(dict,"charmNumber",PyInt_FromLong(pyReference));
 
   // compile the program
   char *userCode = (char *)msg->data;
@@ -201,12 +241,14 @@ static void initializePythonDefault(void) {
   CsvAccess(pyNumber) = 0;
   CsvInitialize(PythonTable *,pyWorkers);
   CsvAccess(pyWorkers) = new PythonTable();
+  CsvInitialize(PythonThread *,pyThread);
+  CsvAccess(pyThread) = new PythonThread();
   CsvInitialize(CmiNodeLock, pyLock);
   CsvAccess(pyLock) = CmiCreateLock();
+  CtvInitialize(PyObject *,pythonReturnValue);
 
   Py_Initialize();
   PyEval_InitThreads();
-  PyObject *ck = Py_InitModule("ck", CkPy_MethodsDefault);
 
   PyEval_ReleaseLock();
 }
@@ -303,4 +345,42 @@ void PythonObject::pythonGetComplex(PyObject *arg, char *descr, double *real, do
   Py_DECREF(tmp);
 }
 
+PyObject *PythonObject::pythonGetArg(int handle) {
+  CmiLock(CsvAccess(pyLock));
+  PyObject *result = ((*CsvAccess(pyThread))[handle]).arg;
+  CmiUnlock(CsvAccess(pyLock));
+  return result;
+}
+
+void PythonObject::pythonPrepareReturn(int handle) {
+  pythonAwake(handle);
+}
+
+void PythonObject::pythonReturn(int handle) {
+  CmiLock(CsvAccess(pyLock));
+  CthThread handleThread = ((*CsvAccess(pyThread))[handle]).thread;
+  CmiUnlock(CsvAccess(pyLock));
+  CthAwaken(handleThread);
+}
+
+void PythonObject::pythonReturn(int handle, PyObject* data) {
+  CmiLock(CsvAccess(pyLock));
+  CthThread handleThread = ((*CsvAccess(pyThread))[handle]).thread;
+  *((*CsvAccess(pyThread))[handle]).result = data;
+  CmiUnlock(CsvAccess(pyLock));
+  CthAwaken(handleThread);
+}
+
+void PythonObject::pythonAwake(int handle) {
+  CmiLock(CsvAccess(pyLock));
+  PyThreadState *handleThread = ((*CsvAccess(pyThread))[handle]).pythread;
+  CmiUnlock(CsvAccess(pyLock));
+  PyEval_AcquireLock();
+  PyThreadState_Swap(handleThread);
+}
+
+void PythonObject::pythonSleep(int handle) {
+  PyEval_ReleaseLock();
+}
+
 #include "PythonCCS.def.h"
index a76495a21a2a157faa612e95c69daa9af9cf8cc2..75151e6e5fb833280ccb4f9981a237c342642151 100644 (file)
@@ -1,7 +1,7 @@
 module PythonCCS {
 
        //readonly CProxy_PythonGroup python;
-
+/*
        mainchare PythonMain {
                entry PythonMain(CkArgMsg *msg);
        }
@@ -41,6 +41,6 @@ module PythonCCS {
                entry void execute (CkCcsRequestMsg *msg);
                entry void iterate (CkCcsRequestMsg *msg);
        }
-
+*/
        initnode void initializePythonDefault(void);
 }
index ed75f024091ae6b27c882df66e79cc2289da39d2..4c22b06d2bc95af13dc1b0fbe0271d0e9f2467e9 100644 (file)
@@ -1,6 +1,9 @@
 // README: in order for this library to work, there should be a link
 // from /usr/include/python to the current python include version
 
+#ifndef __CKPYTHON_H
+#define __CKPYTHON_H
+
 #include "ckcallback-ccs.h"
 #include "python/Python.h"
 #include "python/compile.h"
 #include "string"
 #include "map"
 
-class PythonMain : public Chare {
- public:
-  PythonMain(CkArgMsg *msg);
-};
+#define PYTHON_ENABLE_HIGH  private: \
+  static PyMethodDef CkPy_MethodsCustom[]; \
+ public: \
+  PyMethodDef *getMethods() {return CkPy_MethodsCustom;}
+
+typedef struct {
+  PyObject *arg;
+  PyObject **result;
+  CthThread thread;
+  PyThreadState *pythread;
+} PythonHigh;
+typedef std::map<int,PythonHigh> PythonThread;
+
+extern PyMethodDef CkPy_MethodsDefault[];
 
 class PythonObject {
+  static PyMethodDef CkPy_MethodsCustom[];
  public:
   void execute(CkCcsRequestMsg *msg);
   void iterate(CkCcsRequestMsg *msg);
+  static void _callthr_executeThread(CkThrCallArg *impl_arg);
+  void executeThread(CkCcsRequestMsg *msg);
+  virtual PyMethodDef *getMethods() {return CkPy_MethodsCustom;}
 
   // utility functions to manipulate python objects
   // in order to use Dictionaries, Lists, Tuples, refer to
@@ -40,6 +57,14 @@ class PythonObject {
   void pythonGetFloat(PyObject*, char*, double*);
   void pythonGetComplex(PyObject*, char*, double*, double*);
 
+  // utility functions to deal with threads
+  PyObject *pythonGetArg(int);
+  void pythonPrepareReturn(int);
+  void pythonReturn(int);
+  void pythonReturn(int, PyObject*);
+  void pythonAwake(int);
+  void pythonSleep(int);
+
   // the following methods should be overwritten by the user if used
 
   // methods for accessing charm varibles from inside python
@@ -54,43 +79,14 @@ class PythonObject {
   virtual int buildIterator(PyObject*, void*) {CkAbort("PythonCCS: Method buildIterator should be reimplemented");};
   virtual int nextIteratorUpdate(PyObject*, PyObject*, void*) {CkAbort("PythonCCS: Method nextIteratorUpdate should be reimplemented");};
 
-  //virtual void registerPython();
 };
 
 typedef std::map<int,PythonObject*>  PythonTable;
 
-class PythonChare : public Chare, public PythonObject {
- public:
-  PythonChare() {}
-  PythonChare(CkMigrateMessage *msg) {}
-};
-
-class PythonGroup : public Group, public PythonObject {
- public:
-  PythonGroup() {}
-  PythonGroup(CkMigrateMessage *msg) {}
-};
-
-class PythonNodeGroup : public NodeGroup, public PythonObject {
- public:
-  PythonNodeGroup() {}
-  PythonNodeGroup(CkMigrateMessage *msg) {}
-};
-
-class PythonArray1D : public CBase_PythonArray1D, public PythonObject {
- public:
-  PythonArray1D() {}
-  PythonArray1D(CkMigrateMessage *msg) {}
-};
+CsvExtern(CmiNodeLock, pyLock);
+CsvExtern(PythonTable *, pyWorkers);
+CsvExtern(PythonThread *, pyThread);
+CsvExtern(int, pyNumber);
+CtvExtern(PyObject *, pythonReturnValue);
 
-class PythonArray2D : public CBase_PythonArray2D, public PythonObject {
- public:
-  PythonArray2D() {}
-  PythonArray2D(CkMigrateMessage *msg) {}
-};
-
-class PythonArray3D : public CBase_PythonArray3D, public PythonObject {
- public:
-  PythonArray3D() {}
-  PythonArray3D(CkMigrateMessage *msg) {}
-};
+#endif //__CKPYTHON_H
index 759e8e8fcdcdbc3cabed1fadeae3fddedba25c8e..db608d6f8c82b6f8577616f845f18990fcc7de4d 100644 (file)
@@ -249,6 +249,7 @@ dirs+sources:
        ./gatherflat ../../src/xlatcpm          .
        ./gathertree ../../src/QuickThreads QuickThreads
        ./gathertree ../../src/libs libs
+       ./gatherflat ../../src/libs/ck-libs/python .
        ./gathertree ../../src/arch/util      .
        ./gathertree ../../src/langs langs
        ./gathertree ../../src/langs/jade langs/jade
index fc00ed2d4d28e9f5f38b901dd177294ce15bc979..e083e857c8eb1ea4c3a42e6d384ef72a0b453976 100644 (file)
      ELSE = 300,
      CONNECT = 301,
      PUBLISHES = 302,
-     IDENT = 303,
-     NUMBER = 304,
-     LITERAL = 305,
-     CPROGRAM = 306,
-     HASHIF = 307,
-     HASHIFDEF = 308,
-     INT = 309,
-     LONG = 310,
-     SHORT = 311,
-     CHAR = 312,
-     FLOAT = 313,
-     DOUBLE = 314,
-     UNSIGNED = 315
+     PYTHON = 303,
+     IDENT = 304,
+     NUMBER = 305,
+     LITERAL = 306,
+     CPROGRAM = 307,
+     HASHIF = 308,
+     HASHIFDEF = 309,
+     INT = 310,
+     LONG = 311,
+     SHORT = 312,
+     CHAR = 313,
+     FLOAT = 314,
+     DOUBLE = 315,
+     UNSIGNED = 316
    };
 #endif
 #define MODULE 258
 #define ELSE 300
 #define CONNECT 301
 #define PUBLISHES 302
-#define IDENT 303
-#define NUMBER 304
-#define LITERAL 305
-#define CPROGRAM 306
-#define HASHIF 307
-#define HASHIFDEF 308
-#define INT 309
-#define LONG 310
-#define SHORT 311
-#define CHAR 312
-#define FLOAT 313
-#define DOUBLE 314
-#define UNSIGNED 315
+#define PYTHON 303
+#define IDENT 304
+#define NUMBER 305
+#define LITERAL 306
+#define CPROGRAM 307
+#define HASHIF 308
+#define HASHIFDEF 309
+#define INT 310
+#define LONG 311
+#define SHORT 312
+#define CHAR 313
+#define FLOAT 314
+#define DOUBLE 315
+#define UNSIGNED 316
 
 
 
@@ -242,7 +244,7 @@ typedef union YYSTYPE {
   SdagConstruct *sc;
 } YYSTYPE;
 /* Line 191 of yacc.c.  */
-#line 245 "y.tab.c"
+#line 247 "y.tab.c"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -254,7 +256,7 @@ typedef union YYSTYPE {
 
 
 /* Line 214 of yacc.c.  */
-#line 257 "y.tab.c"
+#line 259 "y.tab.c"
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
@@ -353,20 +355,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  9
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   528
+#define YYLAST   546
 
 /* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  75
+#define YYNTOKENS  76
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  97
+#define YYNNTS  100
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  231
+#define YYNRULES  239
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  462
+#define YYNSTATES  478
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   315
+#define YYMAXUTOK   316
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -377,16 +379,16 @@ static const unsigned char yytranslate[] =
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    71,     2,
-      69,    70,    68,     2,    65,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    62,    61,
-      66,    74,    67,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    72,     2,
+      70,    71,    69,     2,    66,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    63,    62,
+      67,    75,    68,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    72,     2,    73,     2,     2,     2,     2,     2,     2,
+       2,    73,     2,    74,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    63,     2,    64,     2,     2,     2,     2,
+       2,     2,     2,    64,     2,    65,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -405,7 +407,7 @@ static const unsigned char yytranslate[] =
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60
+      55,    56,    57,    58,    59,    60,    61
 };
 
 #if YYDEBUG
@@ -421,136 +423,138 @@ static const unsigned short yyprhs[] =
      128,   130,   133,   136,   138,   140,   143,   146,   149,   158,
      160,   162,   164,   166,   169,   172,   175,   177,   179,   181,
      185,   186,   189,   194,   200,   201,   203,   204,   208,   210,
-     214,   216,   218,   219,   223,   225,   229,   231,   237,   239,
-     242,   246,   253,   254,   257,   259,   263,   269,   275,   281,
-     287,   292,   296,   302,   308,   314,   320,   326,   332,   337,
-     345,   346,   349,   350,   353,   356,   360,   363,   367,   369,
-     373,   378,   381,   384,   387,   390,   393,   395,   400,   401,
-     404,   407,   410,   413,   416,   420,   424,   428,   435,   439,
-     446,   450,   457,   459,   463,   465,   468,   470,   478,   484,
-     486,   488,   489,   493,   495,   499,   501,   503,   505,   507,
-     509,   511,   513,   515,   517,   519,   521,   523,   524,   526,
-     530,   531,   533,   539,   545,   551,   556,   560,   562,   564,
-     566,   569,   574,   578,   580,   584,   588,   591,   592,   596,
-     597,   599,   603,   605,   608,   610,   613,   614,   619,   621,
-     625,   627,   628,   635,   644,   649,   653,   659,   664,   676,
-     686,   699,   714,   721,   730,   736,   744,   748,   749,   752,
-     757,   759,   763,   765,   767,   770,   776,   778,   782,   784,
-     786,   789
+     214,   216,   218,   219,   223,   225,   229,   231,   232,   236,
+     238,   242,   244,   246,   252,   254,   257,   261,   268,   269,
+     272,   274,   278,   284,   290,   296,   302,   307,   311,   318,
+     325,   331,   337,   343,   349,   355,   360,   368,   369,   372,
+     373,   376,   379,   383,   386,   390,   392,   396,   401,   404,
+     407,   410,   413,   416,   418,   423,   424,   427,   430,   433,
+     436,   439,   443,   447,   451,   458,   462,   469,   473,   480,
+     482,   486,   488,   491,   493,   501,   507,   509,   511,   512,
+     516,   518,   522,   524,   526,   528,   530,   532,   534,   536,
+     538,   540,   542,   544,   546,   548,   549,   551,   555,   556,
+     558,   564,   570,   576,   581,   585,   587,   589,   591,   594,
+     599,   603,   605,   609,   613,   616,   617,   621,   622,   624,
+     628,   630,   633,   635,   638,   639,   644,   646,   650,   652,
+     653,   660,   669,   674,   678,   684,   689,   701,   711,   724,
+     739,   746,   755,   761,   769,   773,   774,   777,   782,   784,
+     788,   790,   792,   795,   801,   803,   807,   809,   811,   814
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const short yyrhs[] =
 {
-      76,     0,    -1,    77,    -1,    -1,    82,    77,    -1,    -1,
-       5,    -1,    -1,    61,    -1,    48,    -1,    48,    -1,    81,
-      62,    62,    48,    -1,     3,    80,    83,    -1,     4,    80,
-      83,    -1,    61,    -1,    63,    84,    64,    79,    -1,    -1,
-      85,    84,    -1,    78,    63,    84,    64,    79,    -1,    78,
-      82,    -1,    78,   134,    -1,    78,   113,    61,    -1,    78,
-     116,    -1,    78,   117,    -1,    78,   118,    -1,    78,   120,
-      -1,    78,   131,    -1,   170,    -1,   171,    -1,    98,    -1,
-      49,    -1,    50,    -1,    86,    -1,    86,    65,    87,    -1,
-      -1,    87,    -1,    -1,    66,    88,    67,    -1,    54,    -1,
-      55,    -1,    56,    -1,    57,    -1,    60,    54,    -1,    60,
-      55,    -1,    60,    56,    -1,    60,    57,    -1,    55,    55,
-      -1,    58,    -1,    59,    -1,    55,    59,    -1,    32,    -1,
-      80,    89,    -1,    81,    89,    -1,    90,    -1,    92,    -1,
-      93,    68,    -1,    94,    68,    -1,    95,    68,    -1,    97,
-      69,    68,    80,    70,    69,   152,    70,    -1,    93,    -1,
-      94,    -1,    95,    -1,    96,    -1,    33,    97,    -1,    97,
-      33,    -1,    97,    71,    -1,    97,    -1,    49,    -1,    81,
-      -1,    72,    99,    73,    -1,    -1,   100,   101,    -1,     6,
-      98,    81,   101,    -1,     6,    16,    93,    68,    80,    -1,
-      -1,    32,    -1,    -1,    72,   106,    73,    -1,   107,    -1,
-     107,    65,   106,    -1,    34,    -1,    35,    -1,    -1,    72,
-     109,    73,    -1,   110,    -1,   110,    65,   109,    -1,    27,
-      -1,    98,    80,    72,    73,    61,    -1,   111,    -1,   111,
-     112,    -1,    16,   105,    91,    -1,    16,   105,    91,    63,
-     112,    64,    -1,    -1,    62,   115,    -1,    91,    -1,    91,
-      65,   115,    -1,    11,   108,    91,   114,   132,    -1,    12,
-     108,    91,   114,   132,    -1,    13,   108,    91,   114,   132,
-      -1,    14,   108,    91,   114,   132,    -1,    72,    49,    80,
-      73,    -1,    72,    80,    73,    -1,    15,   119,    91,   114,
-     132,    -1,    11,   108,    80,   114,   132,    -1,    12,   108,
-      80,   114,   132,    -1,    13,   108,    80,   114,   132,    -1,
-      14,   108,    80,   114,   132,    -1,    15,   119,    80,   114,
-     132,    -1,    16,   105,    80,    61,    -1,    16,   105,    80,
-      63,   112,    64,    61,    -1,    -1,    74,    98,    -1,    -1,
-      74,    49,    -1,    74,    50,    -1,    17,    80,   126,    -1,
-      96,   127,    -1,    98,    80,   127,    -1,   128,    -1,   128,
-      65,   129,    -1,    21,    66,   129,    67,    -1,   130,   121,
-      -1,   130,   122,    -1,   130,   123,    -1,   130,   124,    -1,
-     130,   125,    -1,    61,    -1,    63,   133,    64,    79,    -1,
-      -1,   139,   133,    -1,   102,    61,    -1,   103,    61,    -1,
-     136,    61,    -1,   135,    61,    -1,    10,   137,    61,    -1,
-      18,   138,    61,    -1,     8,   104,    81,    -1,     8,   104,
-      81,    69,   104,    70,    -1,     7,   104,    81,    -1,     7,
-     104,    81,    69,   104,    70,    -1,     9,   104,    81,    -1,
-       9,   104,    81,    69,   104,    70,    -1,    81,    -1,    81,
-      65,   137,    -1,    50,    -1,   140,    61,    -1,   134,    -1,
-      36,   142,   141,    80,   153,   154,   155,    -1,    36,   142,
-      80,   153,   155,    -1,    32,    -1,    94,    -1,    -1,    72,
-     143,    73,    -1,   144,    -1,   144,    65,   143,    -1,    20,
-      -1,    22,    -1,    23,    -1,    28,    -1,    29,    -1,    30,
-      -1,    31,    -1,    24,    -1,    25,    -1,    50,    -1,    49,
-      -1,    81,    -1,    -1,    51,    -1,    51,    65,   146,    -1,
-      -1,    51,    -1,    51,    72,   147,    73,   147,    -1,    51,
-      63,   147,    64,   147,    -1,    51,    69,   146,    70,   147,
-      -1,    69,   147,    70,   147,    -1,    98,    80,    72,    -1,
-      63,    -1,    64,    -1,    98,    -1,    98,    80,    -1,    98,
-      80,    74,   145,    -1,   148,   147,    73,    -1,   151,    -1,
-     151,    65,   152,    -1,    69,   152,    70,    -1,    69,    70,
-      -1,    -1,    19,    74,    49,    -1,    -1,   161,    -1,    63,
-     156,    64,    -1,   161,    -1,   161,   156,    -1,   161,    -1,
-     161,   156,    -1,    -1,    47,    69,   159,    70,    -1,    48,
-      -1,    48,    65,   159,    -1,    50,    -1,    -1,    42,   160,
-     149,   147,   150,   158,    -1,    46,    69,    48,   153,    70,
-     149,   147,    64,    -1,    40,   167,    63,    64,    -1,    40,
-     167,   161,    -1,    40,   167,    63,   156,    64,    -1,    41,
-      63,   157,    64,    -1,    37,   165,   147,    61,   147,    61,
-     147,   164,    63,   156,    64,    -1,    37,   165,   147,    61,
-     147,    61,   147,   164,   161,    -1,    38,    72,    48,    73,
-     165,   147,    62,   147,    65,   147,   164,   161,    -1,    38,
-      72,    48,    73,   165,   147,    62,   147,    65,   147,   164,
-      63,   156,    64,    -1,    44,   165,   147,   164,   161,   162,
-      -1,    44,   165,   147,   164,    63,   156,    64,   162,    -1,
-      39,   165,   147,   164,   161,    -1,    39,   165,   147,   164,
-      63,   156,    64,    -1,    43,   163,    61,    -1,    -1,    45,
-     161,    -1,    45,    63,   156,    64,    -1,    48,    -1,    48,
-      65,   163,    -1,    70,    -1,    69,    -1,    48,   153,    -1,
-      48,   168,   147,   169,   153,    -1,   166,    -1,   166,    65,
-     167,    -1,    72,    -1,    73,    -1,    52,    80,    -1,    53,
-      80,    -1
+      77,     0,    -1,    78,    -1,    -1,    83,    78,    -1,    -1,
+       5,    -1,    -1,    62,    -1,    49,    -1,    49,    -1,    82,
+      63,    63,    49,    -1,     3,    81,    84,    -1,     4,    81,
+      84,    -1,    62,    -1,    64,    85,    65,    80,    -1,    -1,
+      86,    85,    -1,    79,    64,    85,    65,    80,    -1,    79,
+      83,    -1,    79,   138,    -1,    79,   117,    62,    -1,    79,
+     120,    -1,    79,   121,    -1,    79,   122,    -1,    79,   124,
+      -1,    79,   135,    -1,   174,    -1,   175,    -1,    99,    -1,
+      50,    -1,    51,    -1,    87,    -1,    87,    66,    88,    -1,
+      -1,    88,    -1,    -1,    67,    89,    68,    -1,    55,    -1,
+      56,    -1,    57,    -1,    58,    -1,    61,    55,    -1,    61,
+      56,    -1,    61,    57,    -1,    61,    58,    -1,    56,    56,
+      -1,    59,    -1,    60,    -1,    56,    60,    -1,    32,    -1,
+      81,    90,    -1,    82,    90,    -1,    91,    -1,    93,    -1,
+      94,    69,    -1,    95,    69,    -1,    96,    69,    -1,    98,
+      70,    69,    81,    71,    70,   156,    71,    -1,    94,    -1,
+      95,    -1,    96,    -1,    97,    -1,    33,    98,    -1,    98,
+      33,    -1,    98,    72,    -1,    98,    -1,    50,    -1,    82,
+      -1,    73,   100,    74,    -1,    -1,   101,   102,    -1,     6,
+      99,    82,   102,    -1,     6,    16,    94,    69,    81,    -1,
+      -1,    32,    -1,    -1,    73,   107,    74,    -1,   108,    -1,
+     108,    66,   107,    -1,    34,    -1,    35,    -1,    -1,    73,
+     110,    74,    -1,   114,    -1,   114,    66,   110,    -1,    48,
+      -1,    -1,    73,   113,    74,    -1,   111,    -1,   111,    66,
+     113,    -1,    27,    -1,    48,    -1,    99,    81,    73,    74,
+      62,    -1,   115,    -1,   115,   116,    -1,    16,   106,    92,
+      -1,    16,   106,    92,    64,   116,    65,    -1,    -1,    63,
+     119,    -1,    92,    -1,    92,    66,   119,    -1,    11,   109,
+      92,   118,   136,    -1,    12,   109,    92,   118,   136,    -1,
+      13,   109,    92,   118,   136,    -1,    14,   109,    92,   118,
+     136,    -1,    73,    50,    81,    74,    -1,    73,    81,    74,
+      -1,    15,   112,   123,    92,   118,   136,    -1,    15,   123,
+     112,    92,   118,   136,    -1,    11,   109,    81,   118,   136,
+      -1,    12,   109,    81,   118,   136,    -1,    13,   109,    81,
+     118,   136,    -1,    14,   109,    81,   118,   136,    -1,    15,
+     123,    81,   118,   136,    -1,    16,   106,    81,    62,    -1,
+      16,   106,    81,    64,   116,    65,    62,    -1,    -1,    75,
+      99,    -1,    -1,    75,    50,    -1,    75,    51,    -1,    17,
+      81,   130,    -1,    97,   131,    -1,    99,    81,   131,    -1,
+     132,    -1,   132,    66,   133,    -1,    21,    67,   133,    68,
+      -1,   134,   125,    -1,   134,   126,    -1,   134,   127,    -1,
+     134,   128,    -1,   134,   129,    -1,    62,    -1,    64,   137,
+      65,    80,    -1,    -1,   143,   137,    -1,   103,    62,    -1,
+     104,    62,    -1,   140,    62,    -1,   139,    62,    -1,    10,
+     141,    62,    -1,    18,   142,    62,    -1,     8,   105,    82,
+      -1,     8,   105,    82,    70,   105,    71,    -1,     7,   105,
+      82,    -1,     7,   105,    82,    70,   105,    71,    -1,     9,
+     105,    82,    -1,     9,   105,    82,    70,   105,    71,    -1,
+      82,    -1,    82,    66,   141,    -1,    51,    -1,   144,    62,
+      -1,   138,    -1,    36,   146,   145,    81,   157,   158,   159,
+      -1,    36,   146,    81,   157,   159,    -1,    32,    -1,    95,
+      -1,    -1,    73,   147,    74,    -1,   148,    -1,   148,    66,
+     147,    -1,    20,    -1,    22,    -1,    23,    -1,    28,    -1,
+      29,    -1,    30,    -1,    31,    -1,    24,    -1,    25,    -1,
+      48,    -1,    51,    -1,    50,    -1,    82,    -1,    -1,    52,
+      -1,    52,    66,   150,    -1,    -1,    52,    -1,    52,    73,
+     151,    74,   151,    -1,    52,    64,   151,    65,   151,    -1,
+      52,    70,   150,    71,   151,    -1,    70,   151,    71,   151,
+      -1,    99,    81,    73,    -1,    64,    -1,    65,    -1,    99,
+      -1,    99,    81,    -1,    99,    81,    75,   149,    -1,   152,
+     151,    74,    -1,   155,    -1,   155,    66,   156,    -1,    70,
+     156,    71,    -1,    70,    71,    -1,    -1,    19,    75,    50,
+      -1,    -1,   165,    -1,    64,   160,    65,    -1,   165,    -1,
+     165,   160,    -1,   165,    -1,   165,   160,    -1,    -1,    47,
+      70,   163,    71,    -1,    49,    -1,    49,    66,   163,    -1,
+      51,    -1,    -1,    42,   164,   153,   151,   154,   162,    -1,
+      46,    70,    49,   157,    71,   153,   151,    65,    -1,    40,
+     171,    64,    65,    -1,    40,   171,   165,    -1,    40,   171,
+      64,   160,    65,    -1,    41,    64,   161,    65,    -1,    37,
+     169,   151,    62,   151,    62,   151,   168,    64,   160,    65,
+      -1,    37,   169,   151,    62,   151,    62,   151,   168,   165,
+      -1,    38,    73,    49,    74,   169,   151,    63,   151,    66,
+     151,   168,   165,    -1,    38,    73,    49,    74,   169,   151,
+      63,   151,    66,   151,   168,    64,   160,    65,    -1,    44,
+     169,   151,   168,   165,   166,    -1,    44,   169,   151,   168,
+      64,   160,    65,   166,    -1,    39,   169,   151,   168,   165,
+      -1,    39,   169,   151,   168,    64,   160,    65,    -1,    43,
+     167,    62,    -1,    -1,    45,   165,    -1,    45,    64,   160,
+      65,    -1,    49,    -1,    49,    66,   167,    -1,    71,    -1,
+      70,    -1,    49,   157,    -1,    49,   172,   151,   173,   157,
+      -1,   170,    -1,   170,    66,   171,    -1,    73,    -1,    74,
+      -1,    53,    81,    -1,    54,    81,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short yyrline[] =
 {
-       0,   130,   130,   135,   138,   143,   144,   149,   150,   154,
-     158,   160,   168,   172,   179,   181,   186,   187,   191,   193,
-     195,   197,   199,   201,   203,   205,   207,   209,   211,   215,
-     217,   219,   223,   225,   230,   231,   236,   237,   241,   243,
-     245,   247,   249,   251,   253,   255,   257,   259,   261,   263,
-     265,   269,   270,   272,   274,   278,   282,   284,   288,   292,
-     294,   296,   298,   301,   303,   307,   309,   313,   315,   319,
-     324,   325,   329,   333,   338,   339,   344,   345,   355,   357,
-     361,   363,   368,   369,   373,   375,   379,   383,   387,   389,
-     393,   395,   400,   401,   405,   407,   411,   413,   417,   421,
-     425,   431,   435,   439,   441,   445,   449,   453,   457,   459,
-     464,   465,   470,   471,   473,   477,   479,   481,   485,   487,
-     491,   495,   497,   499,   501,   503,   507,   509,   514,   532,
-     536,   538,   540,   541,   543,   545,   549,   551,   553,   556,
-     561,   563,   567,   569,   573,   577,   579,   583,   594,   607,
-     609,   614,   615,   619,   621,   625,   627,   629,   631,   633,
-     635,   637,   639,   641,   645,   647,   649,   654,   655,   657,
-     666,   667,   669,   675,   681,   687,   695,   702,   710,   717,
-     719,   721,   723,   730,   732,   736,   738,   743,   744,   749,
-     750,   752,   756,   758,   762,   764,   769,   770,   774,   776,
-     780,   783,   786,   791,   805,   807,   809,   811,   813,   816,
-     819,   822,   825,   827,   829,   831,   833,   838,   839,   841,
-     844,   846,   850,   854,   858,   866,   874,   876,   880,   883,
-     887,   891
+       0,   132,   132,   137,   140,   145,   146,   151,   152,   156,
+     160,   162,   170,   174,   181,   183,   188,   189,   193,   195,
+     197,   199,   201,   203,   205,   207,   209,   211,   213,   217,
+     219,   221,   225,   227,   232,   233,   238,   239,   243,   245,
+     247,   249,   251,   253,   255,   257,   259,   261,   263,   265,
+     267,   271,   272,   274,   276,   280,   284,   286,   290,   294,
+     296,   298,   300,   303,   305,   309,   311,   315,   317,   321,
+     326,   327,   331,   335,   340,   341,   346,   347,   357,   359,
+     363,   365,   370,   371,   375,   377,   381,   386,   387,   391,
+     393,   397,   399,   403,   407,   409,   413,   415,   420,   421,
+     425,   427,   431,   433,   437,   441,   445,   451,   455,   457,
+     461,   463,   467,   471,   475,   479,   481,   486,   487,   492,
+     493,   495,   499,   501,   503,   507,   509,   513,   517,   519,
+     521,   523,   525,   529,   531,   536,   554,   558,   560,   562,
+     563,   565,   567,   571,   573,   575,   578,   583,   585,   589,
+     591,   595,   599,   601,   605,   616,   629,   631,   636,   637,
+     641,   643,   647,   649,   651,   653,   655,   657,   659,   661,
+     663,   665,   669,   671,   673,   678,   679,   681,   690,   691,
+     693,   699,   705,   711,   719,   726,   734,   741,   743,   745,
+     747,   754,   756,   760,   762,   767,   768,   773,   774,   776,
+     780,   782,   786,   788,   793,   794,   798,   800,   804,   807,
+     810,   815,   829,   831,   833,   835,   837,   840,   843,   846,
+     849,   851,   853,   855,   857,   862,   863,   865,   868,   870,
+     874,   878,   882,   890,   898,   900,   904,   907,   911,   915
 };
 #endif
 
@@ -566,18 +570,19 @@ static const char *const yytname[] =
   "IMMEDIATE", "SKIPSCHED", "VIRTUAL", "MIGRATABLE", "CREATEHERE", 
   "CREATEHOME", "NOKEEP", "NOTRACE", "VOID", "CONST", "PACKED", "VARSIZE", 
   "ENTRY", "FOR", "FORALL", "WHILE", "WHEN", "OVERLAP", "ATOMIC", 
-  "FORWARD", "IF", "ELSE", "CONNECT", "PUBLISHES", "IDENT", "NUMBER", 
-  "LITERAL", "CPROGRAM", "HASHIF", "HASHIFDEF", "INT", "LONG", "SHORT", 
-  "CHAR", "FLOAT", "DOUBLE", "UNSIGNED", "';'", "':'", "'{'", "'}'", 
-  "','", "'<'", "'>'", "'*'", "'('", "')'", "'&'", "'['", "']'", "'='", 
-  "$accept", "File", "ModuleEList", "OptExtern", "OptSemiColon", "Name", 
-  "QualName", "Module", "ConstructEList", "ConstructList", "Construct", 
-  "TParam", "TParamList", "TParamEList", "OptTParams", "BuiltinType", 
-  "NamedType", "QualNamedType", "SimpleType", "OnePtrType", "PtrType", 
-  "FuncType", "BaseType", "Type", "ArrayDim", "Dim", "DimList", 
+  "FORWARD", "IF", "ELSE", "CONNECT", "PUBLISHES", "PYTHON", "IDENT", 
+  "NUMBER", "LITERAL", "CPROGRAM", "HASHIF", "HASHIFDEF", "INT", "LONG", 
+  "SHORT", "CHAR", "FLOAT", "DOUBLE", "UNSIGNED", "';'", "':'", "'{'", 
+  "'}'", "','", "'<'", "'>'", "'*'", "'('", "')'", "'&'", "'['", "']'", 
+  "'='", "$accept", "File", "ModuleEList", "OptExtern", "OptSemiColon", 
+  "Name", "QualName", "Module", "ConstructEList", "ConstructList", 
+  "Construct", "TParam", "TParamList", "TParamEList", "OptTParams", 
+  "BuiltinType", "NamedType", "QualNamedType", "SimpleType", "OnePtrType", 
+  "PtrType", "FuncType", "BaseType", "Type", "ArrayDim", "Dim", "DimList", 
   "Readonly", "ReadonlyMsg", "OptVoid", "MAttribs", "MAttribList", 
-  "MAttrib", "CAttribs", "CAttribList", "CAttrib", "Var", "VarList", 
-  "Message", "OptBaseList", "BaseList", "Chare", "Group", "NodeGroup", 
+  "MAttrib", "CAttribs", "CAttribList", "ArrayAttrib", "ArrayAttribs", 
+  "ArrayAttribList", "CAttrib", "Var", "VarList", "Message", 
+  "OptBaseList", "BaseList", "Chare", "Group", "NodeGroup", 
   "ArrayIndexType", "Array", "TChare", "TGroup", "TNodeGroup", "TArray", 
   "TMessage", "OptTypeInit", "OptNameInit", "TVar", "TVarList", 
   "TemplateSpec", "Template", "MemberEList", "MemberList", 
@@ -604,38 +609,38 @@ static const unsigned short yytoknum[] =
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
      295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
      305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
-     315,    59,    58,   123,   125,    44,    60,    62,    42,    40,
-      41,    38,    91,    93,    61
+     315,   316,    59,    58,   123,   125,    44,    60,    62,    42,
+      40,    41,    38,    91,    93,    61
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 {
-       0,    75,    76,    77,    77,    78,    78,    79,    79,    80,
-      81,    81,    82,    82,    83,    83,    84,    84,    85,    85,
-      85,    85,    85,    85,    85,    85,    85,    85,    85,    86,
-      86,    86,    87,    87,    88,    88,    89,    89,    90,    90,
-      90,    90,    90,    90,    90,    90,    90,    90,    90,    90,
-      90,    91,    92,    93,    93,    94,    95,    95,    96,    97,
-      97,    97,    97,    97,    97,    98,    98,    99,    99,   100,
-     101,   101,   102,   103,   104,   104,   105,   105,   106,   106,
-     107,   107,   108,   108,   109,   109,   110,   111,   112,   112,
-     113,   113,   114,   114,   115,   115,   116,   116,   117,   118,
-     119,   119,   120,   121,   121,   122,   123,   124,   125,   125,
-     126,   126,   127,   127,   127,   128,   128,   128,   129,   129,
-     130,   131,   131,   131,   131,   131,   132,   132,   133,   133,
-     134,   134,   134,   134,   134,   134,   135,   135,   135,   135,
-     136,   136,   137,   137,   138,   139,   139,   140,   140,   141,
-     141,   142,   142,   143,   143,   144,   144,   144,   144,   144,
-     144,   144,   144,   144,   145,   145,   145,   146,   146,   146,
-     147,   147,   147,   147,   147,   147,   148,   149,   150,   151,
-     151,   151,   151,   152,   152,   153,   153,   154,   154,   155,
-     155,   155,   156,   156,   157,   157,   158,   158,   159,   159,
-     160,   160,   161,   161,   161,   161,   161,   161,   161,   161,
-     161,   161,   161,   161,   161,   161,   161,   162,   162,   162,
-     163,   163,   164,   165,   166,   166,   167,   167,   168,   169,
-     170,   171
+       0,    76,    77,    78,    78,    79,    79,    80,    80,    81,
+      82,    82,    83,    83,    84,    84,    85,    85,    86,    86,
+      86,    86,    86,    86,    86,    86,    86,    86,    86,    87,
+      87,    87,    88,    88,    89,    89,    90,    90,    91,    91,
+      91,    91,    91,    91,    91,    91,    91,    91,    91,    91,
+      91,    92,    93,    94,    94,    95,    96,    96,    97,    98,
+      98,    98,    98,    98,    98,    99,    99,   100,   100,   101,
+     102,   102,   103,   104,   105,   105,   106,   106,   107,   107,
+     108,   108,   109,   109,   110,   110,   111,   112,   112,   113,
+     113,   114,   114,   115,   116,   116,   117,   117,   118,   118,
+     119,   119,   120,   120,   121,   122,   123,   123,   124,   124,
+     125,   125,   126,   127,   128,   129,   129,   130,   130,   131,
+     131,   131,   132,   132,   132,   133,   133,   134,   135,   135,
+     135,   135,   135,   136,   136,   137,   137,   138,   138,   138,
+     138,   138,   138,   139,   139,   139,   139,   140,   140,   141,
+     141,   142,   143,   143,   144,   144,   145,   145,   146,   146,
+     147,   147,   148,   148,   148,   148,   148,   148,   148,   148,
+     148,   148,   149,   149,   149,   150,   150,   150,   151,   151,
+     151,   151,   151,   151,   152,   153,   154,   155,   155,   155,
+     155,   156,   156,   157,   157,   158,   158,   159,   159,   159,
+     160,   160,   161,   161,   162,   162,   163,   163,   164,   164,
+     165,   165,   165,   165,   165,   165,   165,   165,   165,   165,
+     165,   165,   165,   165,   165,   166,   166,   166,   167,   167,
+     168,   169,   170,   170,   171,   171,   172,   173,   174,   175
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -649,22 +654,22 @@ static const unsigned char yyr2[] =
        1,     2,     2,     1,     1,     2,     2,     2,     8,     1,
        1,     1,     1,     2,     2,     2,     1,     1,     1,     3,
        0,     2,     4,     5,     0,     1,     0,     3,     1,     3,
-       1,     1,     0,     3,     1,     3,     1,     5,     1,     2,
-       3,     6,     0,     2,     1,     3,     5,     5,     5,     5,
-       4,     3,     5,     5,     5,     5,     5,     5,     4,     7,
-       0,     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,     6,     3,     6,
-       3,     6,     1,     3,     1,     2,     1,     7,     5,     1,
-       1,     0,     3,     1,     3,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     0,     1,     3,
-       0,     1,     5,     5,     5,     4,     3,     1,     1,     1,
-       2,     4,     3,     1,     3,     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,     0,     2,     4,
-       1,     3,     1,     1,     2,     5,     1,     3,     1,     1,
-       2,     2
+       1,     1,     0,     3,     1,     3,     1,     0,     3,     1,
+       3,     1,     1,     5,     1,     2,     3,     6,     0,     2,
+       1,     3,     5,     5,     5,     5,     4,     3,     6,     6,
+       5,     5,     5,     5,     5,     4,     7,     0,     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,     6,     3,     6,     3,     6,     1,
+       3,     1,     2,     1,     7,     5,     1,     1,     0,     3,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     0,     1,     3,     0,     1,
+       5,     5,     5,     4,     3,     1,     1,     1,     2,     4,
+       3,     1,     3,     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,     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
@@ -674,307 +679,314 @@ static const unsigned char yydefact[] =
 {
        3,     0,     0,     0,     2,     3,     9,     0,     0,     1,
        4,    14,     5,    12,    13,     6,     0,     0,     0,     0,
-       5,    27,    28,   230,   231,     0,    74,    74,    74,     0,
+       5,    27,    28,   238,   239,     0,    74,    74,    74,     0,
       82,    82,    82,    82,     0,    76,     0,     0,     5,    19,
        0,     0,     0,    22,    23,    24,    25,     0,    26,    20,
        0,     0,     7,    17,     0,    50,     0,    10,    38,    39,
       40,    41,    47,    48,     0,    36,    53,    54,    59,    60,
-      61,    62,    66,     0,    75,     0,     0,     0,   142,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   144,
-       0,     0,     0,   130,   131,    21,    82,    82,    82,    82,
-       0,    76,   121,   122,   123,   124,   125,   133,   132,     8,
-      15,     0,    63,    46,    49,    42,    43,    44,    45,     0,
-      34,    52,    55,    56,    57,    64,     0,    65,    70,   138,
-     136,   140,     0,   134,    86,     0,    84,    36,    92,    92,
-      92,    92,     0,     0,    92,    80,    81,     0,    78,    90,
-     135,     0,    62,     0,   118,     0,     7,     0,     0,     0,
-       0,     0,     0,     0,     0,    30,    31,    32,    35,     0,
-      29,     0,     0,    70,    72,    74,    74,    74,   143,    83,
-       0,    51,     0,     0,     0,     0,     0,     0,   101,     0,
-      77,     0,     0,   110,     0,   116,   112,     0,   120,    18,
-      92,    92,    92,    92,    92,     0,    73,    11,     0,    37,
-       0,    67,    68,     0,    71,     0,     0,     0,    85,    94,
-      93,   126,   128,    96,    97,    98,    99,   100,   102,    79,
-       0,    88,     0,     0,   115,   113,   114,   117,   119,     0,
-       0,     0,     0,     0,   108,     0,    33,     0,    69,   139,
-     137,   141,     0,   151,     0,   146,   128,     0,     0,    89,
-      91,   111,   103,   104,   105,   106,   107,     0,     0,    95,
-       0,     0,     7,   129,   145,     0,     0,   179,   170,   183,
-       0,   155,   156,   157,   162,   163,   158,   159,   160,   161,
-       0,   153,    50,    10,     0,     0,   150,     0,   127,     0,
-     109,   180,   171,   170,     0,     0,    58,   152,     0,     0,
-     189,     0,    87,   176,     0,   170,   167,   170,     0,   182,
-     184,   154,   186,     0,     0,     0,     0,     0,     0,   201,
-       0,     0,     0,     0,   148,   190,   187,   165,   164,   166,
-     181,     0,   168,     0,     0,   170,   185,   223,   170,     0,
-     170,     0,   226,     0,     0,   200,     0,   220,     0,   170,
-       0,     0,   192,     0,   189,   170,   167,   170,   170,   175,
-       0,     0,     0,   228,   224,   170,     0,     0,   205,     0,
-     194,   177,   170,     0,   216,     0,     0,   191,   193,     0,
-     147,   173,   169,   174,   172,   170,     0,   222,     0,     0,
-     227,   204,     0,   207,   195,     0,   221,     0,     0,   188,
-       0,   170,     0,   214,   229,     0,   206,   178,   196,     0,
-     217,     0,   170,     0,     0,   225,     0,   202,     0,     0,
-     212,   170,     0,   170,   215,     0,   217,     0,   218,     0,
-       0,     0,   198,     0,   213,     0,   203,     0,   209,   170,
-       0,   197,   219,     0,     0,   199,   208,     0,     0,   210,
-       0,   211
+      61,    62,    66,     0,    75,     0,     0,     0,   149,     0,
+       0,     0,     0,     0,     0,     0,     0,    87,     0,     0,
+     151,     0,     0,     0,   137,   138,    21,    82,    82,    82,
+      82,     0,    76,   128,   129,   130,   131,   132,   140,   139,
+       8,    15,     0,    63,    46,    49,    42,    43,    44,    45,
+       0,    34,    52,    55,    56,    57,    64,     0,    65,    70,
+     145,   143,   147,     0,   141,    91,    92,     0,    84,    36,
+      98,    98,    98,    98,    86,     0,     0,    89,     0,     0,
+       0,     0,     0,    80,    81,     0,    78,    96,   142,     0,
+      62,     0,   125,     0,     7,     0,     0,     0,     0,     0,
+       0,     0,     0,    30,    31,    32,    35,     0,    29,     0,
+       0,    70,    72,    74,    74,    74,   150,    83,     0,    51,
+       0,     0,     0,     0,     0,     0,   107,     0,    88,    98,
+      98,    77,     0,     0,   117,     0,   123,   119,     0,   127,
+      18,    98,    98,    98,    98,    98,     0,    73,    11,     0,
+      37,     0,    67,    68,     0,    71,     0,     0,     0,    85,
+     100,    99,   133,   135,   102,   103,   104,   105,   106,    90,
+       0,     0,    79,     0,    94,     0,     0,   122,   120,   121,
+     124,   126,     0,     0,     0,     0,     0,   115,     0,    33,
+       0,    69,   146,   144,   148,     0,   158,     0,   153,   135,
+       0,   108,   109,     0,    95,    97,   118,   110,   111,   112,
+     113,   114,     0,     0,   101,     0,     0,     7,   136,   152,
+       0,     0,   187,   178,   191,     0,   162,   163,   164,   169,
+     170,   165,   166,   167,   168,   171,     0,   160,    50,    10,
+       0,     0,   157,     0,   134,     0,   116,   188,   179,   178,
+       0,     0,    58,   159,     0,     0,   197,     0,    93,   184,
+       0,   178,   175,   178,     0,   190,   192,   161,   194,     0,
+       0,     0,     0,     0,     0,   209,     0,     0,     0,     0,
+     155,   198,   195,   173,   172,   174,   189,     0,   176,     0,
+       0,   178,   193,   231,   178,     0,   178,     0,   234,     0,
+       0,   208,     0,   228,     0,   178,     0,     0,   200,     0,
+     197,   178,   175,   178,   178,   183,     0,     0,     0,   236,
+     232,   178,     0,     0,   213,     0,   202,   185,   178,     0,
+     224,     0,     0,   199,   201,     0,   154,   181,   177,   182,
+     180,   178,     0,   230,     0,     0,   235,   212,     0,   215,
+     203,     0,   229,     0,     0,   196,     0,   178,     0,   222,
+     237,     0,   214,   186,   204,     0,   225,     0,   178,     0,
+       0,   233,     0,   210,     0,     0,   220,   178,     0,   178,
+     223,     0,   225,     0,   226,     0,     0,     0,   206,     0,
+     221,     0,   211,     0,   217,   178,     0,   205,   227,     0,
+       0,   207,   216,     0,     0,   218,     0,   219
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short yydefgoto[] =
 {
-      -1,     3,     4,    18,   110,   137,    65,     5,    13,    19,
-      20,   167,   168,   169,   121,    66,   219,    67,    68,    69,
-      70,    71,    72,   230,   213,   173,   174,    40,    41,    75,
-      88,   147,   148,    81,   135,   136,   231,   232,    42,   183,
-     220,    43,    44,    45,    86,    46,   102,   103,   104,   105,
-     106,   234,   195,   154,   155,    47,    48,   223,   254,   255,
-      50,    51,    79,    90,   256,   257,   297,   271,   290,   291,
-     340,   343,   304,   278,   382,   418,   279,   280,   310,   364,
-     334,   361,   379,   427,   443,   356,   362,   430,   358,   398,
-     348,   352,   353,   375,   415,    21,    22
+      -1,     3,     4,    18,   111,   139,    65,     5,    13,    19,
+      20,   175,   176,   177,   122,    66,   230,    67,    68,    69,
+      70,    71,    72,   243,   224,   181,   182,    40,    41,    75,
+      89,   155,   156,    81,   137,   147,    86,   148,   138,   244,
+     245,    42,   191,   231,    43,    44,    45,    87,    46,   103,
+     104,   105,   106,   107,   247,   206,   162,   163,    47,    48,
+     234,   267,   268,    50,    51,    79,    91,   269,   270,   313,
+     286,   306,   307,   356,   359,   320,   293,   398,   434,   294,
+     295,   326,   380,   350,   377,   395,   443,   459,   372,   378,
+     446,   374,   414,   364,   368,   369,   391,   431,    21,    22
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -373
+#define YYPACT_NINF -392
 static const short yypact[] =
 {
-      27,   -29,   -29,    59,  -373,    27,  -373,     4,     4,  -373,
-    -373,  -373,     5,  -373,  -373,  -373,   -29,   -29,   185,     0,
-       5,  -373,  -373,  -373,  -373,   186,    56,    56,    56,    78,
-      63,    63,    63,    63,    67,    71,   113,   102,     5,  -373,
-     114,   125,   129,  -373,  -373,  -373,  -373,   241,  -373,  -373,
-     146,   150,   153,  -373,   305,  -373,   288,  -373,  -373,    42,
-    -373,  -373,  -373,  -373,    55,    41,  -373,  -373,   147,   148,
-     158,  -373,   -16,    78,  -373,    78,    78,    78,    65,   166,
-     190,   -29,   -29,   -29,   -29,    69,   -29,   112,   -29,  -373,
-     167,   245,   168,  -373,  -373,  -373,    63,    63,    63,    63,
-      67,    71,  -373,  -373,  -373,  -373,  -373,  -373,  -373,  -373,
-    -373,   162,   -13,  -373,  -373,  -373,  -373,  -373,  -373,   169,
-     275,  -373,  -373,  -373,  -373,  -373,   170,  -373,   -35,   -30,
-       9,    12,    78,  -373,  -373,   163,   172,   173,   187,   187,
-     187,   187,   -29,   177,   187,  -373,  -373,   188,   193,   196,
-    -373,   -29,   -31,   -29,   195,   201,   153,   -29,   -29,   -29,
-     -29,   -29,   -29,   -29,   221,  -373,  -373,   206,  -373,   205,
-    -373,   -29,   156,   202,  -373,    56,    56,    56,  -373,  -373,
-     190,  -373,   -29,    81,    81,    81,    81,   200,  -373,    81,
-    -373,   112,   288,   161,    26,  -373,   207,   245,  -373,  -373,
-     187,   187,   187,   187,   187,   103,  -373,  -373,   275,  -373,
-     209,  -373,   213,   210,  -373,   212,   216,   219,  -373,   220,
-    -373,  -373,   215,  -373,  -373,  -373,  -373,  -373,  -373,  -373,
-     -29,   288,   228,   288,  -373,  -373,  -373,  -373,  -373,    81,
-      81,    81,    81,    81,  -373,   288,  -373,   211,  -373,  -373,
-    -373,  -373,   -29,   222,   231,  -373,   215,   236,   226,  -373,
-    -373,  -373,  -373,  -373,  -373,  -373,  -373,   246,   288,  -373,
-     149,   318,   153,  -373,  -373,   238,   248,   -29,   -40,   254,
-     252,  -373,  -373,  -373,  -373,  -373,  -373,  -373,  -373,  -373,
-     253,   262,   290,   270,   271,   147,  -373,   -29,  -373,   280,
-    -373,    30,   -18,   -40,   276,   288,  -373,  -373,   149,   258,
-     352,   271,  -373,  -373,    46,   -40,   300,   -40,   282,  -373,
-    -373,  -373,  -373,   284,   286,   285,   286,   308,   295,   317,
-     320,   286,   301,   454,  -373,  -373,   350,  -373,  -373,   213,
-    -373,   307,   322,   327,   326,   -40,  -373,  -373,   -40,   353,
-     -40,   -25,   335,   370,   454,  -373,   339,   338,   343,   -40,
-     357,   361,   454,   354,   352,   -40,   300,   -40,   -40,  -373,
-     366,   356,   360,  -373,  -373,   -40,   308,   342,  -373,   367,
-     454,  -373,   -40,   320,  -373,   360,   271,  -373,  -373,   383,
-    -373,  -373,  -373,  -373,  -373,   -40,   286,  -373,   380,   382,
-    -373,  -373,   389,  -373,  -373,   392,  -373,   398,   364,  -373,
-     396,   -40,   454,  -373,  -373,   271,  -373,  -373,   411,   454,
-     414,   339,   -40,   400,   417,  -373,   391,  -373,   419,   408,
-    -373,   -40,   360,   -40,  -373,   437,   414,   454,  -373,   420,
-     426,   421,   422,   418,  -373,   438,  -373,   454,  -373,   -40,
-     437,  -373,  -373,   439,   360,  -373,  -373,   436,   454,  -373,
-     440,  -373
+     176,   -19,   -19,    64,  -392,   176,  -392,    78,    78,  -392,
+    -392,  -392,    15,  -392,  -392,  -392,   -19,   -19,   193,     1,
+      15,  -392,  -392,  -392,  -392,   217,    46,    46,    46,    36,
+      26,    26,    26,    26,    39,    70,   108,   110,    15,  -392,
+     124,   148,   153,  -392,  -392,  -392,  -392,   160,  -392,  -392,
+     154,   155,   161,  -392,   300,  -392,   282,  -392,  -392,    51,
+    -392,  -392,  -392,  -392,    79,   -34,  -392,  -392,   157,   158,
+     159,  -392,   -11,    36,  -392,    36,    36,    36,    28,   167,
+      33,   -19,   -19,   -19,   -19,    72,   151,   163,   147,   -19,
+    -392,   172,   237,   173,  -392,  -392,  -392,    26,    26,    26,
+      26,   151,    70,  -392,  -392,  -392,  -392,  -392,  -392,  -392,
+    -392,  -392,   168,   -15,  -392,  -392,  -392,  -392,  -392,  -392,
+     177,   269,  -392,  -392,  -392,  -392,  -392,   170,  -392,    14,
+     -36,     2,    23,    36,  -392,  -392,  -392,   178,   175,   184,
+     190,   190,   190,   190,  -392,   -19,   181,   192,   182,   139,
+     -19,   211,   -19,  -392,  -392,   186,   195,   199,  -392,   -19,
+      29,   -19,   198,   197,   161,   -19,   -19,   -19,   -19,   -19,
+     -19,   -19,   218,  -392,  -392,   202,  -392,   203,  -392,   -19,
+     145,   206,  -392,    46,    46,    46,  -392,  -392,    33,  -392,
+     -19,    87,    87,    87,    87,   207,  -392,   211,  -392,   190,
+     190,  -392,   147,   282,   205,   162,  -392,   209,   237,  -392,
+    -392,   190,   190,   190,   190,   190,    88,  -392,  -392,   269,
+    -392,   216,  -392,   225,   215,  -392,   219,   242,   245,  -392,
+     251,  -392,  -392,   212,  -392,  -392,  -392,  -392,  -392,  -392,
+      87,    87,  -392,   -19,   282,   257,   282,  -392,  -392,  -392,
+    -392,  -392,    87,    87,    87,    87,    87,  -392,   282,  -392,
+     253,  -392,  -392,  -392,  -392,   -19,   260,   270,  -392,   212,
+     272,  -392,  -392,   263,  -392,  -392,  -392,  -392,  -392,  -392,
+    -392,  -392,   279,   282,  -392,   355,   313,   161,  -392,  -392,
+     273,   284,   -19,   -33,   285,   277,  -392,  -392,  -392,  -392,
+    -392,  -392,  -392,  -392,  -392,  -392,   276,   286,   304,   293,
+     294,   157,  -392,   -19,  -392,   292,  -392,    81,   -38,   -33,
+     291,   282,  -392,  -392,   355,   250,   367,   294,  -392,  -392,
+      96,   -33,   314,   -33,   296,  -392,  -392,  -392,  -392,   305,
+     311,   309,   311,   346,   333,   347,   351,   311,   329,   463,
+    -392,  -392,   382,  -392,  -392,   225,  -392,   337,   348,   341,
+     352,   -33,  -392,  -392,   -33,   375,   -33,    58,   361,   379,
+     463,  -392,   364,   363,   368,   -33,   391,   377,   463,   380,
+     367,   -33,   314,   -33,   -33,  -392,   390,   383,   385,  -392,
+    -392,   -33,   346,   350,  -392,   389,   463,  -392,   -33,   351,
+    -392,   385,   294,  -392,  -392,   408,  -392,  -392,  -392,  -392,
+    -392,   -33,   311,  -392,   395,   394,  -392,  -392,   405,  -392,
+    -392,   415,  -392,   407,   411,  -392,   421,   -33,   463,  -392,
+    -392,   294,  -392,  -392,   437,   463,   440,   364,   -33,   433,
+     443,  -392,   416,  -392,   445,   423,  -392,   -33,   385,   -33,
+    -392,   449,   440,   463,  -392,   446,   435,   447,   448,   441,
+    -392,   452,  -392,   463,  -392,   -33,   449,  -392,  -392,   453,
+     385,  -392,  -392,   451,   463,  -392,   454,  -392
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const short yypgoto[] =
 {
-    -373,  -373,   485,  -373,  -149,    -1,   -27,   483,   497,     2,
-    -373,  -373,   298,  -373,   371,  -373,    50,  -373,   -51,   239,
-    -373,   -83,   451,   -21,  -373,  -373,   336,  -373,  -373,   -22,
-     410,   321,  -373,    -7,   333,  -373,  -373,  -203,  -373,   -19,
-     263,  -373,  -373,  -373,   416,  -373,  -373,  -373,  -373,  -373,
-    -373,  -373,   323,  -373,   324,  -373,  -373,    24,   261,   496,
-    -373,  -373,   386,  -373,  -373,  -373,  -373,  -373,   214,  -373,
-    -373,   154,  -282,  -373,   104,  -373,  -373,  -181,  -299,  -373,
-     159,  -339,  -373,  -373,    74,  -373,  -292,    90,   144,  -372,
-    -317,  -373,   152,  -373,  -373,  -373,  -373
+    -392,  -392,   511,  -392,  -155,    -1,   -27,   502,   513,    54,
+    -392,  -392,   303,  -392,   384,  -392,   -42,  -392,   -51,   238,
+    -392,   -85,   469,   -21,  -392,  -392,   345,  -392,  -392,   -22,
+     425,   326,  -392,    93,   342,  -392,   442,   334,  -392,  -392,
+    -220,  -392,   -98,   267,  -392,  -392,  -392,   -65,  -392,  -392,
+    -392,  -392,  -392,  -392,  -392,   327,  -392,   325,  -392,  -392,
+      -9,   266,   518,  -392,  -392,   404,  -392,  -392,  -392,  -392,
+    -392,   214,  -392,  -392,   164,  -308,  -392,   102,  -392,  -392,
+    -192,  -313,  -392,   165,  -365,  -392,  -392,    74,  -392,  -318,
+      89,   143,  -391,  -330,  -392,   152,  -392,  -392,  -392,  -392
 };
 
 /* 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 -150
+#define YYTABLE_NINF -157
 static const short yytable[] =
 {
-       7,     8,    78,   111,    73,    76,    77,   199,   152,   350,
-      15,   302,   336,   407,   359,    23,    24,   125,   335,     6,
-     125,   318,    53,   388,    82,    83,    84,   119,   259,   303,
-       1,     2,   119,   341,  -112,   344,  -112,   172,   402,   175,
-      92,   404,   267,   194,   309,   315,   128,   373,   129,   130,
-     131,   316,   374,   126,   317,   127,   126,    16,    17,     9,
-     440,   378,   380,   369,    52,    11,   370,    12,   372,   -16,
-     153,   119,   335,   424,   119,   235,   236,   385,   176,   411,
-     428,   177,   457,   391,   143,   393,   394,   408,    74,   157,
-     158,   159,   160,   399,    57,   337,   338,   113,   445,   170,
-     405,   114,   313,   119,   314,    78,   413,   120,   453,   115,
-     116,   117,   118,   410,   152,   420,   425,     6,   142,   460,
-     184,   185,   186,   298,   320,   189,    57,   119,   323,   423,
-     132,   138,   139,   140,   141,    80,   144,   438,   149,    85,
-     432,   187,   221,    87,   222,   212,   145,   146,   448,   439,
-     193,   441,   196,   215,   216,   217,   200,   201,   202,   203,
-     204,   205,   206,    89,   244,   459,   245,   454,    91,   281,
-     210,   282,   283,   284,   285,    93,   153,   286,   287,   288,
-     289,   239,   240,   241,   242,   243,    94,   170,     1,     2,
-      95,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    54,    36,    57,   211,    37,   107,   224,   225,
-     226,   108,   261,   228,   109,   122,   123,   134,    55,    56,
-     295,    25,    26,    27,    28,    29,   124,   133,   150,   258,
-     163,   164,   156,    36,    57,   233,   179,   180,   171,   120,
-      58,    59,    60,    61,    62,    63,    64,   277,    38,   182,
-     188,   253,    96,    97,    98,    99,   100,   101,   191,   192,
-     197,   190,   151,   262,   263,   264,   265,   266,   198,   207,
-     294,   208,   209,   227,   172,   119,   301,    55,    56,   247,
-     268,   194,   249,   248,   277,   252,   250,   339,   277,   251,
-      55,    56,   260,    57,   270,   272,   311,   274,   275,    58,
-      59,    60,    61,    62,    63,    64,    57,    55,    56,   300,
-     276,   299,    58,    59,    60,    61,    62,    63,    64,   305,
-      55,    56,   306,    57,   165,   166,   307,   308,   322,    58,
-      59,    60,    61,    62,    63,    64,    57,    55,  -149,    -9,
-     309,   312,    58,    59,    60,    61,    62,    63,    64,   319,
-     292,   342,   345,    57,   346,   347,   351,   349,   354,    58,
-      59,    60,    61,    62,    63,    64,   293,   355,   357,   363,
-     360,   365,    58,    59,    60,    61,    62,    63,    64,   324,
-     325,   326,   327,   328,   329,   330,   331,   366,   332,   324,
-     325,   326,   327,   328,   329,   330,   331,   367,   332,   368,
-     376,   371,   381,   383,   384,   386,   401,   324,   325,   326,
-     327,   328,   329,   330,   331,   333,   332,   324,   325,   326,
-     327,   328,   329,   330,   331,   387,   332,   395,   389,   396,
-     397,   403,   409,   377,   421,   324,   325,   326,   327,   328,
-     329,   330,   331,   412,   332,   324,   325,   326,   327,   328,
-     329,   330,   331,   416,   332,   414,   417,   422,   426,   429,
-     435,   419,   433,   324,   325,   326,   327,   328,   329,   330,
-     331,   437,   332,   324,   325,   326,   327,   328,   329,   330,
-     331,   434,   332,   436,   446,   442,   449,   450,   451,   447,
-      10,   324,   325,   326,   327,   328,   329,   330,   331,   458,
-     332,    39,   452,   456,   461,    14,   246,   112,   181,   214,
-     296,   162,   229,   218,    49,   269,   161,   273,   178,   237,
-     392,   238,   321,   390,   455,   431,   444,   406,   400
+       7,     8,    78,   112,    73,    76,    77,   160,   351,   210,
+     423,   334,   366,   404,   352,    23,    24,   375,   126,   318,
+      15,   150,   126,   357,   274,   360,   331,   120,   418,   120,
+       6,   420,   332,   121,   183,   333,   169,   319,   282,   140,
+     141,   142,   143,   192,   193,   194,   129,   157,   130,   131,
+     132,   394,   396,   385,   390,   127,   386,   456,   388,   127,
+     135,   128,   351,   440,     9,   120,    52,   401,    16,    17,
+     444,   161,   184,   407,    53,   409,   410,   120,    74,   473,
+     -16,   136,   427,   415,   146,    57,   120,   180,   461,   424,
+     421,   120,    93,   185,   133,  -119,   429,  -119,   469,    80,
+     178,   240,   241,   426,   205,   436,    78,   114,   199,   476,
+     200,   115,    85,   252,   253,   254,   255,   256,   441,   439,
+     144,     6,   145,   160,    82,    83,    84,   454,   325,   336,
+     448,   389,   314,   339,   116,   117,   118,   119,   464,   455,
+      11,   457,    12,    88,   195,    57,   353,   354,   146,   232,
+     257,   233,   258,   223,   329,   475,   330,   470,   204,    90,
+     207,   226,   227,   228,   211,   212,   213,   214,   215,   216,
+     217,    97,    98,    99,   100,   101,   102,    92,   221,     1,
+       2,   153,   154,   235,   236,   237,    94,   161,     6,   145,
+     165,   166,   167,   168,    57,   222,     1,     2,   178,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      95,    36,   248,   249,    37,    96,   108,   109,    25,    26,
+      27,    28,    29,   110,   149,   276,   123,   124,   125,   134,
+      36,   271,   272,    54,   158,   311,   151,   171,   164,   179,
+     172,   188,   273,   277,   278,   279,   280,   281,   266,    55,
+      56,   121,   187,   190,   159,   196,   198,    38,   197,   144,
+     201,   202,   292,   203,   208,   209,    57,   218,   219,    55,
+      56,   220,    58,    59,    60,    61,    62,    63,    64,   180,
+     246,   238,    55,    56,   205,   310,    57,   260,   120,   261,
+     262,   317,    58,    59,    60,    61,    62,    63,    64,    57,
+     292,    55,    56,   355,   292,    58,    59,    60,    61,    62,
+      63,    64,   327,   263,    55,    56,   264,   265,    57,   173,
+     174,   338,   275,   283,    58,    59,    60,    61,    62,    63,
+      64,    57,    55,   285,   289,   287,   290,    58,    59,    60,
+      61,    62,    63,    64,   291,   308,   316,   315,   322,    57,
+     323,   321,   324,  -156,   328,    58,    59,    60,    61,    62,
+      63,    64,   309,    -9,   325,   335,   358,   361,    58,    59,
+      60,    61,    62,    63,    64,   296,   362,   297,   298,   299,
+     300,   363,   365,   301,   302,   303,   304,   340,   341,   342,
+     343,   344,   345,   346,   347,   367,   348,   370,   371,   376,
+     373,   379,   381,   305,   340,   341,   342,   343,   344,   345,
+     346,   347,   383,   348,   382,   417,   340,   341,   342,   343,
+     344,   345,   346,   347,   387,   348,   384,   392,   397,   399,
+     400,   349,   340,   341,   342,   343,   344,   345,   346,   347,
+     402,   348,   403,   393,   340,   341,   342,   343,   344,   345,
+     346,   347,   411,   348,   419,   405,   413,   412,   425,   428,
+     340,   341,   342,   343,   344,   345,   346,   347,   430,   348,
+     432,   435,   340,   341,   342,   343,   344,   345,   346,   347,
+     433,   348,   437,   438,   442,   445,   451,   453,   340,   341,
+     342,   343,   344,   345,   346,   347,   449,   348,   458,   463,
+     340,   341,   342,   343,   344,   345,   346,   347,   450,   348,
+     452,   462,   467,   465,   466,   474,    10,   468,   472,   477,
+      39,    14,   259,   189,   312,   113,   225,   170,   242,   152,
+     229,   239,   284,   251,   250,   288,    49,   186,   337,   447,
+     471,   460,   422,     0,   416,   406,   408
 };
 
-static const unsigned short yycheck[] =
+static const short yycheck[] =
 {
-       1,     2,    29,    54,    25,    27,    28,   156,    91,   326,
-       5,    51,   311,   385,   331,    16,    17,    33,   310,    48,
-      33,   303,    20,   362,    31,    32,    33,    62,   231,    69,
-       3,     4,    62,   315,    65,   317,    67,    72,   377,    69,
-      38,   380,   245,    74,    69,    63,    73,    72,    75,    76,
-      77,    69,   351,    69,    72,    71,    69,    52,    53,     0,
-     432,   353,   354,   345,    64,    61,   348,    63,   350,    64,
-      91,    62,   364,   412,    62,    49,    50,   359,    69,   396,
-     419,    69,   454,   365,    85,   367,   368,   386,    32,    96,
-      97,    98,    99,   375,    48,    49,    50,    55,   437,   120,
-     382,    59,    72,    62,    74,   132,   398,    66,   447,    54,
-      55,    56,    57,   395,   197,   407,   415,    48,    49,   458,
-     139,   140,   141,   272,   305,   144,    48,    62,   309,   411,
-      65,    81,    82,    83,    84,    72,    86,   429,    88,    72,
-     422,   142,    61,    72,    63,   172,    34,    35,   440,   431,
-     151,   433,   153,   175,   176,   177,   157,   158,   159,   160,
-     161,   162,   163,    50,    61,   457,    63,   449,    66,    20,
-     171,    22,    23,    24,    25,    61,   197,    28,    29,    30,
-      31,   200,   201,   202,   203,   204,    61,   208,     3,     4,
-      61,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    16,    18,    48,    49,    21,    61,   184,   185,
-     186,    61,   233,   189,    61,    68,    68,    27,    32,    33,
-     271,     6,     7,     8,     9,    10,    68,    61,    61,   230,
-      68,    62,    64,    18,    48,    74,    73,    65,    68,    66,
-      54,    55,    56,    57,    58,    59,    60,   268,    63,    62,
-      73,    36,    11,    12,    13,    14,    15,    16,    65,    63,
-      65,    73,    17,   239,   240,   241,   242,   243,    67,    48,
-     271,    65,    67,    73,    72,    62,   277,    32,    33,    70,
-      69,    74,    70,    73,   305,    65,    70,   314,   309,    70,
-      32,    33,    64,    48,    72,    64,   297,    61,    72,    54,
-      55,    56,    57,    58,    59,    60,    48,    32,    33,    61,
-      64,    73,    54,    55,    56,    57,    58,    59,    60,    65,
-      32,    33,    70,    48,    49,    50,    73,    65,    70,    54,
-      55,    56,    57,    58,    59,    60,    48,    32,    48,    69,
-      69,    61,    54,    55,    56,    57,    58,    59,    60,    73,
-      32,    51,    70,    48,    70,    69,    48,    72,    63,    54,
-      55,    56,    57,    58,    59,    60,    48,    50,    48,    19,
-      69,    64,    54,    55,    56,    57,    58,    59,    60,    37,
-      38,    39,    40,    41,    42,    43,    44,    65,    46,    37,
-      38,    39,    40,    41,    42,    43,    44,    70,    46,    73,
-      65,    48,    63,    65,    61,    48,    64,    37,    38,    39,
-      40,    41,    42,    43,    44,    63,    46,    37,    38,    39,
-      40,    41,    42,    43,    44,    64,    46,    61,    74,    73,
-      70,    64,    49,    63,    70,    37,    38,    39,    40,    41,
-      42,    43,    44,    63,    46,    37,    38,    39,    40,    41,
-      42,    43,    44,    64,    46,    73,    64,    61,    47,    45,
-      69,    63,    62,    37,    38,    39,    40,    41,    42,    43,
-      44,    63,    46,    37,    38,    39,    40,    41,    42,    43,
-      44,    64,    46,    64,    64,    48,    65,    65,    70,    63,
-       5,    37,    38,    39,    40,    41,    42,    43,    44,    63,
-      46,    18,    64,    64,    64,     8,   208,    56,   137,   173,
-     271,   101,   191,   180,    18,   252,   100,   256,   132,   196,
-     366,   197,   308,   364,   450,   421,   436,   383,   376
+       1,     2,    29,    54,    25,    27,    28,    92,   326,   164,
+     401,   319,   342,   378,   327,    16,    17,   347,    33,    52,
+       5,    86,    33,   331,   244,   333,    64,    63,   393,    63,
+      49,   396,    70,    67,    70,    73,   101,    70,   258,    81,
+      82,    83,    84,   141,   142,   143,    73,    89,    75,    76,
+      77,   369,   370,   361,   367,    70,   364,   448,   366,    70,
+      27,    72,   380,   428,     0,    63,    65,   375,    53,    54,
+     435,    92,    70,   381,    20,   383,   384,    63,    32,   470,
+      65,    48,   412,   391,    85,    49,    63,    73,   453,   402,
+     398,    63,    38,    70,    66,    66,   414,    68,   463,    73,
+     121,   199,   200,   411,    75,   423,   133,    56,   150,   474,
+     152,    60,    73,   211,   212,   213,   214,   215,   431,   427,
+      48,    49,    50,   208,    31,    32,    33,   445,    70,   321,
+     438,    73,   287,   325,    55,    56,    57,    58,   456,   447,
+      62,   449,    64,    73,   145,    49,    50,    51,   149,    62,
+      62,    64,    64,   180,    73,   473,    75,   465,   159,    51,
+     161,   183,   184,   185,   165,   166,   167,   168,   169,   170,
+     171,    11,    12,    13,    14,    15,    16,    67,   179,     3,
+       4,    34,    35,   192,   193,   194,    62,   208,    49,    50,
+      97,    98,    99,   100,    49,    50,     3,     4,   219,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      62,    18,    50,    51,    21,    62,    62,    62,     6,     7,
+       8,     9,    10,    62,    73,   246,    69,    69,    69,    62,
+      18,   240,   241,    16,    62,   286,    73,    69,    65,    69,
+      63,    66,   243,   252,   253,   254,   255,   256,    36,    32,
+      33,    67,    74,    63,    17,    74,    74,    64,    66,    48,
+      74,    66,   283,    64,    66,    68,    49,    49,    66,    32,
+      33,    68,    55,    56,    57,    58,    59,    60,    61,    73,
+      75,    74,    32,    33,    75,   286,    49,    71,    63,    74,
+      71,   292,    55,    56,    57,    58,    59,    60,    61,    49,
+     321,    32,    33,   330,   325,    55,    56,    57,    58,    59,
+      60,    61,   313,    71,    32,    33,    71,    66,    49,    50,
+      51,    71,    65,    70,    55,    56,    57,    58,    59,    60,
+      61,    49,    32,    73,    62,    65,    73,    55,    56,    57,
+      58,    59,    60,    61,    65,    32,    62,    74,    71,    49,
+      74,    66,    66,    49,    62,    55,    56,    57,    58,    59,
+      60,    61,    49,    70,    70,    74,    52,    71,    55,    56,
+      57,    58,    59,    60,    61,    20,    71,    22,    23,    24,
+      25,    70,    73,    28,    29,    30,    31,    37,    38,    39,
+      40,    41,    42,    43,    44,    49,    46,    64,    51,    70,
+      49,    19,    65,    48,    37,    38,    39,    40,    41,    42,
+      43,    44,    71,    46,    66,    65,    37,    38,    39,    40,
+      41,    42,    43,    44,    49,    46,    74,    66,    64,    66,
+      62,    64,    37,    38,    39,    40,    41,    42,    43,    44,
+      49,    46,    65,    64,    37,    38,    39,    40,    41,    42,
+      43,    44,    62,    46,    65,    75,    71,    74,    50,    64,
+      37,    38,    39,    40,    41,    42,    43,    44,    74,    46,
+      65,    64,    37,    38,    39,    40,    41,    42,    43,    44,
+      65,    46,    71,    62,    47,    45,    70,    64,    37,    38,
+      39,    40,    41,    42,    43,    44,    63,    46,    49,    64,
+      37,    38,    39,    40,    41,    42,    43,    44,    65,    46,
+      65,    65,    71,    66,    66,    64,     5,    65,    65,    65,
+      18,     8,   219,   139,   286,    56,   181,   102,   202,    87,
+     188,   197,   265,   208,   207,   269,    18,   133,   324,   437,
+     466,   452,   399,    -1,   392,   380,   382
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,     3,     4,    76,    77,    82,    48,    80,    80,     0,
-      77,    61,    63,    83,    83,     5,    52,    53,    78,    84,
-      85,   170,   171,    80,    80,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    18,    21,    63,    82,
-     102,   103,   113,   116,   117,   118,   120,   130,   131,   134,
-     135,   136,    64,    84,    16,    32,    33,    48,    54,    55,
-      56,    57,    58,    59,    60,    81,    90,    92,    93,    94,
-      95,    96,    97,    98,    32,   104,   104,   104,    81,   137,
-      72,   108,   108,   108,   108,    72,   119,    72,   105,    50,
-     138,    66,    84,    61,    61,    61,    11,    12,    13,    14,
-      15,    16,   121,   122,   123,   124,   125,    61,    61,    61,
-      79,    93,    97,    55,    59,    54,    55,    56,    57,    62,
-      66,    89,    68,    68,    68,    33,    69,    71,    81,    81,
-      81,    81,    65,    61,    27,   109,   110,    80,    91,    91,
-      91,    91,    49,    80,    91,    34,    35,   106,   107,    91,
-      61,    17,    96,    98,   128,   129,    64,   108,   108,   108,
-     108,   119,   105,    68,    62,    49,    50,    86,    87,    88,
-      98,    68,    72,   100,   101,    69,    69,    69,   137,    73,
-      65,    89,    62,   114,   114,   114,   114,    80,    73,   114,
-      73,    65,    63,    80,    74,   127,    80,    65,    67,    79,
-      80,    80,    80,    80,    80,    80,    80,    48,    65,    67,
-      80,    49,    81,    99,   101,   104,   104,   104,   109,    91,
-     115,    61,    63,   132,   132,   132,   132,    73,   132,   106,
-      98,   111,   112,    74,   126,    49,    50,   127,   129,   114,
-     114,   114,   114,   114,    61,    63,    87,    70,    73,    70,
-      70,    70,    65,    36,   133,   134,   139,   140,    80,   112,
-      64,    98,   132,   132,   132,   132,   132,   112,    69,   115,
-      72,   142,    64,   133,    61,    72,    64,    98,   148,   151,
-     152,    20,    22,    23,    24,    25,    28,    29,    30,    31,
-     143,   144,    32,    48,    80,    93,    94,   141,    79,    73,
-      61,    80,    51,    69,   147,    65,    70,    73,    65,    69,
-     153,    80,    61,    72,    74,    63,    69,    72,   147,    73,
-     152,   143,    70,   152,    37,    38,    39,    40,    41,    42,
-      43,    44,    46,    63,   155,   161,   153,    49,    50,    81,
-     145,   147,    51,   146,   147,    70,    70,    69,   165,    72,
-     165,    48,   166,   167,    63,    50,   160,    48,   163,   165,
-      69,   156,   161,    19,   154,    64,    65,    70,    73,   147,
-     147,    48,   147,    72,   153,   168,    65,    63,   161,   157,
-     161,    63,   149,    65,    61,   147,    48,    64,   156,    74,
-     155,   147,   146,   147,   147,    61,    73,    70,   164,   147,
-     167,    64,   156,    64,   156,   147,   163,   164,   153,    49,
-     147,   165,    63,   161,    73,   169,    64,    64,   150,    63,
-     161,    70,    61,   147,   156,   153,    47,   158,   156,    45,
-     162,   149,   147,    62,    64,    69,    64,    63,   161,   147,
-     164,   147,    48,   159,   162,   156,    64,    63,   161,    65,
-      65,    70,    64,   156,   147,   159,    64,   164,    63,   161,
-     156,    64
+       0,     3,     4,    77,    78,    83,    49,    81,    81,     0,
+      78,    62,    64,    84,    84,     5,    53,    54,    79,    85,
+      86,   174,   175,    81,    81,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    18,    21,    64,    83,
+     103,   104,   117,   120,   121,   122,   124,   134,   135,   138,
+     139,   140,    65,    85,    16,    32,    33,    49,    55,    56,
+      57,    58,    59,    60,    61,    82,    91,    93,    94,    95,
+      96,    97,    98,    99,    32,   105,   105,   105,    82,   141,
+      73,   109,   109,   109,   109,    73,   112,   123,    73,   106,
+      51,   142,    67,    85,    62,    62,    62,    11,    12,    13,
+      14,    15,    16,   125,   126,   127,   128,   129,    62,    62,
+      62,    80,    94,    98,    56,    60,    55,    56,    57,    58,
+      63,    67,    90,    69,    69,    69,    33,    70,    72,    82,
+      82,    82,    82,    66,    62,    27,    48,   110,   114,    81,
+      92,    92,    92,    92,    48,    50,    81,   111,   113,    73,
+     123,    73,   112,    34,    35,   107,   108,    92,    62,    17,
+      97,    99,   132,   133,    65,   109,   109,   109,   109,   123,
+     106,    69,    63,    50,    51,    87,    88,    89,    99,    69,
+      73,   101,   102,    70,    70,    70,   141,    74,    66,    90,
+      63,   118,   118,   118,   118,    81,    74,    66,    74,    92,
+      92,    74,    66,    64,    81,    75,   131,    81,    66,    68,
+      80,    81,    81,    81,    81,    81,    81,    81,    49,    66,
+      68,    81,    50,    82,   100,   102,   105,   105,   105,   110,
+      92,   119,    62,    64,   136,   136,   136,   136,    74,   113,
+     118,   118,   107,    99,   115,   116,    75,   130,    50,    51,
+     131,   133,   118,   118,   118,   118,   118,    62,    64,    88,
+      71,    74,    71,    71,    71,    66,    36,   137,   138,   143,
+     144,   136,   136,    81,   116,    65,    99,   136,   136,   136,
+     136,   136,   116,    70,   119,    73,   146,    65,   137,    62,
+      73,    65,    99,   152,   155,   156,    20,    22,    23,    24,
+      25,    28,    29,    30,    31,    48,   147,   148,    32,    49,
+      81,    94,    95,   145,    80,    74,    62,    81,    52,    70,
+     151,    66,    71,    74,    66,    70,   157,    81,    62,    73,
+      75,    64,    70,    73,   151,    74,   156,   147,    71,   156,
+      37,    38,    39,    40,    41,    42,    43,    44,    46,    64,
+     159,   165,   157,    50,    51,    82,   149,   151,    52,   150,
+     151,    71,    71,    70,   169,    73,   169,    49,   170,   171,
+      64,    51,   164,    49,   167,   169,    70,   160,   165,    19,
+     158,    65,    66,    71,    74,   151,   151,    49,   151,    73,
+     157,   172,    66,    64,   165,   161,   165,    64,   153,    66,
+      62,   151,    49,    65,   160,    75,   159,   151,   150,   151,
+     151,    62,    74,    71,   168,   151,   171,    65,   160,    65,
+     160,   151,   167,   168,   157,    50,   151,   169,    64,   165,
+      74,   173,    65,    65,   154,    64,   165,    71,    62,   151,
+     160,   157,    47,   162,   160,    45,   166,   153,   151,    63,
+      65,    70,    65,    64,   165,   151,   168,   151,    49,   163,
+     166,   160,    65,    64,   165,    66,    66,    71,    65,   160,
+     151,   163,    65,   168,    64,   165,   160,    65
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -1584,54 +1596,54 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 131 "xi-grammar.y"
+#line 133 "xi-grammar.y"
     { yyval.modlist = yyvsp[0].modlist; modlist = yyvsp[0].modlist; }
     break;
 
   case 3:
-#line 135 "xi-grammar.y"
+#line 137 "xi-grammar.y"
     { 
                  yyval.modlist = 0; 
                }
     break;
 
   case 4:
-#line 139 "xi-grammar.y"
+#line 141 "xi-grammar.y"
     { yyval.modlist = new ModuleList(lineno, yyvsp[-1].module, yyvsp[0].modlist); }
     break;
 
   case 5:
-#line 143 "xi-grammar.y"
+#line 145 "xi-grammar.y"
     { yyval.intval = 0; }
     break;
 
   case 6:
-#line 145 "xi-grammar.y"
+#line 147 "xi-grammar.y"
     { yyval.intval = 1; }
     break;
 
   case 7:
-#line 149 "xi-grammar.y"
+#line 151 "xi-grammar.y"
     { yyval.intval = 0; }
     break;
 
   case 8:
-#line 151 "xi-grammar.y"
+#line 153 "xi-grammar.y"
     { yyval.intval = 1; }
     break;
 
   case 9:
-#line 155 "xi-grammar.y"
+#line 157 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
   case 10:
-#line 159 "xi-grammar.y"
+#line 161 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
   case 11:
-#line 161 "xi-grammar.y"
+#line 163 "xi-grammar.y"
     {
                  char *tmp = new char[strlen(yyvsp[-3].strval)+strlen(yyvsp[0].strval)+3];
                  sprintf(tmp,"%s::%s", yyvsp[-3].strval, yyvsp[0].strval);
@@ -1640,14 +1652,14 @@ yyreduce:
     break;
 
   case 12:
-#line 169 "xi-grammar.y"
+#line 171 "xi-grammar.y"
     { 
                    yyval.module = new Module(lineno, yyvsp[-1].strval, yyvsp[0].conslist); 
                }
     break;
 
   case 13:
-#line 173 "xi-grammar.y"
+#line 175 "xi-grammar.y"
     {  
                    yyval.module = new Module(lineno, yyvsp[-1].strval, yyvsp[0].conslist); 
                    yyval.module->setMain();
@@ -1655,322 +1667,322 @@ yyreduce:
     break;
 
   case 14:
-#line 180 "xi-grammar.y"
+#line 182 "xi-grammar.y"
     { yyval.conslist = 0; }
     break;
 
   case 15:
-#line 182 "xi-grammar.y"
+#line 184 "xi-grammar.y"
     { yyval.conslist = yyvsp[-2].conslist; }
     break;
 
   case 16:
-#line 186 "xi-grammar.y"
+#line 188 "xi-grammar.y"
     { yyval.conslist = 0; }
     break;
 
   case 17:
-#line 188 "xi-grammar.y"
+#line 190 "xi-grammar.y"
     { yyval.conslist = new ConstructList(lineno, yyvsp[-1].construct, yyvsp[0].conslist); }
     break;
 
   case 18:
-#line 192 "xi-grammar.y"
+#line 194 "xi-grammar.y"
     { if(yyvsp[-2].conslist) yyvsp[-2].conslist->setExtern(yyvsp[-4].intval); yyval.construct = yyvsp[-2].conslist; }
     break;
 
   case 19:
-#line 194 "xi-grammar.y"
+#line 196 "xi-grammar.y"
     { yyvsp[0].module->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].module; }
     break;
 
   case 20:
-#line 196 "xi-grammar.y"
+#line 198 "xi-grammar.y"
     { yyvsp[0].member->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].member; }
     break;
 
   case 21:
-#line 198 "xi-grammar.y"
+#line 200 "xi-grammar.y"
     { yyvsp[-1].message->setExtern(yyvsp[-2].intval); yyval.construct = yyvsp[-1].message; }
     break;
 
   case 22:
-#line 200 "xi-grammar.y"
+#line 202 "xi-grammar.y"
     { yyvsp[0].chare->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].chare; }
     break;
 
   case 23:
-#line 202 "xi-grammar.y"
+#line 204 "xi-grammar.y"
     { yyvsp[0].chare->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].chare; }
     break;
 
   case 24:
-#line 204 "xi-grammar.y"
+#line 206 "xi-grammar.y"
     { yyvsp[0].chare->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].chare; }
     break;
 
   case 25:
-#line 206 "xi-grammar.y"
+#line 208 "xi-grammar.y"
     { yyvsp[0].chare->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].chare; }
     break;
 
   case 26:
-#line 208 "xi-grammar.y"
+#line 210 "xi-grammar.y"
     { yyvsp[0].templat->setExtern(yyvsp[-1].intval); yyval.construct = yyvsp[0].templat; }
     break;
 
   case 27:
-#line 210 "xi-grammar.y"
+#line 212 "xi-grammar.y"
     { yyval.construct = NULL; }
     break;
 
   case 28:
-#line 212 "xi-grammar.y"
+#line 214 "xi-grammar.y"
     { yyval.construct = NULL; }
     break;
 
   case 29:
-#line 216 "xi-grammar.y"
+#line 218 "xi-grammar.y"
     { yyval.tparam = new TParamType(yyvsp[0].type); }
     break;
 
   case 30:
-#line 218 "xi-grammar.y"
+#line 220 "xi-grammar.y"
     { yyval.tparam = new TParamVal(yyvsp[0].strval); }
     break;
 
   case 31:
-#line 220 "xi-grammar.y"
+#line 222 "xi-grammar.y"
     { yyval.tparam = new TParamVal(yyvsp[0].strval); }
     break;
 
   case 32:
-#line 224 "xi-grammar.y"
+#line 226 "xi-grammar.y"
     { yyval.tparlist = new TParamList(yyvsp[0].tparam); }
     break;
 
   case 33:
-#line 226 "xi-grammar.y"
+#line 228 "xi-grammar.y"
     { yyval.tparlist = new TParamList(yyvsp[-2].tparam, yyvsp[0].tparlist); }
     break;
 
   case 34:
-#line 230 "xi-grammar.y"
+#line 232 "xi-grammar.y"
     { yyval.tparlist = 0; }
     break;
 
   case 35:
-#line 232 "xi-grammar.y"
+#line 234 "xi-grammar.y"
     { yyval.tparlist = yyvsp[0].tparlist; }
     break;
 
   case 36:
-#line 236 "xi-grammar.y"
+#line 238 "xi-grammar.y"
     { yyval.tparlist = 0; }
     break;
 
   case 37:
-#line 238 "xi-grammar.y"
+#line 240 "xi-grammar.y"
     { yyval.tparlist = yyvsp[-1].tparlist; }
     break;
 
   case 38:
-#line 242 "xi-grammar.y"
+#line 244 "xi-grammar.y"
     { yyval.type = new BuiltinType("int"); }
     break;
 
   case 39:
-#line 244 "xi-grammar.y"
+#line 246 "xi-grammar.y"
     { yyval.type = new BuiltinType("long"); }
     break;
 
   case 40:
-#line 246 "xi-grammar.y"
+#line 248 "xi-grammar.y"
     { yyval.type = new BuiltinType("short"); }
     break;
 
   case 41:
-#line 248 "xi-grammar.y"
+#line 250 "xi-grammar.y"
     { yyval.type = new BuiltinType("char"); }
     break;
 
   case 42:
-#line 250 "xi-grammar.y"
+#line 252 "xi-grammar.y"
     { yyval.type = new BuiltinType("unsigned int"); }
     break;
 
   case 43:
-#line 252 "xi-grammar.y"
+#line 254 "xi-grammar.y"
     { yyval.type = new BuiltinType("unsigned long"); }
     break;
 
   case 44:
-#line 254 "xi-grammar.y"
+#line 256 "xi-grammar.y"
     { yyval.type = new BuiltinType("unsigned short"); }
     break;
 
   case 45:
-#line 256 "xi-grammar.y"
+#line 258 "xi-grammar.y"
     { yyval.type = new BuiltinType("unsigned char"); }
     break;
 
   case 46:
-#line 258 "xi-grammar.y"
+#line 260 "xi-grammar.y"
     { yyval.type = new BuiltinType("long long"); }
     break;
 
   case 47:
-#line 260 "xi-grammar.y"
+#line 262 "xi-grammar.y"
     { yyval.type = new BuiltinType("float"); }
     break;
 
   case 48:
-#line 262 "xi-grammar.y"
+#line 264 "xi-grammar.y"
     { yyval.type = new BuiltinType("double"); }
     break;
 
   case 49:
-#line 264 "xi-grammar.y"
+#line 266 "xi-grammar.y"
     { yyval.type = new BuiltinType("long double"); }
     break;
 
   case 50:
-#line 266 "xi-grammar.y"
+#line 268 "xi-grammar.y"
     { yyval.type = new BuiltinType("void"); }
     break;
 
   case 51:
-#line 269 "xi-grammar.y"
+#line 271 "xi-grammar.y"
     { yyval.ntype = new NamedType(yyvsp[-1].strval,yyvsp[0].tparlist); }
     break;
 
   case 52:
-#line 270 "xi-grammar.y"
+#line 272 "xi-grammar.y"
     { yyval.ntype = new NamedType(yyvsp[-1].strval,yyvsp[0].tparlist); }
     break;
 
   case 53:
-#line 273 "xi-grammar.y"
+#line 275 "xi-grammar.y"
     { yyval.type = yyvsp[0].type; }
     break;
 
   case 54:
-#line 275 "xi-grammar.y"
+#line 277 "xi-grammar.y"
     { yyval.type = yyvsp[0].ntype; }
     break;
 
   case 55:
-#line 279 "xi-grammar.y"
+#line 281 "xi-grammar.y"
     { yyval.ptype = new PtrType(yyvsp[-1].type); }
     break;
 
   case 56:
-#line 283 "xi-grammar.y"
+#line 285 "xi-grammar.y"
     { yyvsp[-1].ptype->indirect(); yyval.ptype = yyvsp[-1].ptype; }
     break;
 
   case 57:
-#line 285 "xi-grammar.y"
+#line 287 "xi-grammar.y"
     { yyvsp[-1].ptype->indirect(); yyval.ptype = yyvsp[-1].ptype; }
     break;
 
   case 58:
-#line 289 "xi-grammar.y"
+#line 291 "xi-grammar.y"
     { yyval.ftype = new FuncType(yyvsp[-7].type, yyvsp[-4].strval, yyvsp[-1].plist); }
     break;
 
   case 59:
-#line 293 "xi-grammar.y"
+#line 295 "xi-grammar.y"
     { yyval.type = yyvsp[0].type; }
     break;
 
   case 60:
-#line 295 "xi-grammar.y"
+#line 297 "xi-grammar.y"
     { yyval.type = yyvsp[0].ptype; }
     break;
 
   case 61:
-#line 297 "xi-grammar.y"
+#line 299 "xi-grammar.y"
     { yyval.type = yyvsp[0].ptype; }
     break;
 
   case 62:
-#line 299 "xi-grammar.y"
+#line 301 "xi-grammar.y"
     { yyval.type = yyvsp[0].ftype; }
     break;
 
   case 63:
-#line 302 "xi-grammar.y"
+#line 304 "xi-grammar.y"
     { yyval.type = yyvsp[0].type; }
     break;
 
   case 64:
-#line 304 "xi-grammar.y"
+#line 306 "xi-grammar.y"
     { yyval.type = yyvsp[-1].type; }
     break;
 
   case 65:
-#line 308 "xi-grammar.y"
+#line 310 "xi-grammar.y"
     { yyval.type = new ReferenceType(yyvsp[-1].type); }
     break;
 
   case 66:
-#line 310 "xi-grammar.y"
+#line 312 "xi-grammar.y"
     { yyval.type = yyvsp[0].type; }
     break;
 
   case 67:
-#line 314 "xi-grammar.y"
+#line 316 "xi-grammar.y"
     { yyval.val = new Value(yyvsp[0].strval); }
     break;
 
   case 68:
-#line 316 "xi-grammar.y"
+#line 318 "xi-grammar.y"
     { yyval.val = new Value(yyvsp[0].strval); }
     break;
 
   case 69:
-#line 320 "xi-grammar.y"
+#line 322 "xi-grammar.y"
     { yyval.val = yyvsp[-1].val; }
     break;
 
   case 70:
-#line 324 "xi-grammar.y"
+#line 326 "xi-grammar.y"
     { yyval.vallist = 0; }
     break;
 
   case 71:
-#line 326 "xi-grammar.y"
+#line 328 "xi-grammar.y"
     { yyval.vallist = new ValueList(yyvsp[-1].val, yyvsp[0].vallist); }
     break;
 
   case 72:
-#line 330 "xi-grammar.y"
+#line 332 "xi-grammar.y"
     { yyval.readonly = new Readonly(lineno, yyvsp[-2].type, yyvsp[-1].strval, yyvsp[0].vallist); }
     break;
 
   case 73:
-#line 334 "xi-grammar.y"
+#line 336 "xi-grammar.y"
     { yyval.readonly = new Readonly(lineno, yyvsp[-2].type, yyvsp[0].strval, 0, 1); }
     break;
 
   case 74:
-#line 338 "xi-grammar.y"
+#line 340 "xi-grammar.y"
     { yyval.intval = 0;}
     break;
 
   case 75:
-#line 340 "xi-grammar.y"
+#line 342 "xi-grammar.y"
     { yyval.intval = 0;}
     break;
 
   case 76:
-#line 344 "xi-grammar.y"
+#line 346 "xi-grammar.y"
     { yyval.intval = 0; }
     break;
 
   case 77:
-#line 346 "xi-grammar.y"
+#line 348 "xi-grammar.y"
     { 
                  /*
                  printf("Warning: Message attributes are being phased out.\n");
@@ -1981,117 +1993,147 @@ yyreduce:
     break;
 
   case 78:
-#line 356 "xi-grammar.y"
+#line 358 "xi-grammar.y"
     { yyval.intval = yyvsp[0].intval; }
     break;
 
   case 79:
-#line 358 "xi-grammar.y"
+#line 360 "xi-grammar.y"
     { yyval.intval = yyvsp[-2].intval | yyvsp[0].intval; }
     break;
 
   case 80:
-#line 362 "xi-grammar.y"
+#line 364 "xi-grammar.y"
     { yyval.intval = 0; }
     break;
 
   case 81:
-#line 364 "xi-grammar.y"
+#line 366 "xi-grammar.y"
     { yyval.intval = 0; }
     break;
 
   case 82:
-#line 368 "xi-grammar.y"
+#line 370 "xi-grammar.y"
     { yyval.cattr = 0; }
     break;
 
   case 83:
-#line 370 "xi-grammar.y"
+#line 372 "xi-grammar.y"
     { yyval.cattr = yyvsp[-1].cattr; }
     break;
 
   case 84:
-#line 374 "xi-grammar.y"
+#line 376 "xi-grammar.y"
     { yyval.cattr = yyvsp[0].cattr; }
     break;
 
   case 85:
-#line 376 "xi-grammar.y"
+#line 378 "xi-grammar.y"
     { yyval.cattr = yyvsp[-2].cattr | yyvsp[0].cattr; }
     break;
 
   case 86:
-#line 380 "xi-grammar.y"
-    { yyval.cattr = Chare::CMIGRATABLE; }
+#line 382 "xi-grammar.y"
+    { yyval.cattr = Chare::CPYTHON; }
     break;
 
   case 87:
-#line 384 "xi-grammar.y"
-    { yyval.mv = new MsgVar(yyvsp[-4].type, yyvsp[-3].strval); }
+#line 386 "xi-grammar.y"
+    { yyval.cattr = 0; }
     break;
 
   case 88:
 #line 388 "xi-grammar.y"
-    { yyval.mvlist = new MsgVarList(yyvsp[0].mv); }
+    { yyval.cattr = yyvsp[-1].cattr; }
     break;
 
   case 89:
-#line 390 "xi-grammar.y"
-    { yyval.mvlist = new MsgVarList(yyvsp[-1].mv, yyvsp[0].mvlist); }
+#line 392 "xi-grammar.y"
+    { yyval.cattr = yyvsp[0].cattr; }
     break;
 
   case 90:
 #line 394 "xi-grammar.y"
-    { yyval.message = new Message(lineno, yyvsp[0].ntype); }
+    { yyval.cattr = yyvsp[-2].cattr | yyvsp[0].cattr; }
     break;
 
   case 91:
-#line 396 "xi-grammar.y"
-    { yyval.message = new Message(lineno, yyvsp[-3].ntype, yyvsp[-1].mvlist); }
+#line 398 "xi-grammar.y"
+    { yyval.cattr = Chare::CMIGRATABLE; }
     break;
 
   case 92:
 #line 400 "xi-grammar.y"
-    { yyval.typelist = 0; }
+    { yyval.cattr = Chare::CPYTHON; }
     break;
 
   case 93:
-#line 402 "xi-grammar.y"
-    { yyval.typelist = yyvsp[0].typelist; }
+#line 404 "xi-grammar.y"
+    { yyval.mv = new MsgVar(yyvsp[-4].type, yyvsp[-3].strval); }
     break;
 
   case 94:
-#line 406 "xi-grammar.y"
-    { yyval.typelist = new TypeList(yyvsp[0].ntype); }
+#line 408 "xi-grammar.y"
+    { yyval.mvlist = new MsgVarList(yyvsp[0].mv); }
     break;
 
   case 95:
-#line 408 "xi-grammar.y"
-    { yyval.typelist = new TypeList(yyvsp[-2].ntype, yyvsp[0].typelist); }
+#line 410 "xi-grammar.y"
+    { yyval.mvlist = new MsgVarList(yyvsp[-1].mv, yyvsp[0].mvlist); }
     break;
 
   case 96:
-#line 412 "xi-grammar.y"
-    { yyval.chare = new Chare(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+#line 414 "xi-grammar.y"
+    { yyval.message = new Message(lineno, yyvsp[0].ntype); }
     break;
 
   case 97:
-#line 414 "xi-grammar.y"
-    { yyval.chare = new MainChare(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+#line 416 "xi-grammar.y"
+    { yyval.message = new Message(lineno, yyvsp[-3].ntype, yyvsp[-1].mvlist); }
     break;
 
   case 98:
-#line 418 "xi-grammar.y"
-    { yyval.chare = new Group(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+#line 420 "xi-grammar.y"
+    { yyval.typelist = 0; }
     break;
 
   case 99:
 #line 422 "xi-grammar.y"
-    { yyval.chare = new NodeGroup(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+    { yyval.typelist = yyvsp[0].typelist; }
     break;
 
   case 100:
 #line 426 "xi-grammar.y"
+    { yyval.typelist = new TypeList(yyvsp[0].ntype); }
+    break;
+
+  case 101:
+#line 428 "xi-grammar.y"
+    { yyval.typelist = new TypeList(yyvsp[-2].ntype, yyvsp[0].typelist); }
+    break;
+
+  case 102:
+#line 432 "xi-grammar.y"
+    { yyval.chare = new Chare(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+    break;
+
+  case 103:
+#line 434 "xi-grammar.y"
+    { yyval.chare = new MainChare(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+    break;
+
+  case 104:
+#line 438 "xi-grammar.y"
+    { yyval.chare = new Group(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+    break;
+
+  case 105:
+#line 442 "xi-grammar.y"
+    { yyval.chare = new NodeGroup(lineno, yyvsp[-3].cattr, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+    break;
+
+  case 106:
+#line 446 "xi-grammar.y"
     {/*Stupid special case for [1D] indices*/
                        char *buf=new char[40];
                        sprintf(buf,"%sD",yyvsp[-2].strval);
@@ -2099,143 +2141,148 @@ yyreduce:
                }
     break;
 
-  case 101:
-#line 432 "xi-grammar.y"
+  case 107:
+#line 452 "xi-grammar.y"
     { yyval.ntype = new NamedType(yyvsp[-1].strval); }
     break;
 
-  case 102:
-#line 436 "xi-grammar.y"
-    {  yyval.chare = new Array(lineno, 0, yyvsp[-3].ntype, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+  case 108:
+#line 456 "xi-grammar.y"
+    {  yyval.chare = new Array(lineno, yyvsp[-4].cattr, yyvsp[-3].ntype, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
     break;
 
-  case 103:
-#line 440 "xi-grammar.y"
+  case 109:
+#line 458 "xi-grammar.y"
+    {  yyval.chare = new Array(lineno, yyvsp[-3].cattr, yyvsp[-4].ntype, yyvsp[-2].ntype, yyvsp[-1].typelist, yyvsp[0].mbrlist); }
+    break;
+
+  case 110:
+#line 462 "xi-grammar.y"
     { yyval.chare = new Chare(lineno, yyvsp[-3].cattr, new NamedType(yyvsp[-2].strval), yyvsp[-1].typelist, yyvsp[0].mbrlist);}
     break;
 
-  case 104:
-#line 442 "xi-grammar.y"
+  case 111:
+#line 464 "xi-grammar.y"
     { yyval.chare = new MainChare(lineno, yyvsp[-3].cattr, new NamedType(yyvsp[-2].strval), yyvsp[-1].typelist, yyvsp[0].mbrlist); }
     break;
 
-  case 105:
-#line 446 "xi-grammar.y"
+  case 112:
+#line 468 "xi-grammar.y"
     { yyval.chare = new Group(lineno, yyvsp[-3].cattr, new NamedType(yyvsp[-2].strval), yyvsp[-1].typelist, yyvsp[0].mbrlist); }
     break;
 
-  case 106:
-#line 450 "xi-grammar.y"
+  case 113:
+#line 472 "xi-grammar.y"
     { yyval.chare = new NodeGroup( lineno, yyvsp[-3].cattr, new NamedType(yyvsp[-2].strval), yyvsp[-1].typelist, yyvsp[0].mbrlist); }
     break;
 
-  case 107:
-#line 454 "xi-grammar.y"
+  case 114:
+#line 476 "xi-grammar.y"
     { yyval.chare = new Array( lineno, 0, yyvsp[-3].ntype, new NamedType(yyvsp[-2].strval), yyvsp[-1].typelist, yyvsp[0].mbrlist); }
     break;
 
-  case 108:
-#line 458 "xi-grammar.y"
+  case 115:
+#line 480 "xi-grammar.y"
     { yyval.message = new Message(lineno, new NamedType(yyvsp[-1].strval)); }
     break;
 
-  case 109:
-#line 460 "xi-grammar.y"
+  case 116:
+#line 482 "xi-grammar.y"
     { yyval.message = new Message(lineno, new NamedType(yyvsp[-4].strval), yyvsp[-2].mvlist); }
     break;
 
-  case 110:
-#line 464 "xi-grammar.y"
+  case 117:
+#line 486 "xi-grammar.y"
     { yyval.type = 0; }
     break;
 
-  case 111:
-#line 466 "xi-grammar.y"
+  case 118:
+#line 488 "xi-grammar.y"
     { yyval.type = yyvsp[0].type; }
     break;
 
-  case 112:
-#line 470 "xi-grammar.y"
+  case 119:
+#line 492 "xi-grammar.y"
     { yyval.strval = 0; }
     break;
 
-  case 113:
-#line 472 "xi-grammar.y"
+  case 120:
+#line 494 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
-  case 114:
-#line 474 "xi-grammar.y"
+  case 121:
+#line 496 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
-  case 115:
-#line 478 "xi-grammar.y"
+  case 122:
+#line 500 "xi-grammar.y"
     { yyval.tvar = new TType(new NamedType(yyvsp[-1].strval), yyvsp[0].type); }
     break;
 
-  case 116:
-#line 480 "xi-grammar.y"
+  case 123:
+#line 502 "xi-grammar.y"
     { yyval.tvar = new TFunc(yyvsp[-1].ftype, yyvsp[0].strval); }
     break;
 
-  case 117:
-#line 482 "xi-grammar.y"
+  case 124:
+#line 504 "xi-grammar.y"
     { yyval.tvar = new TName(yyvsp[-2].type, yyvsp[-1].strval, yyvsp[0].strval); }
     break;
 
-  case 118:
-#line 486 "xi-grammar.y"
+  case 125:
+#line 508 "xi-grammar.y"
     { yyval.tvarlist = new TVarList(yyvsp[0].tvar); }
     break;
 
-  case 119:
-#line 488 "xi-grammar.y"
+  case 126:
+#line 510 "xi-grammar.y"
     { yyval.tvarlist = new TVarList(yyvsp[-2].tvar, yyvsp[0].tvarlist); }
     break;
 
-  case 120:
-#line 492 "xi-grammar.y"
+  case 127:
+#line 514 "xi-grammar.y"
     { yyval.tvarlist = yyvsp[-1].tvarlist; }
     break;
 
-  case 121:
-#line 496 "xi-grammar.y"
+  case 128:
+#line 518 "xi-grammar.y"
     { yyval.templat = new Template(yyvsp[-1].tvarlist, yyvsp[0].chare); yyvsp[0].chare->setTemplate(yyval.templat); }
     break;
 
-  case 122:
-#line 498 "xi-grammar.y"
+  case 129:
+#line 520 "xi-grammar.y"
     { yyval.templat = new Template(yyvsp[-1].tvarlist, yyvsp[0].chare); yyvsp[0].chare->setTemplate(yyval.templat); }
     break;
 
-  case 123:
-#line 500 "xi-grammar.y"
+  case 130:
+#line 522 "xi-grammar.y"
     { yyval.templat = new Template(yyvsp[-1].tvarlist, yyvsp[0].chare); yyvsp[0].chare->setTemplate(yyval.templat); }
     break;
 
-  case 124:
-#line 502 "xi-grammar.y"
+  case 131:
+#line 524 "xi-grammar.y"
     { yyval.templat = new Template(yyvsp[-1].tvarlist, yyvsp[0].chare); yyvsp[0].chare->setTemplate(yyval.templat); }
     break;
 
-  case 125:
-#line 504 "xi-grammar.y"
+  case 132:
+#line 526 "xi-grammar.y"
     { yyval.templat = new Template(yyvsp[-1].tvarlist, yyvsp[0].message); yyvsp[0].message->setTemplate(yyval.templat); }
     break;
 
-  case 126:
-#line 508 "xi-grammar.y"
+  case 133:
+#line 530 "xi-grammar.y"
     { yyval.mbrlist = 0; }
     break;
 
-  case 127:
-#line 510 "xi-grammar.y"
+  case 134:
+#line 532 "xi-grammar.y"
     { yyval.mbrlist = yyvsp[-2].mbrlist; }
     break;
 
-  case 128:
-#line 514 "xi-grammar.y"
+  case 135:
+#line 536 "xi-grammar.y"
     { 
                  Entry *tempEntry;
                  if (!connectEntries->empty()) {
@@ -2256,95 +2303,95 @@ yyreduce:
                }
     break;
 
-  case 129:
-#line 533 "xi-grammar.y"
+  case 136:
+#line 555 "xi-grammar.y"
     { yyval.mbrlist = new MemberList(yyvsp[-1].member, yyvsp[0].mbrlist); }
     break;
 
-  case 130:
-#line 537 "xi-grammar.y"
+  case 137:
+#line 559 "xi-grammar.y"
     { yyval.member = yyvsp[-1].readonly; }
     break;
 
-  case 131:
-#line 539 "xi-grammar.y"
+  case 138:
+#line 561 "xi-grammar.y"
     { yyval.member = yyvsp[-1].readonly; }
     break;
 
-  case 133:
-#line 542 "xi-grammar.y"
+  case 140:
+#line 564 "xi-grammar.y"
     { yyval.member = yyvsp[-1].member; }
     break;
 
-  case 134:
-#line 544 "xi-grammar.y"
+  case 141:
+#line 566 "xi-grammar.y"
     { yyval.member = yyvsp[-1].pupable; }
     break;
 
-  case 135:
-#line 546 "xi-grammar.y"
+  case 142:
+#line 568 "xi-grammar.y"
     { yyval.member = yyvsp[-1].includeFile; }
     break;
 
-  case 136:
-#line 550 "xi-grammar.y"
+  case 143:
+#line 572 "xi-grammar.y"
     { yyval.member = new InitCall(lineno, yyvsp[0].strval, 1); }
     break;
 
-  case 137:
-#line 552 "xi-grammar.y"
+  case 144:
+#line 574 "xi-grammar.y"
     { yyval.member = new InitCall(lineno, yyvsp[-3].strval, 1); }
     break;
 
-  case 138:
-#line 554 "xi-grammar.y"
+  case 145:
+#line 576 "xi-grammar.y"
     { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n"); 
                  yyval.member = new InitCall(lineno, yyvsp[0].strval, 1); }
     break;
 
-  case 139:
-#line 557 "xi-grammar.y"
+  case 146:
+#line 579 "xi-grammar.y"
     { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n");
                  yyval.member = new InitCall(lineno, yyvsp[-3].strval, 1); }
     break;
 
-  case 140:
-#line 562 "xi-grammar.y"
+  case 147:
+#line 584 "xi-grammar.y"
     { yyval.member = new InitCall(lineno, yyvsp[0].strval, 0); }
     break;
 
-  case 141:
-#line 564 "xi-grammar.y"
+  case 148:
+#line 586 "xi-grammar.y"
     { yyval.member = new InitCall(lineno, yyvsp[-3].strval, 0); }
     break;
 
-  case 142:
-#line 568 "xi-grammar.y"
+  case 149:
+#line 590 "xi-grammar.y"
     { yyval.pupable = new PUPableClass(lineno,yyvsp[0].strval,0); }
     break;
 
-  case 143:
-#line 570 "xi-grammar.y"
+  case 150:
+#line 592 "xi-grammar.y"
     { yyval.pupable = new PUPableClass(lineno,yyvsp[-2].strval,yyvsp[0].pupable); }
     break;
 
-  case 144:
-#line 574 "xi-grammar.y"
+  case 151:
+#line 596 "xi-grammar.y"
     { yyval.includeFile = new IncludeFile(lineno,yyvsp[0].strval,0); }
     break;
 
-  case 145:
-#line 578 "xi-grammar.y"
+  case 152:
+#line 600 "xi-grammar.y"
     { yyval.member = yyvsp[-1].entry; }
     break;
 
-  case 146:
-#line 580 "xi-grammar.y"
+  case 153:
+#line 602 "xi-grammar.y"
     { yyval.member = yyvsp[0].member; }
     break;
 
-  case 147:
-#line 584 "xi-grammar.y"
+  case 154:
+#line 606 "xi-grammar.y"
     { 
                  if (yyvsp[0].sc != 0) { 
                    yyvsp[0].sc->con1 = new SdagConstruct(SIDENT, yyvsp[-3].strval);
@@ -2357,8 +2404,8 @@ yyreduce:
                }
     break;
 
-  case 148:
-#line 595 "xi-grammar.y"
+  case 155:
+#line 617 "xi-grammar.y"
     { 
                  if (yyvsp[0].sc != 0) {
                    yyvsp[0].sc->con1 = new SdagConstruct(SIDENT, yyvsp[-2].strval);
@@ -2371,108 +2418,113 @@ yyreduce:
                }
     break;
 
-  case 149:
-#line 608 "xi-grammar.y"
+  case 156:
+#line 630 "xi-grammar.y"
     { yyval.type = new BuiltinType("void"); }
     break;
 
-  case 150:
-#line 610 "xi-grammar.y"
+  case 157:
+#line 632 "xi-grammar.y"
     { yyval.type = yyvsp[0].ptype; }
     break;
 
-  case 151:
-#line 614 "xi-grammar.y"
+  case 158:
+#line 636 "xi-grammar.y"
     { yyval.intval = 0; }
     break;
 
-  case 152:
-#line 616 "xi-grammar.y"
+  case 159:
+#line 638 "xi-grammar.y"
     { yyval.intval = yyvsp[-1].intval; }
     break;
 
-  case 153:
-#line 620 "xi-grammar.y"
+  case 160:
+#line 642 "xi-grammar.y"
     { yyval.intval = yyvsp[0].intval; }
     break;
 
-  case 154:
-#line 622 "xi-grammar.y"
+  case 161:
+#line 644 "xi-grammar.y"
     { yyval.intval = yyvsp[-2].intval | yyvsp[0].intval; }
     break;
 
-  case 155:
-#line 626 "xi-grammar.y"
+  case 162:
+#line 648 "xi-grammar.y"
     { yyval.intval = STHREADED; }
     break;
 
-  case 156:
-#line 628 "xi-grammar.y"
+  case 163:
+#line 650 "xi-grammar.y"
     { yyval.intval = SSYNC; }
     break;
 
-  case 157:
-#line 630 "xi-grammar.y"
+  case 164:
+#line 652 "xi-grammar.y"
     { yyval.intval = SLOCKED; }
     break;
 
-  case 158:
-#line 632 "xi-grammar.y"
+  case 165:
+#line 654 "xi-grammar.y"
     { yyval.intval = SCREATEHERE; }
     break;
 
-  case 159:
-#line 634 "xi-grammar.y"
+  case 166:
+#line 656 "xi-grammar.y"
     { yyval.intval = SCREATEHOME; }
     break;
 
-  case 160:
-#line 636 "xi-grammar.y"
+  case 167:
+#line 658 "xi-grammar.y"
     { yyval.intval = SNOKEEP; }
     break;
 
-  case 161:
-#line 638 "xi-grammar.y"
+  case 168:
+#line 660 "xi-grammar.y"
     { yyval.intval = SNOTRACE; }
     break;
 
-  case 162:
-#line 640 "xi-grammar.y"
+  case 169:
+#line 662 "xi-grammar.y"
     { yyval.intval = SIMMEDIATE; }
     break;
 
-  case 163:
-#line 642 "xi-grammar.y"
+  case 170:
+#line 664 "xi-grammar.y"
     { yyval.intval = SSKIPSCHED; }
     break;
 
-  case 164:
-#line 646 "xi-grammar.y"
+  case 171:
+#line 666 "xi-grammar.y"
+    { yyval.intval = SPYTHON; }
+    break;
+
+  case 172:
+#line 670 "xi-grammar.y"
     { yyval.val = new Value(yyvsp[0].strval); }
     break;
 
-  case 165:
-#line 648 "xi-grammar.y"
+  case 173:
+#line 672 "xi-grammar.y"
     { yyval.val = new Value(yyvsp[0].strval); }
     break;
 
-  case 166:
-#line 650 "xi-grammar.y"
+  case 174:
+#line 674 "xi-grammar.y"
     { yyval.val = new Value(yyvsp[0].strval); }
     break;
 
-  case 167:
-#line 654 "xi-grammar.y"
+  case 175:
+#line 678 "xi-grammar.y"
     { yyval.strval = ""; }
     break;
 
-  case 168:
-#line 656 "xi-grammar.y"
+  case 176:
+#line 680 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
-  case 169:
-#line 658 "xi-grammar.y"
+  case 177:
+#line 682 "xi-grammar.y"
     {  /*Returned only when in_bracket*/
                        char *tmp = new char[strlen(yyvsp[-2].strval)+strlen(yyvsp[0].strval)+3];
                        sprintf(tmp,"%s, %s", yyvsp[-2].strval, yyvsp[0].strval);
@@ -2480,18 +2532,18 @@ yyreduce:
                }
     break;
 
-  case 170:
-#line 666 "xi-grammar.y"
+  case 178:
+#line 690 "xi-grammar.y"
     { yyval.strval = ""; }
     break;
 
-  case 171:
-#line 668 "xi-grammar.y"
+  case 179:
+#line 692 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
-  case 172:
-#line 670 "xi-grammar.y"
+  case 180:
+#line 694 "xi-grammar.y"
     {  /*Returned only when in_bracket*/
                        char *tmp = new char[strlen(yyvsp[-4].strval)+strlen(yyvsp[-2].strval)+strlen(yyvsp[0].strval)+3];
                        sprintf(tmp,"%s[%s]%s", yyvsp[-4].strval, yyvsp[-2].strval, yyvsp[0].strval);
@@ -2499,8 +2551,8 @@ yyreduce:
                }
     break;
 
-  case 173:
-#line 676 "xi-grammar.y"
+  case 181:
+#line 700 "xi-grammar.y"
     { /*Returned only when in_braces*/
                        char *tmp = new char[strlen(yyvsp[-4].strval)+strlen(yyvsp[-2].strval)+strlen(yyvsp[0].strval)+3];
                        sprintf(tmp,"%s{%s}%s", yyvsp[-4].strval, yyvsp[-2].strval, yyvsp[0].strval);
@@ -2508,8 +2560,8 @@ yyreduce:
                }
     break;
 
-  case 174:
-#line 682 "xi-grammar.y"
+  case 182:
+#line 706 "xi-grammar.y"
     { /*Returned only when in_braces*/
                        char *tmp = new char[strlen(yyvsp[-4].strval)+strlen(yyvsp[-2].strval)+strlen(yyvsp[0].strval)+3];
                        sprintf(tmp,"%s(%s)%s", yyvsp[-4].strval, yyvsp[-2].strval, yyvsp[0].strval);
@@ -2517,8 +2569,8 @@ yyreduce:
                }
     break;
 
-  case 175:
-#line 688 "xi-grammar.y"
+  case 183:
+#line 712 "xi-grammar.y"
     { /*Returned only when in_braces*/
                        char *tmp = new char[strlen(yyvsp[-2].strval)+strlen(yyvsp[0].strval)+3];
                        sprintf(tmp,"(%s)%s", yyvsp[-2].strval, yyvsp[0].strval);
@@ -2526,16 +2578,16 @@ yyreduce:
                }
     break;
 
-  case 176:
-#line 696 "xi-grammar.y"
+  case 184:
+#line 720 "xi-grammar.y"
     {  /*Start grabbing CPROGRAM segments*/
                        in_bracket=1;
                        yyval.pname = new Parameter(lineno, yyvsp[-2].type,yyvsp[-1].strval);
                }
     break;
 
-  case 177:
-#line 703 "xi-grammar.y"
+  case 185:
+#line 727 "xi-grammar.y"
     { 
                    /*Start grabbing CPROGRAM segments*/
                        in_braces=1;
@@ -2543,142 +2595,142 @@ yyreduce:
                }
     break;
 
-  case 178:
-#line 711 "xi-grammar.y"
+  case 186:
+#line 735 "xi-grammar.y"
     { 
                        in_braces=0;
                        yyval.intval = 0;
                }
     break;
 
-  case 179:
-#line 718 "xi-grammar.y"
+  case 187:
+#line 742 "xi-grammar.y"
     { yyval.pname = new Parameter(lineno, yyvsp[0].type);}
     break;
 
-  case 180:
-#line 720 "xi-grammar.y"
+  case 188:
+#line 744 "xi-grammar.y"
     { yyval.pname = new Parameter(lineno, yyvsp[-1].type,yyvsp[0].strval);}
     break;
 
-  case 181:
-#line 722 "xi-grammar.y"
+  case 189:
+#line 746 "xi-grammar.y"
     { yyval.pname = new Parameter(lineno, yyvsp[-3].type,yyvsp[-2].strval,0,yyvsp[0].val);}
     break;
 
-  case 182:
-#line 724 "xi-grammar.y"
+  case 190:
+#line 748 "xi-grammar.y"
     { /*Stop grabbing CPROGRAM segments*/
                        in_bracket=0;
                        yyval.pname = new Parameter(lineno, yyvsp[-2].pname->getType(), yyvsp[-2].pname->getName() ,yyvsp[-1].strval);
                }
     break;
 
-  case 183:
-#line 731 "xi-grammar.y"
+  case 191:
+#line 755 "xi-grammar.y"
     { yyval.plist = new ParamList(yyvsp[0].pname); }
     break;
 
-  case 184:
-#line 733 "xi-grammar.y"
+  case 192:
+#line 757 "xi-grammar.y"
     { yyval.plist = new ParamList(yyvsp[-2].pname,yyvsp[0].plist); }
     break;
 
-  case 185:
-#line 737 "xi-grammar.y"
+  case 193:
+#line 761 "xi-grammar.y"
     { yyval.plist = yyvsp[-1].plist; }
     break;
 
-  case 186:
-#line 739 "xi-grammar.y"
+  case 194:
+#line 763 "xi-grammar.y"
     { yyval.plist = 0; }
     break;
 
-  case 187:
-#line 743 "xi-grammar.y"
+  case 195:
+#line 767 "xi-grammar.y"
     { yyval.val = 0; }
     break;
 
-  case 188:
-#line 745 "xi-grammar.y"
+  case 196:
+#line 769 "xi-grammar.y"
     { yyval.val = new Value(yyvsp[0].strval); }
     break;
 
-  case 189:
-#line 749 "xi-grammar.y"
+  case 197:
+#line 773 "xi-grammar.y"
     { yyval.sc = 0; }
     break;
 
-  case 190:
-#line 751 "xi-grammar.y"
+  case 198:
+#line 775 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SSDAGENTRY, yyvsp[0].sc); }
     break;
 
-  case 191:
-#line 753 "xi-grammar.y"
+  case 199:
+#line 777 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SSDAGENTRY, yyvsp[-1].sc); }
     break;
 
-  case 192:
-#line 757 "xi-grammar.y"
+  case 200:
+#line 781 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SSLIST, yyvsp[0].sc); }
     break;
 
-  case 193:
-#line 759 "xi-grammar.y"
+  case 201:
+#line 783 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SSLIST, yyvsp[-1].sc, yyvsp[0].sc);  }
     break;
 
-  case 194:
-#line 763 "xi-grammar.y"
+  case 202:
+#line 787 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SOLIST, yyvsp[0].sc); }
     break;
 
-  case 195:
-#line 765 "xi-grammar.y"
+  case 203:
+#line 789 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SOLIST, yyvsp[-1].sc, yyvsp[0].sc); }
     break;
 
-  case 196:
-#line 769 "xi-grammar.y"
+  case 204:
+#line 793 "xi-grammar.y"
     { yyval.sc = 0; }
     break;
 
-  case 197:
-#line 771 "xi-grammar.y"
+  case 205:
+#line 795 "xi-grammar.y"
     { yyval.sc = yyvsp[-1].sc; }
     break;
 
-  case 198:
-#line 775 "xi-grammar.y"
+  case 206:
+#line 799 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, yyvsp[0].strval)); }
     break;
 
-  case 199:
-#line 777 "xi-grammar.y"
+  case 207:
+#line 801 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, yyvsp[-2].strval), yyvsp[0].sc);  }
     break;
 
-  case 200:
-#line 781 "xi-grammar.y"
+  case 208:
+#line 805 "xi-grammar.y"
     { yyval.strval = yyvsp[0].strval; }
     break;
 
-  case 201:
-#line 783 "xi-grammar.y"
+  case 209:
+#line 807 "xi-grammar.y"
     { yyval.strval = 0; }
     break;
 
-  case 202:
-#line 787 "xi-grammar.y"
+  case 210:
+#line 811 "xi-grammar.y"
     { RemoveSdagComments(yyvsp[-2].strval);
                   yyval.sc = new SdagConstruct(SATOMIC, new XStr(yyvsp[-2].strval), yyvsp[0].sc, 0,0,0,0, 0 ); 
                   if (yyvsp[-4].strval) { yyvsp[-4].strval[strlen(yyvsp[-4].strval)-1]=0; yyval.sc->traceName = new XStr(yyvsp[-4].strval+1); }
                 }
     break;
 
-  case 203:
-#line 792 "xi-grammar.y"
+  case 211:
+#line 816 "xi-grammar.y"
     {  
                   in_braces = 0;
                   if ((yyvsp[-4].plist->isVoid() == 0) && (yyvsp[-4].plist->isMessage() == 0))
@@ -2694,112 +2746,112 @@ yyreduce:
                }
     break;
 
-  case 204:
-#line 806 "xi-grammar.y"
+  case 212:
+#line 830 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SWHEN, 0, 0,0,0,0,0,yyvsp[-2].entrylist); }
     break;
 
-  case 205:
-#line 808 "xi-grammar.y"
+  case 213:
+#line 832 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SWHEN, 0, 0, 0,0,0, yyvsp[0].sc, yyvsp[-1].entrylist); }
     break;
 
-  case 206:
-#line 810 "xi-grammar.y"
+  case 214:
+#line 834 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SWHEN, 0, 0, 0,0,0, yyvsp[-1].sc, yyvsp[-3].entrylist); }
     break;
 
-  case 207:
-#line 812 "xi-grammar.y"
+  case 215:
+#line 836 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SOVERLAP,0, 0,0,0,0,yyvsp[-1].sc, 0); }
     break;
 
-  case 208:
-#line 814 "xi-grammar.y"
+  case 216:
+#line 838 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, yyvsp[-8].strval), new SdagConstruct(SINT_EXPR, yyvsp[-6].strval),
                             new SdagConstruct(SINT_EXPR, yyvsp[-4].strval), 0, yyvsp[-1].sc, 0); }
     break;
 
-  case 209:
-#line 817 "xi-grammar.y"
+  case 217:
+#line 841 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, yyvsp[-6].strval), new SdagConstruct(SINT_EXPR, yyvsp[-4].strval), 
                         new SdagConstruct(SINT_EXPR, yyvsp[-2].strval), 0, yyvsp[0].sc, 0); }
     break;
 
-  case 210:
-#line 820 "xi-grammar.y"
+  case 218:
+#line 844 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, yyvsp[-9].strval), new SdagConstruct(SINT_EXPR, yyvsp[-6].strval), 
                             new SdagConstruct(SINT_EXPR, yyvsp[-4].strval), new SdagConstruct(SINT_EXPR, yyvsp[-2].strval), yyvsp[0].sc, 0); }
     break;
 
-  case 211:
-#line 823 "xi-grammar.y"
+  case 219:
+#line 847 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, yyvsp[-11].strval), new SdagConstruct(SINT_EXPR, yyvsp[-8].strval), 
                                 new SdagConstruct(SINT_EXPR, yyvsp[-6].strval), new SdagConstruct(SINT_EXPR, yyvsp[-4].strval), yyvsp[-1].sc, 0); }
     break;
 
-  case 212:
-#line 826 "xi-grammar.y"
+  case 220:
+#line 850 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, yyvsp[-3].strval), yyvsp[0].sc,0,0,yyvsp[-1].sc,0); }
     break;
 
-  case 213:
-#line 828 "xi-grammar.y"
+  case 221:
+#line 852 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, yyvsp[-5].strval), yyvsp[0].sc,0,0,yyvsp[-2].sc,0); }
     break;
 
-  case 214:
-#line 830 "xi-grammar.y"
+  case 222:
+#line 854 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, yyvsp[-2].strval), 0,0,0,yyvsp[0].sc,0); }
     break;
 
-  case 215:
-#line 832 "xi-grammar.y"
+  case 223:
+#line 856 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SWHILE, 0, new SdagConstruct(SINT_EXPR, yyvsp[-4].strval), 0,0,0,yyvsp[-1].sc,0); }
     break;
 
-  case 216:
-#line 834 "xi-grammar.y"
+  case 224:
+#line 858 "xi-grammar.y"
     { yyval.sc = yyvsp[-1].sc; }
     break;
 
-  case 217:
-#line 838 "xi-grammar.y"
+  case 225:
+#line 862 "xi-grammar.y"
     { yyval.sc = 0; }
     break;
 
-  case 218:
-#line 840 "xi-grammar.y"
+  case 226:
+#line 864 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SELSE, 0,0,0,0,0, yyvsp[0].sc,0); }
     break;
 
-  case 219:
-#line 842 "xi-grammar.y"
+  case 227:
+#line 866 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SELSE, 0,0,0,0,0, yyvsp[-1].sc,0); }
     break;
 
-  case 220:
-#line 845 "xi-grammar.y"
+  case 228:
+#line 869 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, yyvsp[0].strval)); }
     break;
 
-  case 221:
-#line 847 "xi-grammar.y"
+  case 229:
+#line 871 "xi-grammar.y"
     { yyval.sc = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, yyvsp[-2].strval), yyvsp[0].sc);  }
     break;
 
-  case 222:
-#line 851 "xi-grammar.y"
+  case 230:
+#line 875 "xi-grammar.y"
     { in_int_expr = 0; yyval.intval = 0; }
     break;
 
-  case 223:
-#line 855 "xi-grammar.y"
+  case 231:
+#line 879 "xi-grammar.y"
     { in_int_expr = 1; yyval.intval = 0; }
     break;
 
-  case 224:
-#line 859 "xi-grammar.y"
+  case 232:
+#line 883 "xi-grammar.y"
     { 
                  if (yyvsp[0].plist != 0)
                     yyval.entry = new Entry(lineno, 0, 0, yyvsp[-1].strval, yyvsp[0].plist, 0, 0, 0, 0); 
@@ -2809,8 +2861,8 @@ yyreduce:
                }
     break;
 
-  case 225:
-#line 867 "xi-grammar.y"
+  case 233:
+#line 891 "xi-grammar.y"
     { if (yyvsp[0].plist != 0)
                    yyval.entry = new Entry(lineno, 0, 0, yyvsp[-4].strval, yyvsp[0].plist, 0, 0, yyvsp[-2].strval, 0); 
                  else
@@ -2818,33 +2870,33 @@ yyreduce:
                }
     break;
 
-  case 226:
-#line 875 "xi-grammar.y"
+  case 234:
+#line 899 "xi-grammar.y"
     { yyval.entrylist = new EntryList(yyvsp[0].entry); }
     break;
 
-  case 227:
-#line 877 "xi-grammar.y"
+  case 235:
+#line 901 "xi-grammar.y"
     { yyval.entrylist = new EntryList(yyvsp[-2].entry,yyvsp[0].entrylist); }
     break;
 
-  case 228:
-#line 881 "xi-grammar.y"
+  case 236:
+#line 905 "xi-grammar.y"
     { in_bracket=1; }
     break;
 
-  case 229:
-#line 884 "xi-grammar.y"
+  case 237:
+#line 908 "xi-grammar.y"
     { in_bracket=0; }
     break;
 
-  case 230:
-#line 888 "xi-grammar.y"
+  case 238:
+#line 912 "xi-grammar.y"
     { if (!macroDefined(yyvsp[0].strval, 1)) in_comment = 1; }
     break;
 
-  case 231:
-#line 892 "xi-grammar.y"
+  case 239:
+#line 916 "xi-grammar.y"
     { if (!macroDefined(yyvsp[0].strval, 0)) in_comment = 1; }
     break;
 
@@ -2852,7 +2904,7 @@ yyreduce:
     }
 
 /* Line 991 of yacc.c.  */
-#line 2855 "y.tab.c"
+#line 2907 "y.tab.c"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -3062,7 +3114,7 @@ yyreturn:
 }
 
 
-#line 895 "xi-grammar.y"
+#line 919 "xi-grammar.y"
 
 void yyerror(const char *mesg)
 {
index 663255569c83c973e8fd59d747f132b7edbf8a87..6262b30dc611ed27f84f2c17646eda6d4b9c8a70 100644 (file)
      ELSE = 300,
      CONNECT = 301,
      PUBLISHES = 302,
-     IDENT = 303,
-     NUMBER = 304,
-     LITERAL = 305,
-     CPROGRAM = 306,
-     HASHIF = 307,
-     HASHIFDEF = 308,
-     INT = 309,
-     LONG = 310,
-     SHORT = 311,
-     CHAR = 312,
-     FLOAT = 313,
-     DOUBLE = 314,
-     UNSIGNED = 315
+     PYTHON = 303,
+     IDENT = 304,
+     NUMBER = 305,
+     LITERAL = 306,
+     CPROGRAM = 307,
+     HASHIF = 308,
+     HASHIFDEF = 309,
+     INT = 310,
+     LONG = 311,
+     SHORT = 312,
+     CHAR = 313,
+     FLOAT = 314,
+     DOUBLE = 315,
+     UNSIGNED = 316
    };
 #endif
 #define MODULE 258
 #define ELSE 300
 #define CONNECT 301
 #define PUBLISHES 302
-#define IDENT 303
-#define NUMBER 304
-#define LITERAL 305
-#define CPROGRAM 306
-#define HASHIF 307
-#define HASHIFDEF 308
-#define INT 309
-#define LONG 310
-#define SHORT 311
-#define CHAR 312
-#define FLOAT 313
-#define DOUBLE 314
-#define UNSIGNED 315
+#define PYTHON 303
+#define IDENT 304
+#define NUMBER 305
+#define LITERAL 306
+#define CPROGRAM 307
+#define HASHIF 308
+#define HASHIFDEF 309
+#define INT 310
+#define LONG 311
+#define SHORT 312
+#define CHAR 313
+#define FLOAT 314
+#define DOUBLE 315
+#define UNSIGNED 316
 
 
 
@@ -189,7 +191,7 @@ typedef union YYSTYPE {
   SdagConstruct *sc;
 } YYSTYPE;
 /* Line 1249 of yacc.c.  */
-#line 192 "y.tab.h"
+#line 194 "y.tab.h"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
index dcaabcadbff272efcf38f09d658ad73cc05959ec..250f697105e4e01d2d5dfea9829c6196b9011d45 100644 (file)
@@ -1,4 +1,4 @@
-%expect 4 
+%expect 5 
 %{
 #include "xi-symbol.h"
 #include "EToken.h"
@@ -82,6 +82,7 @@ extern int macroDefined(char *str, int istrue);
 %token ELSE
 %token CONNECT
 %token PUBLISHES 
+%token PYTHON
 %token <strval> IDENT NUMBER LITERAL CPROGRAM HASHIF HASHIFDEF
 %token <intval> INT LONG SHORT CHAR FLOAT DOUBLE UNSIGNED
 
@@ -95,6 +96,7 @@ extern int macroDefined(char *str, int istrue);
 %type <intval>         OptExtern OptSemiColon MAttribs MAttribList MAttrib
 %type <intval>         EAttribs EAttribList EAttrib OptVoid
 %type <cattr>          CAttribs CAttribList CAttrib
+%type <cattr>          ArrayAttribs ArrayAttribList ArrayAttrib
 %type <tparam>         TParam
 %type <tparlist>       TParamList TParamEList OptTParams
 %type <type>           BaseType Type SimpleType OptTypeInit EReturn
@@ -376,8 +378,26 @@ CAttribList        : CAttrib
                { $$ = $1 | $3; }
                ;
 
+ArrayAttrib    : PYTHON
+               { $$ = Chare::CPYTHON; }
+               ;
+
+ArrayAttribs   : /* Empty */
+               { $$ = 0; }
+               | '[' ArrayAttribList ']'
+               { $$ = $2; }
+               ;
+
+ArrayAttribList        : ArrayAttrib
+               { $$ = $1; }
+               | ArrayAttrib ',' ArrayAttribList
+               { $$ = $1 | $3; }
+               ;
+
 CAttrib                : MIGRATABLE
                { $$ = Chare::CMIGRATABLE; }
+               | PYTHON
+               { $$ = Chare::CPYTHON; }
                ;
 
 Var            : Type Name '[' ']' ';'
@@ -432,8 +452,10 @@ ArrayIndexType     : '[' NUMBER Name ']'
                { $$ = new NamedType($2); }
                ;
 
-Array          : ARRAY ArrayIndexType NamedType OptBaseList MemberEList
-               {  $$ = new Array(lineno, 0, $2, $3, $4, $5); }
+Array          : ARRAY ArrayAttribs ArrayIndexType NamedType OptBaseList MemberEList
+               {  $$ = new Array(lineno, $2, $3, $4, $5, $6); }
+               | ARRAY ArrayIndexType ArrayAttribs NamedType OptBaseList MemberEList
+               {  $$ = new Array(lineno, $3, $2, $4, $5, $6); }
                ;
 
 TChare         : CHARE CAttribs Name OptBaseList MemberEList
@@ -640,6 +662,8 @@ EAttrib             : THREADED
                 { $$ = SIMMEDIATE; }
                | SKIPSCHED
                 { $$ = SSKIPSCHED; }
+               | PYTHON
+                { $$ = SPYTHON; }
                ;
 
 DefaultParameter: LITERAL
index 3c9f50f7919a760435f0ff1b6d1650f261383c93..9dfa4f3b948f4d359a8ea7916afba9a4c9c50831 100644 (file)
@@ -2013,6 +2013,7 @@ struct rwtable rwtable[] = {
   "overlap",   OVERLAP,
   "connect",    CONNECT,
   "publishes",  PUBLISHES,
+  "python",     PYTHON,
   "",          0
 };
 
index bfa11f996883a508f4f01368ad684603212dbde1..cbcbd7e8d7dd74f6fb4020d29a49e622d9206915 100644 (file)
@@ -131,6 +131,7 @@ struct rwtable rwtable[] = {
   "overlap",   OVERLAP,
   "connect",    CONNECT,
   "publishes",  PUBLISHES,
+  "python",     PYTHON,
   "",          0
 };
 
index e57461b9501f0528f8730200eb29862352d029c1..a2924aebc704db007e414bec91981f01e189527e 100644 (file)
@@ -25,6 +25,7 @@ const char *Prefix::ProxyElement="CProxyElement_";
 const char *Prefix::ProxySection="CProxySection_";
 const char *Prefix::Message="CMessage_";
 const char *Prefix::Index="CkIndex_";
+const char *Prefix::Python="CkPython_";
 
 
 //Fatal error function
@@ -458,6 +459,7 @@ static const char *forWhomStr(forWhom w)
   case forIndividual: return Prefix::ProxyElement;
   case forSection: return Prefix::ProxySection;
   case forIndex: return Prefix::Index;
+  case forPython: return "";
   default: return NULL;
   };
 }
@@ -607,7 +609,23 @@ Chare::genDecls(XStr& str)
   if(type->isTemplated())
     return;
   str << "/* DECLS: "; print(str); str << " */\n";
- //Forward declaration of the user-defined implementation class*/
+
+  // include python header and add two methods called execute and iterate.
+  // these cannot be added to the .ci file of the PythonCCS interface since
+  // different charm object require different definitions...
+  if (isPython()) {
+    str << "#include \"PythonCCS.h\"\n";
+    if (list) {
+      Entry *etemp = new Entry(0,0,new BuiltinType("void"),"execute",new ParamList(new Parameter(0,new PtrType(new NamedType("CkCcsRequestMsg",0)),"msg")),0,0,0,0);
+      list->appendMember(etemp);
+      etemp->setChare(this);
+      etemp = new Entry(0,0,new BuiltinType("void"),"iterate",new ParamList(new Parameter(0,new PtrType(new NamedType("CkCcsRequestMsg",0)),"msg")),0,0,0,0);
+      list->appendMember(etemp);
+      etemp->setChare(this);
+    }
+  }
+
+  //Forward declaration of the user-defined implementation class*/
   str << tspec()<<" class "<<type<<";\n";
   str << tspec()<<" class "<<Prefix::Index<<type<<";\n";
   str << tspec()<<" class "<<Prefix::Proxy<<type<<";\n";
@@ -615,7 +633,9 @@ Chare::genDecls(XStr& str)
     str << tspec()<<" class "<<Prefix::ProxyElement<<type<<";\n";
   if (hasSection)
     str << tspec()<<" class "<<Prefix::ProxySection<<type<<";\n";
-  
+  if (isPython())
+    str << tspec()<<" class "<<Prefix::Python<<type<<";\n";
+
  //Generate index class
   str << "/* --------------- index object ------------------ */\n";
   str << tspec()<< "class "<<Prefix::Index<<type;
@@ -645,6 +665,10 @@ Chare::genDecls(XStr& str)
     str << "/* ---------------- section proxy -------------- */\n";
     forElement=forSection; genSubDecls(str); forElement=forIndividual;
   }
+  if (isPython()) {
+    str << "/* ---------------- python wrapper -------------- */\n";
+    genPythonDecls(str);
+  }
   
   if(list) {
     //handle the case that some of the entries may be sdag Entries
@@ -667,18 +691,23 @@ Chare::genDecls(XStr& str)
   { //Generate a CBase typedef:
     TypeList *b=bases_CBase;
     if (b==NULL) b=bases; //Fall back to normal bases list if no CBase available
-    switch(b->length()) {
-    case 1: //Just one base class: typedef CBaseT<parent,CProxy_me> CBase_me;
-           str << "typedef CBaseT<"<<b->getFirst()<<",CProxy_"<<type<<"> "
-               <<" CBase_"<<type<<";\n"; 
-           break;
-    case 2: //Two base classes: typedef CBaseT2<parent1,parent2,CProxy_me> CBase_me;
-           str << "typedef CBaseT2<"<<b->getFirst()<<","<<b->getSecond()<<","
-               <<"CProxy_"<<type<<"> "<<" CBase_"<<type<<";\n"; 
-           break;
-    default: //No base class, or several: give up, don't generate a CBase_me.
-           break;
-    };
+    if (isPython()) { //Generate a python base: typedef CBaseT<Python_me,CProxy_me> CBase_me;
+      str << "typedef CBaseT<"<<Prefix::Python<<type<<",CProxy_"<<type<<"> "
+         <<" CBase_"<<type<<";\n";
+    } else { //Generate normal CBase_me definition
+      switch(b->length()) {
+      case 1: //Just one base class: typedef CBaseT<parent,CProxy_me> CBase_me;
+       str << "typedef CBaseT<"<<b->getFirst()<<",CProxy_"<<type<<"> "
+           <<" CBase_"<<type<<";\n"; 
+       break;
+      case 2: //Two base classes: typedef CBaseT2<parent1,parent2,CProxy_me> CBase_me;
+       str << "typedef CBaseT2<"<<b->getFirst()<<","<<b->getSecond()<<","
+           <<"CProxy_"<<type<<"> "<<" CBase_"<<type<<";\n"; 
+       break;
+      default: //No base class, or several: give up, don't generate a CBase_me.
+       break;
+      };
+    }
   }
 }
 
@@ -729,6 +758,64 @@ Chare::genSubDecls(XStr& str)
   if (!isTemplated()) str << "PUPmarshall("<<ptype<<");\n";
 }
 
+void Chare::genPythonDecls(XStr& str) {
+
+  XStr ptype;
+  ptype<<Prefix::Python<<type;
+
+  // Class declaration
+  str << tspec()<< "class "<<ptype;
+  if(external || type->isTemplated()) {
+    str << ";";
+    return;
+  }
+  str << ":";
+  TypeList *b=bases_CBase;
+  if (b==NULL) b=bases; //Fall back to normal bases list if no CBase available
+  b->genProxyNames(str,"public ",NULL,"",", ",forPython);
+  str << ", public PythonObject ";
+  str << CIClassStart;
+
+  // default constructor methods
+  str << "    "<<ptype<<"(void) {}\n";
+  str << "    "<<ptype<<"(CkMigrateMessage *msg): ";
+  b->genProxyNames(str,"",NULL,"(msg)",", ",forPython);
+  str << " {}\n";
+
+  // define pupper
+  str << "    void pup(PUP::er &p) {\n";
+  b->genProxyNames(str,"      ",NULL,"::pup(p);","\n",forPython);
+  str << "\n    }\n";
+
+  // define the python custom methods
+  str << "    static PyMethodDef CkPy_MethodsCustom[];\n";
+  str << "    PyMethodDef *getMethods(void) {return CkPy_MethodsCustom;}\n";
+
+  str << CIClassEnd;
+
+  // declare all static python methods and CkPy_MethodsCustom
+  if (list)
+    list->genPythonDecls(str);
+  str << "\n";
+
+  if (!isTemplated()) str << "PUPmarshall("<<ptype<<");\n";
+}
+
+void Chare::genPythonDefs(XStr& str) {
+
+  XStr ptype;
+  ptype<<Prefix::Python<<type;
+
+  str << "PyMethodDef "<<ptype<<"::CkPy_MethodsCustom[] = {\n";
+  if (list)
+    list->genPythonStaticDefs(str);
+  str << "  {NULL, NULL}\n};\n\n";
+
+  if (list)
+    list->genPythonDefs(str);
+
+}
+
 Group::Group(int ln, attrib_t Nattr,
        NamedType *t, TypeList *b, MemberList *l)
        :Chare(ln,Nattr|CGROUP,t,b,l) 
@@ -1094,6 +1181,20 @@ Chare::genDefs(XStr& str)
     }
     str << "#endif /*CK_TEMPLATES_ONLY*/\n";
   }
+  // define the python routines
+  if (isPython()) {
+    if(isTemplated())
+      str << "#ifdef CK_TEMPLATES_ONLY\n";
+    else
+      str << "#ifndef CK_TEMPLATES_ONLY\n";
+    str << "/* ---------------- python wrapper -------------- */\n";
+
+    // write CkPy_MethodsCustom
+    genPythonDefs(str);
+
+    str << "#endif /*CK_TEMPLATES_ONLY*/\n";
+  }
+
   if(!external && !type->isTemplated())
     genRegisterMethodDef(str);
   if (hasSdagEntry) {
@@ -1619,6 +1720,32 @@ void MemberList::lookforCEntry(CEntry *centry)
   }
 }
 
+void MemberList::genPythonDecls(XStr& str) {
+  if(member)
+    member->genPythonDecls(str);
+  if(next) {
+    str << endx;
+    next->genPythonDecls(str);
+  }
+}
+
+void MemberList::genPythonDefs(XStr& str) {
+  if(member)
+    member->genPythonDefs(str);
+  if(next) {
+    str << endx;
+    next->genPythonDefs(str);
+  }
+}
+
+void MemberList::genPythonStaticDefs(XStr& str) {
+  if(member)
+    member->genPythonStaticDefs(str);
+  if(next) {
+    next->genPythonStaticDefs(str);
+  }
+}
+
 void Entry::lookforCEntry(CEntry *centry)
 {
    // compare name
@@ -2240,6 +2367,52 @@ void Entry::genGroupStaticConstructorDefs(XStr& str)
   }
 }
 
+/******************* Python Entry Point Code **************************/
+void Entry::genPythonDecls(XStr& str) {
+  str <<"/* STATIC DECLS: "; print(str); str << " */\n";
+  if (isPython()) {
+    // check the parameter passed to the function, it must be only an integer
+    if (!param || param->next || !param->param->getType()->isBuiltin() || !((BuiltinType*)param->param->getType())->isInt()) {
+      die("A python entry method must accept only one parameter of type `int`");
+    }
+
+    str << "static PyObject *_Python_"<<container->baseName()<<"_"<<name<<"(PyObject *self, PyObject *arg);\n";
+  }
+}
+
+void Entry::genPythonDefs(XStr& str) {
+  str <<"/* DEFS: "; print(str); str << " */\n";
+  if (isPython()) {
+
+    str << "PyObject *_Python_"<<container->baseName()<<"_"<<name<<"(PyObject *self, PyObject *arg) {\n";
+    str << "  int pyNumber = PyInt_AsLong(PyDict_GetItemString(PyModule_GetDict(PyImport_AddModule(\"__main__\")),\"charmNumber\"));\n";
+    str << "  CmiLock(CsvAccess(pyLock));\n";
+    str << "  "<<container->baseName()<<" *pyWorker = ("<<container->baseName()<<" *)(*CsvAccess(pyWorkers))[pyNumber];\n";
+    str << "  ((*CsvAccess(pyThread))[pyNumber]).arg=arg;\n";
+    str << "  ((*CsvAccess(pyThread))[pyNumber]).result=&CtvAccess(pythonReturnValue);\n";
+    str << "  ((*CsvAccess(pyThread))[pyNumber]).pythread=PyThreadState_Get();\n";
+    str << "  CmiUnlock(CsvAccess(pyLock));\n";
+
+    str << "  pyWorker->thisProxy."<<name<<"(pyNumber);\n";
+
+    str << "  PyEval_ReleaseLock();\n";
+    str << "  CthSuspend();\n";
+
+    str << "  if (CtvAccess(pythonReturnValue)) {\n";
+    str << "    return CtvAccess(pythonReturnValue);\n";
+    str << "  } else {\n";
+    str << "    Py_INCREF(Py_None); return Py_None;\n";
+    str << "  }\n";
+    str << "}\n";
+  }
+}
+
+void Entry::genPythonStaticDefs(XStr& str) {
+  if (isPython()) {
+    str << "  {\""<<name<<"\",_Python_"<<container->baseName()<<"_"<<name<<",METH_VARARGS},\n";
+  }
+}
+
 /******************* Shared Entry Point Code **************************/
 void Entry::genIndexDecls(XStr& str)
 {
index 660b63e377990f304828e63f65f0a0fb4954dbff..09c62c64035d34b88f35e15f78b83f754f5da505 100644 (file)
@@ -29,10 +29,11 @@ public:
   static const char *ProxySection;
   static const char *Message;
   static const char *Index;
+  static const char *Python;
 };
 
 typedef enum {
-       forAll=0,forIndividual=1,forSection=2,forIndex=-1
+  forAll=0,forIndividual=1,forSection=2,forPython=3,forIndex=-1
 } forWhom;
 
 class Chare;//Forward declaration
@@ -136,6 +137,7 @@ class BuiltinType : public Type {
     int isBuiltin(void) const {return 1;}
     void print(XStr& str) { str << name; }
     int isVoid(void) const { return !strcmp(name, "void"); }
+    int isInt(void) const { return !strcmp(name, "int"); }
     char *getBaseName(void) const { return name; }
 };
 
@@ -484,7 +486,10 @@ class Member : public Construct {
     virtual int isSdag(void) { return 0; }
     virtual void collectSdagCode(CParsedFile *pf, int& sdagPresent) { return; }
     XStr makeDecl(const XStr &returnType,int forProxy=0);
+    virtual void genPythonDecls(XStr& str) {}
     virtual void genIndexDecls(XStr& str)=0;
+    virtual void genPythonDefs(XStr& str) {}
+    virtual void genPythonStaticDefs(XStr& str) {}
     virtual void lookforCEntry(CEntry *centry)  {}
 };
 
@@ -515,8 +520,11 @@ class MemberList : public Printable {
     void genPub(XStr& declstr, XStr& defstr, XStr& defconstr, int& connectPresent);
     void genDecls(XStr& str);
     void genIndexDecls(XStr& str);
+    void genPythonDecls(XStr& str);
     void genDefs(XStr& str);
     void genReg(XStr& str);
+    void genPythonDefs(XStr& str);
+    void genPythonStaticDefs(XStr& str);
     void collectSdagCode(CParsedFile *pf, int& sdagPresent);
     virtual void lookforCEntry(CEntry *centry);
 };
@@ -526,6 +534,7 @@ class Chare : public TEntity {
   public:
     enum { //Set these attribute bits in "attrib"
        CMIGRATABLE=1<<2,
+       CPYTHON=1<<3,
        CMAINCHARE=1<<10,
        CARRAY=1<<11,
        CGROUP=1<<12,
@@ -567,6 +576,7 @@ class Chare : public TEntity {
     }
     int  isTemplated(void) { return (templat!=0); }
     int  isMigratable(void) { return attrib&CMIGRATABLE; }
+    int  isPython(void) { return attrib&CPYTHON; }
     int  isMainChare(void) {return attrib&CMAINCHARE;}
     int  isArray(void) {return attrib&CARRAY;}
     int  isGroup(void) {return attrib&CGROUP;}
@@ -583,6 +593,8 @@ class Chare : public TEntity {
     void genDecls(XStr &str);
     int nextEntry(void) {return entryCount++;}
     virtual void genSubDecls(XStr& str);
+    void genPythonDecls(XStr& str);
+    void genPythonDefs(XStr& str);
     virtual char *chareTypeName(void) {return (char *)"chare";}
     virtual char *proxyPrefix(void);
     virtual void genSubRegisterMethodDef(XStr& str);
@@ -694,6 +706,7 @@ class Message : public TEntity {
 #define SNOKEEP       0x200
 #define SNOTRACE      0x400
 #define SSKIPSCHED    0x800 //<- is a message skipping charm scheduler
+#define SPYTHON       0x1000
 
 /* An entry construct */
 class Entry : public Member {
@@ -731,6 +744,10 @@ class Entry : public Member {
     void genGroupStaticConstructorDefs(XStr& str);
     void genGroupDefs(XStr& str);
     
+    void genPythonDecls(XStr& str);
+    void genPythonDefs(XStr& str);
+    void genPythonStaticDefs(XStr& str);
+    
     XStr paramType(int withDefaultVals,int withEO=0);
     XStr paramComma(int withDefaultVals,int withEO=0);
     XStr eo(int withDefaultVals,int priorComma=1);
@@ -764,6 +781,7 @@ class Entry : public Member {
     int isCreate(void) { return (attribs & SCREATEHERE)||(attribs & SCREATEHOME); }
     int isCreateHome(void) { return (attribs & SCREATEHOME); }
     int isCreateHere(void) { return (attribs & SCREATEHERE); }
+    int isPython(void) { return (attribs & SPYTHON); }
     int isSdag(void) { return (sdagCon!=0); }
     void print(XStr& str);
     void genIndexDecls(XStr& str);