Made sdag translator to read sdag code from an XStr and generate code
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Wed, 28 Mar 2001 11:01:11 +0000 (11:01 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Wed, 28 Mar 2001 11:01:11 +0000 (11:01 +0000)
in an XStr. This will allow us to embed the sdag translator in Charm++
interface translator.

12 files changed:
src/langs/sdag/xlator/CEntry.C
src/langs/sdag/xlator/CEntry.h
src/langs/sdag/xlator/CLexer.C
src/langs/sdag/xlator/CLexer.h
src/langs/sdag/xlator/CParseNode.h
src/langs/sdag/xlator/CParseNodeProcess.C
src/langs/sdag/xlator/CParsedFile.C
src/langs/sdag/xlator/CParsedFile.h
src/langs/sdag/xlator/CParser.C
src/langs/sdag/xlator/CParser.h
src/langs/sdag/xlator/sdag-globals.C
src/langs/sdag/xlator/sdag-main.C

index c71c1210346b14118ba7445bddc39983fde2ce35..179a01262b362e9611edbe3aebe2b51077c0f4cf 100644 (file)
@@ -8,63 +8,59 @@
 #include "CEntry.h"
 #include "CParseNode.h"
 
-void CEntry::generateDeps(void)
+void CEntry::generateDeps(XStr& op)
 {
   CParseNode *cn;
   for(cn=(CParseNode *)whenList->begin(); !whenList->end(); cn=(CParseNode *)whenList->next()) {
-    pH(2, "__cDep->addDepends(%d, %d);\n", cn->nodeNum, entryNum);
+    op << "    __cDep->addDepends("<<cn->nodeNum<<","<<entryNum<<");\n";
   }
 }
 
-void CEntry::generateCode(XStr *className)
+void CEntry::generateCode(XStr& op)
 {
   CParseNode *cn;
-  // C++ file
-  pH(1, "void %s(%s *msg) {\n",
-              entry->charstar(),
-              msgType->charstar());
-  // actual code begins
-  pH(2,"CWhenTrigger *tr;\n");
+  op << "  void "<< *entry << "(" << *msgType << " *msg) {\n";
+  op << "    CWhenTrigger *tr;\n";
   if(refNumNeeded) {
-    pH(2,"int refnum = CkGetRefNum(msg);\n");
-    pH(2,"__cDep->bufferMessage(%d, (void *) msg, refnum);\n", entryNum);
-    pH(2,"tr = __cDep->getTrigger(%d, refnum);\n", entryNum);
+    op << "    int refnum = CkGetRefNum(msg);\n";
+    op << "    __cDep->bufferMessage("<<entryNum<<",(void *) msg,refnum);\n";
+    op << "    tr = __cDep->getTrigger("<<entryNum<<", refnum);\n";
   } else {
-    pH(2,"__cDep->bufferMessage(%d, (void *) msg, 0);\n", entryNum);
-    pH(2,"tr = __cDep->getTrigger(%d, 0);\n", entryNum);
+    op << "    __cDep->bufferMessage("<<entryNum<<", (void *) msg, 0);\n";
+    op << "    tr = __cDep->getTrigger("<<entryNum<<", 0);\n";
   }
-  pH(2,"if (tr == 0)\n");
-  pH(3,"return;\n");
+  op << "    if (tr == 0)\n";
+  op << "      return;\n";
   if(whenList->length() == 1) {
     cn = (CParseNode *)whenList->begin();
-    pH(2,"%s(", cn->label->charstar());
+    op << "    " << cn->label->charstar() << "(";
     CStateVar *sv = (CStateVar *)cn->stateVars->begin();
     int i = 0;
     for(; i<(cn->stateVars->length());i++, sv=(CStateVar *)cn->stateVars->next()) {
       if(i!=0)
-        pH(1,", ");
-      pH(1,"(%s) tr->args[%d]", sv->type->charstar(), i);
+        op << ", ";
+      op << "(" << sv->type->charstar() << ") tr->args[" << i << "]";
     }
-    pH(1,");\n");
-    pH(2,"return;\n");
+    op << ");\n";
+    op << "    return;\n";
   } else {
-    pH(2,"switch(tr->whenID) {\n");
+    op << "    switch(tr->whenID) {\n";
     for(cn=(CParseNode *)whenList->begin(); !whenList->end(); cn=(CParseNode *)whenList->next()) {
-      pH(3,"case %d:\n", cn->nodeNum);
-      pH(4,"%s(", cn->label->charstar());
+      op << "      case " << cn->nodeNum << ":\n";
+      op << cn->label->charstar() << "(";
       CStateVar *sv = (CStateVar *)cn->stateVars->begin();
       int i = 0;
       for(; i<(cn->stateVars->length());i++, sv=(CStateVar *)cn->stateVars->next()) {
         if(i!=0)
-          pH(1,", ");
-        pH(1,"(%s) tr->args[%d]", sv->type->charstar(), i);
+          op << ", ";
+        op << "(" << sv->type->charstar() << ") tr->args[" << i << "]";
       }
-      pH(1,");\n");
-      pH(4,"return;\n");
+      op << ");\n";
+      op << "      return;\n";
     }
-    pH(2,"}\n");
+    op << "    }\n";
   }
   // actual code ends
-  pH(1,"}\n\n");
+  op << "  }\n\n";
 }
 
index 29d8c8e33b13d44575621309461d40166cb7eba5..b891171e54afd00f9e289bd7a2f255a784fdd238 100644 (file)
@@ -30,8 +30,8 @@ class CEntry{
       Indent(indent);
       printf("entry %s (%s *)", entry->charstar(), msgType->charstar());
     }
-    void generateCode(XStr *);
-    void generateDeps(void);
+    void generateCode(XStr& op);
+    void generateDeps(XStr& op);
     
 };
 #endif
index e4e3615c192bff761f2c4277faafd9191b122241..fe64089eb5caef77a9d00271dd4c6e233fdf2ad3 100644 (file)
@@ -8,27 +8,20 @@
 #include "CLexer.h"
 #include <stdlib.h>
 
-CLexer::CLexer(void)
+extern "C" void sl_scan_string(char *);
+
+CLexer::CLexer(char *str)
 {
   lineNum = 1;
   charNum = 1;
   wsSignificant = 0;
+  sl_scan_string(str);
 }
 
 CLexer::~CLexer(void)
 {
 }
 
-int CLexer::sourceFile(char *filename)
-{
-  FILE *fp;
-  if((fp=fopen(filename, "r"))==(FILE *)0)
-    return 0;
-  fclose(fp);
-  freopen(filename, "r", stdin);
-  return 1;
-}
-
 CToken *CLexer::lookAhead(void)
 {
   while(1) {
index 3c74c9902cfdd9f4efc718e5bc21919f623687f8..02d33410db7bb72c5145b595ff27c5c0958bff78 100644 (file)
@@ -23,9 +23,8 @@ class CLexer {
   public:
     unsigned int lineNum;
     unsigned int charNum;
-    CLexer(void);
+    CLexer(char *);
     ~CLexer(void);
-    int sourceFile(char *filename);
     CToken *lookAhead(void);
     CToken *getNextToken(void);
     CToken *getMatchedCode(const char *, EToken, EToken);
index 3b6f26f5ac1a56ef6d09c233f80b84e6ed4f1932..a6317209ad86bee2034e6c217d347e5910effd41 100644 (file)
@@ -41,21 +41,21 @@ class CParseNode {
     void labelNodes(XStr *);
     void generateEntryList(TList *, CParseNode *);
     void propogateState(TList *);
-    void generateCode(void);
+    void generateCode(XStr& output);
     void setNext(CParseNode *, int);
   private:
-    void generateWhen(void);
-    void generateOverlap(void);
-    void generateWhile(void);
-    void generateFor(void);
-    void generateIf(void);
-    void generateElse(void);
-    void generateForall(void);
-    void generateOlist(void);
-    void generateSdagEntry(void);
-    void generateSlist(void);
-    void generateAtomic(void);
-    void generatePrototype(FILE *, TList *);
-    void generateCall(FILE *f, TList *);
+    void generateWhen(XStr& op);
+    void generateOverlap(XStr& op);
+    void generateWhile(XStr& op);
+    void generateFor(XStr& op);
+    void generateIf(XStr& op);
+    void generateElse(XStr& op);
+    void generateForall(XStr& op);
+    void generateOlist(XStr& op);
+    void generateSdagEntry(XStr& op);
+    void generateSlist(XStr& op);
+    void generateAtomic(XStr& op);
+    void generatePrototype(XStr& op, TList *);
+    void generateCall(XStr& op, TList *);
 };
 #endif
index 0f02ce9bd2f4af6c31e59b066d7ed766bf29ca96..e02e90c2cd07eca191814e876738c7745915ea55 100644 (file)
@@ -243,101 +243,97 @@ void CParseNode::propogateState(TList *list)
   }
 }
 
-void CParseNode::generateCode(void)
+void CParseNode::generateCode(XStr& op)
 {
   switch(type) {
     case SDAGENTRY:
-      generateSdagEntry();
+      generateSdagEntry(op);
       break;
     case SLIST:
-      generateSlist();
+      generateSlist(op);
       break;
     case OLIST:
-      generateOlist();
+      generateOlist(op);
       break;
     case FORALL:
-      generateForall();
+      generateForall(op);
       break;
     case ATOMIC:
-      generateAtomic();
+      generateAtomic(op);
       break;
     case IF:
-      generateIf();
+      generateIf(op);
       if(con2 != 0)
-        con2->generateCode();
+        con2->generateCode(op);
       break;
     case ELSE:
-      generateElse();
+      generateElse(op);
       break;
     case WHILE:
-      generateWhile();
+      generateWhile(op);
       break;
     case FOR:
-      generateFor();
+      generateFor(op);
       break;
     case OVERLAP:
-      generateOverlap();
+      generateOverlap(op);
       break;
     case WHEN:
-      generateWhen();
+      generateWhen(op);
       break;
     default:
       break;
   }
   CParseNode *cn;
   for(cn=(CParseNode *)(constructs->begin()); !constructs->end(); cn=(CParseNode *)(constructs->next())) {
-    cn->generateCode();
+    cn->generateCode(op);
   }
 }
 
-void CParseNode::generateWhen(void)
+void CParseNode::generateWhen(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "int %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
-  // actual code here 
+  op << "  int " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   TList *elist = con1->constructs;
   CParseNode *el;
   for(el=(CParseNode *)(elist->begin()); !elist->end(); el=(CParseNode *)(elist->next())) {
-    pH(2, "CMsgBuffer *%s_buf;\n", el->con4->text->charstar());
-    pH(2, "%s *%s;\n", el->con3->text->charstar(),
-                el->con4->text->charstar());
+    op << "    CMsgBuffer *"<<el->con4->text->charstar()<<"_buf;\n";
+    op << "    " << el->con3->text->charstar() << " *" <<
+                    el->con4->text->charstar() << ";\n";
   }
-  pH(1, "\n");
+  op << "\n";
   for(el=(CParseNode *)(elist->begin()); !elist->end(); el=(CParseNode *)(elist->next())) {
     if(el->con2 == 0)
-      pH(2, "%s_buf = __cDep->getMessage(%d);\n",
-                  el->con4->text->charstar(),
-                  el->entryPtr->entryNum);
+      op << "    " << el->con4->text->charstar() << 
+            "_buf = __cDep->getMessage(" << el->entryPtr->entryNum << ");\n";
     else
-      pH(2, "%s_buf = __cDep->getMessage(%d, %s);\n",
-                  el->con4->text->charstar(),
-                  el->entryPtr->entryNum,
-                  el->con2->text->charstar());
+      op << "    " << el->con4->text->charstar() << 
+            "_buf = __cDep->getMessage(" << el->entryPtr->entryNum <<
+            ", " << el->con2->text->charstar() << ");\n";
   }
-  pH(1, "\n");
-  pH(2, "if (");
+  op << "\n";
+  op << "    if (";
   for(el=(CParseNode *)(elist->begin()); !elist->end();) {
-    pH(1, "(%s_buf != 0)", el->con4->text->charstar());
+    op << "(" << el->con4->text->charstar() << "_buf != 0)";
     el = (CParseNode *)(elist->next());
     if(el != 0)
-      pH(1, "&&");
+      op << "&&";
   }
-  pH(1, ") {\n");
+  op << ") {\n";
   for(el=(CParseNode *)(elist->begin()); !elist->end(); el=(CParseNode *)(elist->next())) {
-    pH(3, "%s = (%s *) %s_buf->msg;\n",
-                  el->con4->text->charstar(),
-                  el->con3->text->charstar(),
-                  el->con4->text->charstar());
-    pH(3, "__cDep->removeMessage(%s_buf);\n",
-                el->con4->text->charstar());
+    op << "      " << el->con4->text->charstar() << " = (" << 
+          el->con3->text->charstar() << " *) " <<
+          el->con4->text->charstar() << "_buf->msg;\n";
+    op << "      __cDep->removeMessage(" << el->con4->text->charstar() <<
+          "_buf);\n";
   }
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
-  pH(3, "return 1;\n");
-  pH(2, "} else {\n");
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() << 
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "      return 1;\n";
+  op << "    } else {\n";
 
   int nRefs=0, nAny=0;
   for(el=(CParseNode *)(elist->begin()); !elist->end(); el=(CParseNode *)(elist->next())) {
@@ -347,7 +343,7 @@ void CParseNode::generateWhen(void)
       nRefs++;
   }
 
-// keep these consts consistent with CWhenTrigger.h in runtime
+// keep these consts consistent with sdag.h in runtime
 
 #define MAXARG 8
 #define MAXANY 8
@@ -369,392 +365,401 @@ void CParseNode::generateWhen(void)
     exit(1);
   }
 
-  pH(3, "CWhenTrigger *tr;\n");
-  pH(3, "tr = new CWhenTrigger(%d, %d, %d, %d);\n",
-                   nodeNum, 
-                   stateVars->length(), nRefs, nAny);
+  op << "      CWhenTrigger *tr;\n";
+  op << "      tr = new CWhenTrigger(" << nodeNum << ", " <<
+        stateVars->length() << ", " << nRefs << ", " << nAny << ");\n";
   CStateVar *sv;
   int iArgs=0;
   for(sv=(CStateVar *)(stateVars->begin());!stateVars->end();sv=(CStateVar *)(stateVars->next())) {
-    pH(3, "tr->args[%d] = (size_t) %s;\n", iArgs++,
-                sv->name->charstar());
+    op << "      tr->args[" << iArgs++ << "] = (size_t) " <<
+          sv->name->charstar() << ";\n";
   }
   int iRef=0, iAny=0;
   for(el=(CParseNode *)(elist->begin()); !elist->end(); el=(CParseNode *)(elist->next())) {
     if(el->con2 == 0) {
-      pH(3, "tr->anyEntries[%d] = %d;\n", iAny++,
-                  el->entryPtr->entryNum);
+      op << "      tr->anyEntries[" << iAny++ << "] = " <<
+            el->entryPtr->entryNum << ";\n";
     } else {
-      pH(3, "tr->entries[%d] = %d;\n", iRef,
-                  el->entryPtr->entryNum);
-      pH(3, "tr->refnums[%d] = %s;\n", iRef++,
-                  el->con2->text->charstar());
+      op << "      tr->entries[" << iRef << "] = " << 
+            el->entryPtr->entryNum << ";\n";
+      op << "      tr->refnums[" << iRef++ << "] = " <<
+            el->con2->text->charstar() << ";\n";
     }
   }
-  pH(3, "__cDep->Register(tr);\n");
-  pH(3, "return 0;\n");
-  pH(2, "}\n");
+  op << "      __cDep->Register(tr);\n";
+  op << "      return 0;\n";
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(1, ") {\n");
+  op << "  }\n\n";
+  // end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
   for(el=(CParseNode *)(elist->begin()); !elist->end(); el=(CParseNode *)(elist->next())) {
-    // pH(2, "delete %s;\n", el->con4->text->charstar());
+    // op << "    delete " <<  el->con4->text->charstar() << ";\n";
   }
   if(nextBeginOrEnd == 1)
-   pH(2, "%s(", next->label->charstar());
+   op << "    " << next->label->charstar() << "(";
   else
-   pH(2, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
+   op << "    " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n\n");
+  op << "  }\n\n";
 }
 
-void CParseNode::generateWhile(void)
+void CParseNode::generateWhile(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "if (%s) {\n", con1->text->charstar());
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
-  pH(2, "} else {\n");
+  op << "    if (" << con1->text->charstar() << ") {\n";
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() << 
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "    } else {\n";
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
-  pH(2, "}\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(1, ") {\n");
+  op << "  }\n\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
-  pH(2, "if (%s) {\n", con1->text->charstar());
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
-  pH(2, "} else {\n");
+  op << "    if (" << con1->text->charstar() << ") {\n";
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "    } else {\n";
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " <<  next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
-  pH(2, "}\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n\n");
+  op << "  }\n\n";
 }
 
-void CParseNode::generateFor(void)
+void CParseNode::generateFor(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(0, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s;\n", con1->text->charstar());
-  pH(2, "if (%s) {\n", con2->text->charstar());
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(0, ");\n");
-  pH(2, "} else {\n");
+  op << "    " << con1->text->charstar() << ";\n";
+  op << "    if (" << con2->text->charstar() << ") {\n";
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "    } else {\n";
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(0, ");\n");
-  pH(2, "}\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(",  label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(0, ") {\n");
+  op << "  }\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s;\n", con3->text->charstar());
-  pH(2, "if (%s) {\n", con2->text->charstar());
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(0, ");\n");
-  pH(2, "} else {\n");
+  op << con3->text->charstar() << ";\n";
+  op << "    if (" << con2->text->charstar() << ") {\n";
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "    } else {\n";
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(0, ");\n");
-  pH(2, "}\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n");
+  op << "  }\n";
 }
 
-void CParseNode::generateIf(void)
+void CParseNode::generateIf(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "if (%s) {\n", con1->text->charstar());
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
-  pH(2, "} else {\n");
+  op << "    if (" << con1->text->charstar() << ") {\n";
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "    } else {\n";
   if (con2 != 0) {
-    pH(3, "%s(", con2->label->charstar());
-    generateCall(fh, stateVarsChildren);
-    pH(1, ");\n");
+    op << "      " << con2->label->charstar() << "(";
+    generateCall(op, stateVarsChildren);
+    op << ");\n";
   } else {
-    pH(3, "%s_end(", label->charstar());
-    generateCall(fh, stateVarsChildren);
-    pH(1, ");\n");
+    op << "      " << label->charstar() << "_end(";
+    generateCall(op, stateVarsChildren);
+    op << ");\n";
   }
-  pH(2, "}\n");
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(1, ") {\n");
+  op << "  }\n\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n\n");
+  op << "  }\n\n";
 }
 
-void CParseNode::generateElse(void)
+void CParseNode::generateElse(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
+  op << "    " << ((CParseNode *)constructs->front())->label->charstar() << 
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(1, ") {\n");
+  op << "  }\n\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n\n");
+  op << "  }\n\n";
 }
 
-void CParseNode::generateForall(void)
+void CParseNode::generateForall(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "int __first = (%s), __last = (%s), __stride = (%s);\n",
-              con2->text->charstar(), con3->text->charstar(),
-              con4->text->charstar());
-  pH(2, "if (__first > __last) {\n");
-  pH(3, "int __tmp=__first; __first=__last; __last=__tmp;\n");
-  pH(3, "__stride = -__stride;\n");
-  pH(2, "}\n");
-  pH(2, "CCounter *%s = new CCounter(__first,__last,__stride);\n", 
-              counter->charstar());
-  pH(2, "for(int %s=__first;%s<=__last;%s+=__stride) {\n",
-              con1->text->charstar(), con1->text->charstar(),
-              con1->text->charstar());
-  pH(3, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
-  pH(2, "}\n");
+  op << "    int __first = (" << con2->text->charstar() <<
+        "), __last = (" << con3->text->charstar() << 
+        "), __stride = (" << con4->text->charstar() << ");\n";
+  op << "    if (__first > __last) {\n";
+  op << "      int __tmp=__first; __first=__last; __last=__tmp;\n";
+  op << "      __stride = -__stride;\n";
+  op << "    }\n";
+  op << "    CCounter *" << counter->charstar() << 
+        " = new CCounter(__first,__last,__stride);\n"; 
+  op << "    for(int " << con1->text->charstar() << 
+        "=__first;" << con1->text->charstar() <<
+        "<=__last;" << con1->text->charstar() << "+=__stride) {\n";
+  op << "      " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
+  op << "    }\n";
   // end actual code
-  pH(1, "}\n\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(1, ") {\n");
+  op << "  }\n\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s->decrement();\n", counter->charstar());
-  pH(2, "if (%s->isDone()) {\n", counter->charstar());
-  pH(3, "delete %s;\n", counter->charstar());
+  op << "    " << counter->charstar() << "->decrement();\n";
+  op << "    if (" << counter->charstar() << "->isDone()) {\n";
+  op << "      delete " << counter->charstar() << ";\n";
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(2, "}\n}\n\n");
+  op << "    }\n  }\n\n";
 }
 
-void CParseNode::generateOlist(void)
+void CParseNode::generateOlist(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(",  label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(0, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "CCounter *%s = new CCounter(%d);\n", counter->charstar(),
-                                                      (CParseNode *)constructs->length());
+  op << "    CCounter *" << counter->charstar() << "= new CCounter(" <<
+        constructs->length() << ");\n";
   for(CParseNode *cn=(CParseNode *)(constructs->begin()); 
                      !constructs->end(); cn=(CParseNode *)(constructs->next())) {
-    pH(2, "%s(", cn->label->charstar());
-    generateCall(fh, stateVarsChildren);
-    pH(0, ");\n");
+    op << "    " << cn->label->charstar() << "(";
+    generateCall(op, stateVarsChildren);
+    op << ");\n";
   }
   // end actual code
-  pH(1, "}\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(0, ") {\n");
+  op << "  }\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s->decrement();\n", counter->charstar());
-  pH(2, "if (%s->isDone()) {\n", counter->charstar());
-  pH(3, "delete %s;\n", counter->charstar());
+  op << "    " << counter->charstar() << "->decrement();\n";
+  op << "    if (" << counter->charstar() << "->isDone()) {\n";
+  op << "      delete " << counter->charstar() << ";\n";
   if(nextBeginOrEnd == 1)
-   pH(3, "%s(", next->label->charstar());
+   op << "      " << next->label->charstar() << "(";
   else
-   pH(3, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(0, ");\n");
+   op << "      " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(2, "}\n");
-  pH(1, "}\n");
+  op << "    }\n";
+  op << "  }\n";
 }
 
-void CParseNode::generateOverlap(void)
+void CParseNode::generateOverlap(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(0, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(0, ");\n");
+  op << "    " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(0, ") {\n");
+  op << "  }\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
   if(nextBeginOrEnd == 1)
-   pH(2, "%s(", next->label->charstar());
+   op << "    " << next->label->charstar() << "(";
   else
-   pH(2, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(0, ");\n");
+   op << "    " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n");
+  op << "  }\n";
 }
 
-void CParseNode::generateSlist(void)
+void CParseNode::generateSlist(XStr& op)
 {
-  // header file: inlined start function
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(0, ") {\n");
+  // inlined start function
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(0, ");\n");
+  op << "    " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n");
-  // header file: inlined end function
-  pH(1, "void %s_end(", label->charstar());
-  generatePrototype(fh, stateVarsChildren);
-  pH(0, ") {\n");
+  op << "  }\n";
+  // inlined end function
+  op << "  void " << label->charstar() << "_end(";
+  generatePrototype(op, stateVarsChildren);
+  op << ") {\n";
   // actual code here 
   if(nextBeginOrEnd == 1)
-   pH(2, "%s(", next->label->charstar());
+   op << "    " << next->label->charstar() << "(";
   else
-   pH(2, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(0, ");\n");
+   op << "    " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n");
+  op << "  }\n";
 }
 
-void CParseNode::generateSdagEntry(void)
+void CParseNode::generateSdagEntry(XStr& op)
 {
   // header file
-  pH(0,"public:\n");
-  pH(1, "void %s(", con1->text->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
+  op << "public:\n";
+  op << "  void " << con1->text->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  pH(2, "%s(", ((CParseNode *)constructs->front())->label->charstar());
-  generateCall(fh, stateVarsChildren);
-  pH(1, ");\n");
+  op << "    " << ((CParseNode *)constructs->front())->label->charstar() <<
+        "(";
+  generateCall(op, stateVarsChildren);
+  op << ");\n";
   // end actual code
-  pH(1, "}\n\n");
-  pH(0,"private:\n");
-  pH(1, "void %s_end(", con1->text->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
+  op << "  }\n\n";
+  op << "private:\n";
+  op << "  void " << con1->text->charstar() << "_end(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
   // actual code here 
-  // pH(2, "delete %s;\n", con3->text->charstar());
+  // op << "    delete " << con3->text->charstar() << ";\n";
   // end actual code
-  pH(1, "}\n\n");
+  op << "  }\n\n";
 }
 
-void CParseNode::generateAtomic(void)
+void CParseNode::generateAtomic(XStr& op)
 {
-  pH(1, "void %s(", label->charstar());
-  generatePrototype(fh, stateVars);
-  pH(1, ") {\n");
-  pH(1, "%s\n", text->charstar());
+  op << "  void " << label->charstar() << "(";
+  generatePrototype(op, stateVars);
+  op << ") {\n";
+  op << "    " << text->charstar() << "\n";
   if(nextBeginOrEnd == 1)
-    pH(2, "%s(", next->label->charstar());
+    op << "    " << next->label->charstar() << "(";
   else
-    pH(2, "%s_end(", next->label->charstar());
-  generateCall(fh, stateVars);
-  pH(1, ");\n");
-  pH(1, "}\n\n");
+    op << "    " << next->label->charstar() << "_end(";
+  generateCall(op, stateVars);
+  op << ");\n";
+  op << "  }\n\n";
 }
 
-void CParseNode::generatePrototype(FILE *f, TList *list)
+void CParseNode::generatePrototype(XStr& op, TList *list)
 {
   CStateVar *sv;
   for(sv=(CStateVar *)(list->begin()); !list->end(); ) {
-    fprintf(f, "%s %s", sv->type->charstar(), sv->name->charstar());
+    op << sv->type->charstar() << " " << sv->name->charstar();
     sv = (CStateVar *)list->next();
     if (sv != 0)
-      fprintf(f, ", ");
+      op << ", ";
   }
 }
 
-void CParseNode::generateCall(FILE *f, TList *list) {
+void CParseNode::generateCall(XStr& op, TList *list) {
   CStateVar *sv;
   for(sv=(CStateVar *)list->begin(); !list->end(); ) {
-    fprintf(f, "%s", sv->name->charstar());
+    op << sv->name->charstar();
     sv = (CStateVar *)list->next();
     if (sv != 0)
-      fprintf(f, ", ");
+      op << ", ";
   }
 }
 
index ca3068f54a429dc370bbad12464e8efa0df57e1a..b8fcf89b3db5a4e7efa32626e348c4c4a1dff6be 100644 (file)
@@ -10,8 +10,7 @@
 
 void CParsedFile::print(int indent)
 {
-  sourceFile->print(indent);
-  printf(":\nclass ");
+  printf("class ");
   className->print(indent);
   printf("\n");
   for(CEntry *ce=(CEntry *)(entryList->begin()); !entryList->end(); ce=(CEntry *)(entryList->next()))
@@ -54,32 +53,32 @@ void CParsedFile::generateEntryList(void)
   }
 }
 
-void CParsedFile::generateCode(void)
+void CParsedFile::generateCode(XStr& op)
 {
   for(CParseNode *cn=(CParseNode *)(nodeList->begin()); !nodeList->end(); cn=(CParseNode *)(nodeList->next())) {
     cn->setNext(0,0);
-    cn->generateCode();
+    cn->generateCode(op);
   }
 }
 
-void CParsedFile::generateEntries(void)
+void CParsedFile::generateEntries(XStr& op)
 {
   CEntry *en;
-  pH(0,"public:\n");
+  op << "public:\n";
   for(en=(CEntry *)(entryList->begin()); !entryList->end(); en=(CEntry *)(entryList->next())) {
-    en->generateCode(className);
+    en->generateCode(op);
   }
 }
 
-void CParsedFile::generateInitFunction(void)
+void CParsedFile::generateInitFunction(XStr& op)
 {
-  pH(0,"private:\n");
-  pH(1,"CDep *__cDep;\n");
-  pH(1,"void __sdag_init(void) {\n");
-  pH(2,"__cDep = new CDep(%d, %d);\n", numEntries, numWhens);
+  op << "private:\n";
+  op << "  CDep *__cDep;\n";
+  op << "  void __sdag_init(void) {\n";
+  op << "    __cDep = new CDep("<<numEntries<<","<<numWhens<<");\n";
   CEntry *en;
   for(en=(CEntry *)(entryList->begin()); !entryList->end(); en=(CEntry *)(entryList->next())) {
-    en->generateDeps();
+    en->generateDeps(op);
   }
-  pH(1,"}\n");
+  op << "  }\n";
 }
index f84a5392e461d391681f5bd9958b06361eb2775d..12c9df7aab682be5e840695fb42972a6c3c49a50 100644 (file)
@@ -21,33 +21,27 @@ class CParsedFile {
     void labelNodes(void);
     void propogateState(void);
     void generateEntryList(void);
-    void generateCode(void);
-    void generateEntries(void);
-    void generateInitFunction(void);
+    void generateCode(XStr& output);
+    void generateEntries(XStr& output);
+    void generateInitFunction(XStr& output);
   public:
     XStr *className;
-    XStr *sourceFile;
     TList *entryList;
     TList *nodeList;
-    CParsedFile(char *sFile): className(0) {
-      sourceFile = new XStr(sFile);
+    CParsedFile(void): className(0) {
       entryList = new TList();
       nodeList = new TList();
     }
     ~CParsedFile(void){}
     void print(int indent);
-    void doProcess(void) {
+    void doProcess(XStr& output) {
       numberNodes();
       labelNodes();
       propogateState();
       generateEntryList();
-      XStr *fhname = new XStr(sourceFile->charstar());
-      fhname->append(".h");
-      fh = fopen(fhname->charstar(), "w");
-      generateCode();
-      generateEntries();
-      generateInitFunction();
-      fclose(fh);
+      generateCode(output);
+      generateEntries(output);
+      generateInitFunction(output);
     }
 };
 
index c7c6bf0bb0bb50fbb8a8c6301f6a10f8b9e356ad..554aef8913226d9e0732da2b45b516f1b89a10ae 100644 (file)
@@ -72,7 +72,7 @@ CToken *CParser::lookForStatement(void)
 
 CParsedFile *CParser::doParse(void)
 {
-  CParsedFile *cParsedFile = new CParsedFile(sourceFile);
+  CParsedFile *cParsedFile = new CParsedFile();
   CToken *tok;
 
   tok = lookForToken(CLASS); delete tok;
index c3f4c468bb280f45daff7eaeba86ef32e8c6903d..fccd24aaecbc61555a47841980b913d4a34fd8d6 100644 (file)
 #include "CParsedFile.h"
 #include "CToken.h"
 #include "sdag-globals.h"
+#include "xi-util.h"
 
 class CParser {
   private:
     CLexer *cLexer;
-    char *sourceFile;
 
   public:
-    CParser(char *filename) {
-      sourceFile = filename;
-      cLexer = new CLexer();
-      if(cLexer->sourceFile(filename) == 0) {
-        fprintf(stderr, "sdagx: Cannot open file %s for reading !\n", filename);
-        exit(1);
-      }
+    CParser(XStr& input) {
+      cLexer = new CLexer(input.charstar());
     }
 
     ~CParser(void) {;}
index e3f8038e2660d86ea81440f9ea3e8f7118e1cbfb..dd74715304d552471cb2b5362ea95cb2912a23bf 100644 (file)
@@ -28,19 +28,6 @@ int numWhiles=0;
 int numAtomics=0;
 int numForalls=0;
 
-FILE *fh;
-
-void pH(int indent, const char *format, ...)
-{
-  va_list args;
-
-  va_start(args, format);
-  for(int i=0;i<indent;i++)
-    fprintf(fh, "  ");
-  vfprintf(fh, format, args);
-  va_end(args);
-}
-
 void resetNumbers(void)
 {
   numSdagEntries=0;
index a86e4bfb9e3fd52b3ef9edd31a429788a03f29cb..7112f407d3980153d70785130f281b739a0574d4 100644 (file)
@@ -12,6 +12,7 @@
 #include "CParsedFile.h"
 #include "CParser.h"
 #include "sdag-globals.h"
+#include "xi-util.h"
 
 void Usage(void)
 {
@@ -26,10 +27,28 @@ int main(int argc, char *argv[])
   }
   for(int i=1; i<argc; i++) {
     resetNumbers();
+    XStr input, output;
     // printf("%s:\n", argv[i]);
-    CParser *cParser = new CParser(argv[i]);
+    FILE *fp = fopen(argv[i], "r");
+    if(fp == 0) {
+      fprintf(stderr, "sdagx: cannot open %s for reading !!\n", argv[i]);
+      exit(1);
+    }
+    char str[1024], *s;
+    while(0 != (s=fgets(str,1024,fp)))
+      input << str;
+    fclose(fp);
+    CParser *cParser = new CParser(input);
     CParsedFile *parsedFile = cParser->doParse();
-    parsedFile->doProcess();
+    parsedFile->doProcess(output);
+    sprintf(str, "%s.h", argv[i]);
+    fp = fopen(str, "w");
+    if(fp ==0) {
+      fprintf(stderr, "sdagx: cannot open %s for writing !!\n", str);
+      exit(1);
+    }
+    fprintf(fp, "%s", output.charstar());
+    fclose(fp);
     // parsedFile->print(0);
     delete parsedFile;
     delete cParser;