8 Dparser::Dparser(Reader *r) {
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) {
21 sets->addobject(parseset());
24 relations->addobject(parserelation());
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());
38 DomainSet * Dparser::parseset() {
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) {
45 needtoken(TOKEN_OPENPAREN);
46 ds->settype(copystr(reader->readnext().str));
47 needtoken(TOKEN_CLOSEPAREN);
49 needtoken(TOKEN_COLON);
50 bool ispart=(reader->peakahead().token_type==TOKEN_PARTITION);
55 List *subsets=new List();
57 Token t=reader->peakahead();
58 switch(t.token_type) {
61 printf("ERROR: Need set name");
76 subsets->addobject(copystr(t.str));
81 char **carray=new char*[subsets->size()];
82 subsets->toArray((void **)carray);
84 ds->setpartition(carray,subsets->size());
86 ds->setsubsets(carray,subsets->size());
91 DRelation * Dparser::parserelation() {
92 Token name=reader->readnext();
94 if (name.token_type==TOKEN_STATIC) {
96 name=reader->readnext();
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);
108 if (domainmult.token_type==TOKEN_ONE)
110 else if (domainmult.token_type==TOKEN_MANY)
114 if (rangemult.token_type==TOKEN_ONE)
116 else if (rangemult.token_type==TOKEN_MANY)
120 return new DRelation(copystr(name.str),copystr(domain.str),
121 copystr(range.str),type,isstat);
124 void Dparser::error() {
130 void Dparser::skiptoken() {
134 void Dparser::needtoken(int token) {
135 Token t=reader->readnext();
136 if (!(t.token_type==token)) {
137 printf("Needed token: ");
139 printf("\n Got token: %s ",t.str);
140 tokenname(t.token_type);