11 Constraint * Parser::parseconstraint() {
12 Token token=reader->peakahead();
13 while(token.token_type==TOKEN_EOL) {
15 token=reader->peakahead();
17 if (token.token_type==TOKEN_EOF)
20 if (token.token_type==TOKEN_CRASH) {
26 if (token.token_type==TOKEN_OPENBRACK) {
29 needtoken(TOKEN_COMMA);
30 } else c=new Constraint();
31 /*Peek ahead to see if sizeof*/
33 c->setstatement(parsestatement(false));
37 Statement * Parser::parsestatement(bool flag) {
38 Statement * oldst=NULL;
41 Token token=reader->peakahead();
42 switch(token.token_type) {
49 Statement *st=parsestatement(false);
55 if (joinflag==TOKEN_AND) {
56 oldst=new Statement(oldst, st, STATEMENT_AND);
57 } else if (joinflag==TOKEN_OR) {
58 oldst=new Statement(oldst, st, STATEMENT_OR);
66 case TOKEN_CLOSEPAREN:
71 if (oldst==NULL) error();
76 if (oldst==NULL) error();
82 Statement * st=new Statement(parsestatement(true));
88 if (joinflag==TOKEN_AND) {
89 oldst=new Statement(oldst, st, STATEMENT_AND);
90 } else if (joinflag==TOKEN_OR) {
91 oldst=new Statement(oldst, st, STATEMENT_OR);
101 Statement * st=new Statement(parsepredicate());
106 if (joinflag==TOKEN_AND) {
107 oldst=new Statement(oldst, st, STATEMENT_AND);
108 } else if (joinflag==TOKEN_OR) {
109 oldst=new Statement(oldst, st, STATEMENT_OR);
118 Elementexpr * Parser::parseelementexpr() {
119 Elementexpr *oldee=NULL;
122 Token t=reader->peakahead();
123 switch(t.token_type) {
126 if ((joinop==-1)&&(oldee!=NULL))
129 needtoken(TOKEN_OPENPAREN);
130 Setexpr* se=parsesetexpr();
131 needtoken(TOKEN_CLOSEPAREN);
133 oldee=new Elementexpr(se);
136 oldee=new Elementexpr(oldee,new Elementexpr(se),joinop);
144 if ((joinop==-1)&&(oldee!=NULL))
147 needtoken(TOKEN_OPENPAREN);
148 Token literal=reader->readnext();
149 needtoken(TOKEN_CLOSEPAREN);
151 oldee=new Elementexpr(new Literal(copystr(literal.str)));
154 oldee=new Elementexpr(oldee,new Elementexpr(new Literal(copystr(literal.str))),joinop);
162 if ((joinop==-1)&&(oldee!=NULL))
165 needtoken(TOKEN_OPENPAREN);
166 Elementexpr *ee=parseelementexpr();
167 needtoken(TOKEN_COMMA);
168 Token number=reader->readnext();
169 needtoken(TOKEN_CLOSEPAREN);
172 oldee=new Elementexpr(ee,new Literal(copystr(number.str)));
175 oldee=new Elementexpr(oldee,new Elementexpr(ee,new Literal(copystr(number.str))),joinop);
182 case TOKEN_OPENPAREN:
184 if ((joinop==-1)&&(oldee!=NULL))
187 Elementexpr *ee=parseelementexpr();
192 oldee=new Elementexpr(oldee,ee,joinop);
198 case TOKEN_CLOSEPAREN:
204 if ((oldee!=NULL)&&(joinop==-1))
205 joinop=ELEMENTEXPR_SUB;
211 if ((oldee!=NULL)&&(joinop==-1))
212 joinop=ELEMENTEXPR_ADD;
218 if ((oldee!=NULL)&&(joinop==-1))
219 joinop=ELEMENTEXPR_MULT;
224 if ((joinop==-1)&&(oldee!=NULL))
228 oldee=checkdot(new Elementexpr(new Label(copystr(t.str))));
231 oldee=new Elementexpr(oldee,new Elementexpr(new Label(copystr(t.str))),joinop);
239 Elementexpr * Parser::checkdot(Elementexpr * incoming) {
240 Token tdot=reader->peakahead();
241 if (tdot.token_type!=TOKEN_DOT) return incoming;
243 Token tfield=reader->readnext();
244 Token tpeak=reader->peakahead();
245 return checkdot(new Elementexpr(incoming, new Relation(copystr(tfield.str))));
248 Predicate * Parser::parsepredicate() {
249 Token label=reader->readnext();
251 if (label.token_type==TOKEN_SIZEOF) {
252 needtoken(TOKEN_OPENPAREN);
253 Setexpr * setexpr=parsesetexpr();
254 needtoken(TOKEN_CLOSEPAREN);
255 Token tokentest=reader->readnext();
256 bool greaterthan=false;
257 switch(tokentest.token_type) {
267 needtoken(TOKEN_ONE);
268 return new Predicate(greaterthan, setexpr);
271 Token nexttoken=reader->readnext();
273 switch(nexttoken.token_type) {
278 Token relation=reader->readnext();
279 Token compareop=reader->readnext();
280 Valueexpr *ve=new Valueexpr(new Label(copystr(label.str)),
281 new Relation(copystr(relation.str)),inverted);
282 while(compareop.token_type==TOKEN_DOT||compareop.token_type==TOKEN_DOTINV) {
283 Token nrelation=reader->readnext();
284 bool invert=(compareop.token_type==TOKEN_DOTINV);
285 compareop=reader->readnext();
287 new Relation(copystr(nrelation.str)),invert);
289 Elementexpr * ee=parseelementexpr();
292 switch(compareop.token_type) {
294 return new Predicate(ve,PREDICATE_LT,ee);
296 return new Predicate(ve,PREDICATE_LTE,ee);
298 return new Predicate(ve,PREDICATE_EQUALS,ee);
300 return new Predicate(ve,PREDICATE_GTE,ee);
302 return new Predicate(ve,PREDICATE_GT,ee);
309 Setexpr * se=parsesetexpr();
310 return new Predicate(new Label(copystr(label.str)),se);
317 void Parser::error() {
323 void Parser::skiptoken() {
327 void Parser::needtoken(int token) {
328 Token t=reader->readnext();
329 if (!(t.token_type==token)) {
330 printf("Needed token: ");
332 printf("\n Got token: %s ",t.str);
333 tokenname(t.token_type);
338 Constraint * Parser::parsequantifiers() {
339 bool bool_continue=true;
340 List * list=new List();
342 Token token2=reader->readnext();
343 switch(token2.token_type) {
344 case TOKEN_CLOSEBRACK:
348 list->addobject(parsequantifier());
355 } while(bool_continue);
356 Quantifier** qarray=new Quantifier* [list->size()];
357 list->toArray((void **)qarray);
358 Constraint *c=new Constraint(qarray,list->size());
363 Quantifier * Parser::parsequantifier() {
364 Token label=reader->readnext();
366 return new Quantifier(new Label(copystr(label.str)),parseset());
369 Set * Parser::parseset() {
370 Token label=reader->readnext();
371 if (label.token_type==TOKEN_OPENBRACE) {
372 bool bool_continue=true;
373 List * list=new List();
375 Token token2=reader->readnext();
376 switch(token2.token_type) {
377 case TOKEN_CLOSEBRACE:
383 list->addobject(new Literal(copystr(token2.str)));
386 } while(bool_continue);
387 int size=list->size();
388 Literal** qarray=new Literal* [size];
389 list->toArray((void **)qarray);
391 return new Set(qarray,size);
393 return new Set(new Setlabel(copystr(label.str)));
396 Setexpr * Parser::parsesetexpr() {
397 Token label=reader->readnext();
398 Token peak=reader->peakahead();
399 if (peak.token_type==TOKEN_DOT) {
401 return new Setexpr(new Label(copystr(label.str)),false,new Relation(copystr(reader->readnext().str)));
402 } else if (peak.token_type==TOKEN_DOTINV) {
404 return new Setexpr(new Label(copystr(label.str)),true,new Relation(copystr(reader->readnext().str)));
406 return new Setexpr(new Setlabel(copystr(label.str)));
409 Parser::Parser(Reader *r) {