Moved the interpreter
[repair.git] / Repair / RepairInterpreter / dparser.cc
diff --git a/Repair/RepairInterpreter/dparser.cc b/Repair/RepairInterpreter/dparser.cc
new file mode 100755 (executable)
index 0000000..c84f3b2
--- /dev/null
@@ -0,0 +1,143 @@
+#include <stdlib.h>
+#include "dparser.h"
+#include "list.h"
+#include "common.h"
+#include "token.h"
+#include "dmodel.h"
+
+Dparser::Dparser(Reader *r) {
+  reader=r;
+}
+
+DomainRelation *Dparser::parsesetrelation() {
+  List *sets=new List();
+  List *relations=new List();
+  for(Token t=reader->peakahead();t.token_type!=TOKEN_EOF;t=reader->peakahead()) {
+    switch(t.token_type) {
+    case TOKEN_EOL:
+      skiptoken();
+      break;
+    case TOKEN_SET:
+      sets->addobject(parseset());
+      break;
+    default:
+      relations->addobject(parserelation());
+    }
+  }
+  DomainSet **dsarray=new DomainSet*[sets->size()];
+  DRelation **drarray=new DRelation*[relations->size()];
+  sets->toArray((void **)dsarray);
+  relations->toArray((void **)drarray);
+  DomainRelation *dr=new DomainRelation(dsarray,sets->size(),
+                                       drarray,relations->size());
+  delete(sets);
+  delete(relations);
+  return dr;
+}
+
+DomainSet * Dparser::parseset() {
+  needtoken(TOKEN_SET);
+  Token name=reader->readnext();
+  DomainSet *ds=new DomainSet(copystr(name.str));
+  //  Token istype=reader->peakahead();
+  //  if (istype.token_type==TOKEN_OPENPAREN) {
+  //skiptoken();
+  needtoken(TOKEN_OPENPAREN);
+  ds->settype(copystr(reader->readnext().str));
+  needtoken(TOKEN_CLOSEPAREN);
+    //}
+  needtoken(TOKEN_COLON);
+  bool ispart=(reader->peakahead().token_type==TOKEN_PARTITION);
+  if (ispart)
+    skiptoken();
+  bool needset=false;
+  bool cont=true;
+  List *subsets=new List();
+  while(cont) {
+    Token t=reader->peakahead();
+    switch(t.token_type) {
+    case TOKEN_EOF:
+      if (!needset) {
+       printf("ERROR: Need set name");
+       exit(-1);
+      }
+      cont=false;
+      break;
+    case TOKEN_EOL:
+      if (!needset)
+       cont=false;
+      skiptoken();
+      break;
+    case TOKEN_BAR:
+      needset=true;
+      skiptoken();
+      break;
+    default:
+      subsets->addobject(copystr(t.str));
+      skiptoken();
+      needset=false;
+    }
+  }
+  char **carray=new char*[subsets->size()];
+  subsets->toArray((void **)carray);
+  if (ispart)
+    ds->setpartition(carray,subsets->size());
+  else 
+    ds->setsubsets(carray,subsets->size());
+  delete(subsets);
+  return ds;
+}
+
+DRelation * Dparser::parserelation() {
+  Token name=reader->readnext();
+  bool isstat=false;
+  if (name.token_type==TOKEN_STATIC) {
+    isstat=true;
+    name=reader->readnext();
+  }
+  needtoken(TOKEN_COLON);
+  Token domain=reader->readnext();
+  needtoken(TOKEN_ARROW);
+  Token range=reader->readnext();
+  needtoken(TOKEN_OPENPAREN);
+  Token domainmult=reader->readnext();
+  needtoken(TOKEN_ARROW);
+  Token rangemult=reader->readnext();
+  needtoken(TOKEN_CLOSEPAREN);
+  int type=0;
+  if (domainmult.token_type==TOKEN_ONE)
+    type+=0x1;
+  else if (domainmult.token_type==TOKEN_MANY)
+    type+=0x2;
+  else error();
+
+  if (rangemult.token_type==TOKEN_ONE)
+    type+=0x10;
+  else if (rangemult.token_type==TOKEN_MANY)
+    type+=0x20;
+  else error();
+
+  return new DRelation(copystr(name.str),copystr(domain.str),
+                      copystr(range.str),type,isstat);
+}
+
+void Dparser::error() {
+  printf("ERROR\n");
+  reader->error();
+  exit(-1);
+}
+
+void Dparser::skiptoken() {
+  reader->readnext();
+}
+
+void Dparser::needtoken(int token) {
+  Token t=reader->readnext();
+  if (!(t.token_type==token)) {
+    printf("Needed token: ");
+    tokenname(token);
+    printf("\n Got token: %s ",t.str);
+    tokenname(t.token_type);
+    error();
+  }
+}