12 AParser::AParser(Reader *r) {
16 Rule * AParser::parserule() {
17 Token token=reader->peakahead();
18 while(token.token_type==TOKEN_EOL) {
20 token=reader->peakahead();
22 if (token.token_type==TOKEN_EOF)
24 bool delay=false;bool staticrule=false;
25 if (token.token_type==TOKEN_DELAY||token.token_type==TOKEN_STATIC) {
26 /* both shouldn't be allowed..doesn't make sense...*/
27 if(token.token_type==TOKEN_DELAY)
32 token=reader->peakahead();
36 if (token.token_type==TOKEN_OPENBRACK) {
39 needtoken(TOKEN_COMMA);
45 for(int i=0;i<c->numquants();i++) {
46 AQuantifier *aq=c->getquant(i);
47 switch(aq->gettype()) {
48 case AQUANTIFIER_SING:
53 case AQUANTIFIER_RANGE:
62 /*Peek ahead to see if sizeof*/
63 c->setstatementa(parsestatementa(false));
64 needtoken(TOKEN_IMPLIES);
65 c->setstatementb(parsestatementb());
69 TypeEle * AParser::parsetypeele() {
70 Token type=reader->readnext();
71 needtoken(TOKEN_OPENPAREN);
72 List *list=new List();
74 Token token=reader->peakahead();
75 switch(token.token_type) {
76 case TOKEN_CLOSEPAREN: {
78 AElementexpr** larray=new AElementexpr* [list->size()];
79 list->toArray((void **)larray);
80 TypeEle *t=new TypeEle(copystr(type.str),list->size(),larray);
85 list->addobject(parseaelementexpr(false));
86 if (reader->peakahead().token_type!=TOKEN_CLOSEPAREN)
87 needtoken(TOKEN_COMMA);
93 Type * AParser::parsetype() {
94 Token type=reader->readnext();
95 needtoken(TOKEN_OPENPAREN);
96 List *list=new List();
98 Token token=reader->readnext();
99 switch(token.token_type) {
100 case TOKEN_CLOSEPAREN:
102 Label** larray=new Label* [list->size()];
103 list->toArray((void **)larray);
104 Type *t=new Type(copystr(type.str),list->size(),larray);
109 list->addobject(new Label(copystr(token.str)));
110 if (reader->peakahead().token_type!=TOKEN_CLOSEPAREN)
111 needtoken(TOKEN_COMMA);
117 Statementa * AParser::parsestatementa(bool flag) {
118 Statementa * oldst=NULL;
119 AElementexpr *oldee=NULL;
123 Token token=reader->peakahead();
124 switch(token.token_type) {
127 case TOKEN_OPENPAREN:
130 Statementa *st=parsestatementa(false);
136 if (joinflag==TOKEN_AND) {
137 oldst=new Statementa(oldst, st, STATEMENTA_AND);
138 } else if (joinflag==TOKEN_OR) {
139 oldst=new Statementa(oldst, st, STATEMENTA_OR);
149 case TOKEN_CLOSEPAREN:
154 if (oldst==NULL) error();
159 if (oldst==NULL) error();
165 Statementa *st=new Statementa();
171 if (joinflag==TOKEN_AND) {
172 oldst=new Statementa(oldst, st, STATEMENTA_AND);
173 } else if (joinflag==TOKEN_OR) {
174 oldst=new Statementa(oldst, st, STATEMENTA_OR);
185 Statementa * st=new Statementa(parsestatementa(true));
191 if (joinflag==TOKEN_AND) {
192 oldst=new Statementa(oldst, st, STATEMENTA_AND);
193 } else if (joinflag==TOKEN_OR) {
194 oldst=new Statementa(oldst, st, STATEMENTA_OR);
205 if (oldee==NULL||eeflag!=-1)
207 Statementa * st=new Statementa(oldee,s);
214 if (joinflag==TOKEN_AND) {
215 oldst=new Statementa(oldst, st, STATEMENTA_AND);
216 } else if (joinflag==TOKEN_OR) {
217 oldst=new Statementa(oldst, st, STATEMENTA_OR);
225 case TOKEN_ISVALID: {
226 if (oldee!=NULL) error();
228 needtoken(TOKEN_OPENPAREN);
229 AElementexpr *ae=parseaelementexpr(false);
230 Token t=reader->peakahead();
232 if (t.token_type==TOKEN_COMMA) {
234 Token t2=reader->readnext();
235 type=copystr(t2.str);
237 Statementa *st=new Statementa(ae, type);
238 needtoken(TOKEN_CLOSEPAREN);
244 if (joinflag==TOKEN_AND) {
245 oldst=new Statementa(oldst, st, STATEMENTA_AND);
246 } else if (joinflag==TOKEN_OR) {
247 oldst=new Statementa(oldst, st, STATEMENTA_OR);
257 if (oldee==NULL) error();
258 eeflag=STATEMENTA_EQUALS;
262 if (oldee==NULL) error();
263 eeflag=STATEMENTA_LT;
266 if ((oldee!=NULL) && (eeflag==-1))
268 else if ((oldee==NULL)&&(eeflag==-1))
269 oldee=parseaelementexpr(false);
271 /*oldee!=NULL, and joinee!=-1*/
272 Statementa * sa=new Statementa(oldee, parseaelementexpr(false), eeflag);
279 if (joinflag==TOKEN_AND) {
280 oldst=new Statementa(oldst, sa, STATEMENTA_AND);
281 } else if (joinflag==TOKEN_OR) {
282 oldst=new Statementa(oldst, sa, STATEMENTA_OR);
294 AElementexpr * AParser::checkdot(AElementexpr * incoming) {
295 Token tdot=reader->peakahead();
296 if (tdot.token_type!=TOKEN_DOT) return incoming;
298 Token tfield=reader->readnext();
299 Token tpeak=reader->peakahead();
300 if (tpeak.token_type==TOKEN_OPENBRACK) {
302 AElementexpr *index=parseaelementexpr(false);
303 return checkdot(new AElementexpr(incoming, new Field(copystr(tfield.str)),index));
305 return checkdot(new AElementexpr(incoming, new Field(copystr(tfield.str))));
309 AElementexpr * AParser::parseaelementexpr(bool isquant) {
310 AElementexpr *oldee=NULL;
313 Token t=reader->peakahead();
314 switch(t.token_type) {
317 if ((joinop==-1)&&(oldee!=NULL))
320 needtoken(TOKEN_OPENPAREN);
321 Token literal=reader->readnext();
322 needtoken(TOKEN_CLOSEPAREN);
324 oldee=new AElementexpr(new Literal(copystr(literal.str)));
327 oldee=new AElementexpr(oldee,new AElementexpr(new Literal(copystr(literal.str))),joinop);
335 if ((joinop==-1)&&(oldee!=NULL))
338 needtoken(TOKEN_OPENPAREN);
339 Token casttype=reader->readnext();
340 needtoken(TOKEN_COMMA);
341 AElementexpr *ee=parseaelementexpr(false);
342 AElementexpr *tee=checkdot(new AElementexpr(copystr(casttype.str),ee));
347 oldee=new AElementexpr(oldee,tee,joinop);
354 case TOKEN_OPENPAREN:
356 if ((joinop==-1)&&(oldee!=NULL))
359 AElementexpr *ee=checkdot(parseaelementexpr(false));
364 oldee=new AElementexpr(oldee,ee,joinop);
370 case TOKEN_CLOSEBRACK:
375 case TOKEN_CLOSEPAREN:
380 if ((oldee!=NULL)&&(joinop==-1))
381 joinop=AELEMENTEXPR_SUB;
387 if ((oldee!=NULL)&&(joinop==-1))
388 joinop=AELEMENTEXPR_ADD;
394 if ((oldee!=NULL)&&(joinop==-1))
395 joinop=AELEMENTEXPR_MULT;
401 if ((oldee!=NULL)&&(joinop==-1))
402 joinop=AELEMENTEXPR_DIV;
407 if ((joinop==-1)&&(oldee!=NULL))
411 oldee=checkdot(new AElementexpr());
414 oldee=new AElementexpr(oldee,checkdot(new AElementexpr()),joinop);
420 if ((joinop==-1)&&(oldee!=NULL))
424 oldee=checkdot(new AElementexpr(new Label(copystr(t.str))));
427 oldee=new AElementexpr(oldee,checkdot(new AElementexpr(new Label(copystr(t.str)))),joinop);
435 Statementb * AParser::parsestatementb() {
436 Token t=reader->peakahead();
437 if (t.token_type==TOKEN_LT) {
439 Token tpeak=reader->peakahead();
440 TypeEle *typel=NULL,*typer=NULL;
441 if (tpeak.token_type==TOKEN_OPENPAREN) {
443 typel=parsetypeele();
444 needtoken(TOKEN_CLOSEPAREN);
446 AElementexpr *ael=parseaelementexpr(false);
447 needtoken(TOKEN_COMMA);
448 if (tpeak.token_type==TOKEN_OPENPAREN) {
450 typer=parsetypeele();
451 needtoken(TOKEN_CLOSEPAREN);
453 AElementexpr *aer=parseaelementexpr(false);
456 Token setlabel=reader->readnext();
457 return new Statementb(typel,ael,typer,aer,new Setlabel(copystr(setlabel.str)));
461 if (t.token_type==TOKEN_OPENPAREN) {
464 needtoken(TOKEN_CLOSEPAREN);
466 AElementexpr *ae=parseaelementexpr(false);
468 Token setlabel=reader->readnext();
469 return new Statementb(type,ae,new Setlabel(copystr(setlabel.str)));
472 void AParser::error() {
478 void AParser::skiptoken() {
482 void AParser::needtoken(int token) {
483 Token t=reader->readnext();
484 if (!(t.token_type==token)) {
485 printf("Needed token: ");
487 printf("\n Got token: %s ",t.str);
488 tokenname(t.token_type);
493 Rule * AParser::parsequantifiers() {
494 bool bool_continue=true;
495 List * list=new List();
497 Token token2=reader->readnext();
498 switch(token2.token_type) {
499 case TOKEN_CLOSEBRACK:
503 list->addobject(parsequantifier());
506 list->addobject(parsequantifierfor());
512 } while(bool_continue);
513 AQuantifier** qarray=new AQuantifier* [list->size()];
514 list->toArray((void **)qarray);
515 Rule *c=new Rule(qarray,list->size());
520 AQuantifier * AParser::parsequantifier() {
521 Token token=reader->peakahead();
522 if (token.token_type==TOKEN_LT) {
524 Type *tl=NULL, *tr=NULL;
525 if (token.token_type==TOKEN_OPENPAREN) {
528 needtoken(TOKEN_CLOSEPAREN);
530 Token labell=reader->readnext();
531 needtoken(TOKEN_COMMA);
533 if (token.token_type==TOKEN_OPENPAREN) {
536 needtoken(TOKEN_CLOSEPAREN);
538 Token labelr=reader->readnext();
542 return new AQuantifier(new Label(copystr(labell.str)),tl,new Label(copystr(labelr.str)),tr,parseset());
545 if (token.token_type==TOKEN_OPENPAREN) {
548 needtoken(TOKEN_CLOSEPAREN);
550 Token label=reader->readnext();
552 return new AQuantifier(new Label(copystr(label.str)),t,parseset());
556 AQuantifier * AParser::parsequantifierfor() {
557 Token label=reader->readnext();
558 needtoken(TOKEN_EQUALS);
559 AElementexpr *lower=parseaelementexpr(false);
561 AElementexpr *upper=parseaelementexpr(true);
562 return new AQuantifier(new Label(copystr(label.str)),lower,upper);
565 Set * AParser::parseset() {
566 Token label=reader->readnext();
567 if (label.token_type==TOKEN_OPENBRACE) {
568 bool bool_continue=true;
569 List * list=new List();
571 Token token2=reader->readnext();
572 switch(token2.token_type) {
573 case TOKEN_CLOSEBRACE:
579 list->addobject(new Literal(copystr(token2.str)));
582 } while(bool_continue);
583 int size=list->size();
584 Literal** qarray=new Literal* [size];
585 list->toArray((void **)qarray);
587 return new Set(qarray,size);
589 return new Set(new Setlabel(copystr(label.str)));