Accidentally checked this file in...removing it now.
[repair.git] / Repair / RepairInterpreter / dparser.cc
1 #include <stdlib.h>
2 #include "dparser.h"
3 #include "list.h"
4 #include "common.h"
5 #include "token.h"
6 #include "dmodel.h"
7
8 Dparser::Dparser(Reader *r) {
9   reader=r;
10 }
11
12 DomainRelation *Dparser::parsesetrelation() {
13   List *sets=new List();
14   List *relations=new List();
15   for(Token t=reader->peakahead();t.token_type!=TOKEN_EOF;t=reader->peakahead()) {
16     switch(t.token_type) {
17     case TOKEN_EOL:
18       skiptoken();
19       break;
20     case TOKEN_SET:
21       sets->addobject(parseset());
22       break;
23     default:
24       relations->addobject(parserelation());
25     }
26   }
27   DomainSet **dsarray=new DomainSet*[sets->size()];
28   DRelation **drarray=new DRelation*[relations->size()];
29   sets->toArray((void **)dsarray);
30   relations->toArray((void **)drarray);
31   DomainRelation *dr=new DomainRelation(dsarray,sets->size(),
32                                         drarray,relations->size());
33   delete(sets);
34   delete(relations);
35   return dr;
36 }
37
38 DomainSet * Dparser::parseset() {
39   needtoken(TOKEN_SET);
40   Token name=reader->readnext();
41   DomainSet *ds=new DomainSet(copystr(name.str));
42   //  Token istype=reader->peakahead();
43   //  if (istype.token_type==TOKEN_OPENPAREN) {
44   //skiptoken();
45   needtoken(TOKEN_OPENPAREN);
46   ds->settype(copystr(reader->readnext().str));
47   needtoken(TOKEN_CLOSEPAREN);
48     //}
49   needtoken(TOKEN_COLON);
50   bool ispart=(reader->peakahead().token_type==TOKEN_PARTITION);
51   if (ispart)
52     skiptoken();
53   bool needset=false;
54   bool cont=true;
55   List *subsets=new List();
56   while(cont) {
57     Token t=reader->peakahead();
58     switch(t.token_type) {
59     case TOKEN_EOF:
60       if (!needset) {
61         printf("ERROR: Need set name");
62         exit(-1);
63       }
64       cont=false;
65       break;
66     case TOKEN_EOL:
67       if (!needset)
68         cont=false;
69       skiptoken();
70       break;
71     case TOKEN_BAR:
72       needset=true;
73       skiptoken();
74       break;
75     default:
76       subsets->addobject(copystr(t.str));
77       skiptoken();
78       needset=false;
79     }
80   }
81   char **carray=new char*[subsets->size()];
82   subsets->toArray((void **)carray);
83   if (ispart)
84     ds->setpartition(carray,subsets->size());
85   else 
86     ds->setsubsets(carray,subsets->size());
87   delete(subsets);
88   return ds;
89 }
90
91 DRelation * Dparser::parserelation() {
92   Token name=reader->readnext();
93   bool isstat=false;
94   if (name.token_type==TOKEN_STATIC) {
95     isstat=true;
96     name=reader->readnext();
97   }
98   needtoken(TOKEN_COLON);
99   Token domain=reader->readnext();
100   needtoken(TOKEN_ARROW);
101   Token range=reader->readnext();
102   needtoken(TOKEN_OPENPAREN);
103   Token domainmult=reader->readnext();
104   needtoken(TOKEN_ARROW);
105   Token rangemult=reader->readnext();
106   needtoken(TOKEN_CLOSEPAREN);
107   int type=0;
108   if (domainmult.token_type==TOKEN_ONE)
109     type+=0x1;
110   else if (domainmult.token_type==TOKEN_MANY)
111     type+=0x2;
112   else error();
113
114   if (rangemult.token_type==TOKEN_ONE)
115     type+=0x10;
116   else if (rangemult.token_type==TOKEN_MANY)
117     type+=0x20;
118   else error();
119
120   return new DRelation(copystr(name.str),copystr(domain.str),
121                        copystr(range.str),type,isstat);
122 }
123
124 void Dparser::error() {
125   printf("ERROR\n");
126   reader->error();
127   exit(-1);
128 }
129
130 void Dparser::skiptoken() {
131   reader->readnext();
132 }
133
134 void Dparser::needtoken(int token) {
135   Token t=reader->readnext();
136   if (!(t.token_type==token)) {
137     printf("Needed token: ");
138     tokenname(token);
139     printf("\n Got token: %s ",t.str);
140     tokenname(t.token_type);
141     error();
142   }
143 }