8 CParser::CParser(Reader *r) {
12 AElementexpr * CParser::parseaelementexpr(bool isquant) {
13 CAElementexpr *oldee=NULL;
16 Token t=reader->peakahead();
17 switch(t.token_type) {
20 if ((joinop==-1)&&(oldee!=NULL))
23 needtoken(TOKEN_OPENPAREN);
24 Token literal=reader->readnext();
25 needtoken(TOKEN_CLOSEPAREN);
27 oldee=new CAElementexpr(new Literal(copystr(literal.str)));
30 oldee=new CAElementexpr(oldee,new CAElementexpr(new Literal(copystr(literal.str))),joinop);
39 if ((joinop==-1)&&(oldee!=NULL))
42 CAElementexpr *ee=(CAElementexpr *)parseaelementexpr(false);
47 oldee=new CAElementexpr(oldee,ee,joinop);
54 case TOKEN_CLOSEBRACK:
57 // Otherwise fall through
58 case TOKEN_CLOSEPAREN:
60 return checkdot(oldee);
64 if ((oldee!=NULL)&&(joinop==-1))
65 joinop=CAELEMENTEXPR_SUB;
71 if ((oldee!=NULL)&&(joinop==-1))
72 joinop=CAELEMENTEXPR_ADD;
78 needtoken(TOKEN_OPENPAREN);
79 Setexpr *sae=parsesetexpr();
80 needtoken(TOKEN_CLOSEPAREN);
81 return new CAElementexpr(sae);
85 CAElementexpr *cae=(CAElementexpr *)parseaelementexpr(false);
87 Setexpr *sae=parsesetexpr();
88 return new CAElementexpr(cae,sae);
94 if ((oldee!=NULL)&&(joinop==-1))
95 joinop=CAELEMENTEXPR_MULT;
101 if ((oldee!=NULL)&&(joinop==-1))
102 joinop=CAELEMENTEXPR_DIV;
107 if ((joinop==-1)&&(oldee!=NULL))
111 oldee=checkdot(new CAElementexpr());
114 oldee=new CAElementexpr(oldee,checkdot(new CAElementexpr()),joinop);
120 if ((joinop==-1)&&(oldee!=NULL))
124 oldee=checkdot(new CAElementexpr(new Label(copystr(t.str))));
127 oldee=new CAElementexpr(oldee,checkdot(new CAElementexpr(new Label(copystr(t.str)))),joinop);
135 CAElementexpr * CParser::checkdot(CAElementexpr * incoming) {
136 Token tdot=reader->peakahead();
137 if (tdot.token_type!=TOKEN_DOT) return incoming;
139 Token tfield=reader->readnext();
140 Token tpeak=reader->peakahead();
141 return new CAElementexpr(incoming, new Relation(copystr(tfield.str)));
144 Setexpr * CParser::parsesetexpr() {
145 Token label=reader->readnext();
146 Token peak=reader->peakahead();
147 if (peak.token_type==TOKEN_DOT) {
149 return new Setexpr(new Label(copystr(label.str)),false,new Relation(copystr(reader->readnext().str)));
150 } else if (peak.token_type==TOKEN_DOTINV) {
152 return new Setexpr(new Label(copystr(label.str)),true,new Relation(copystr(reader->readnext().str)));
154 return new Setexpr(new Setlabel(copystr(label.str)));
157 Expr * CParser::parseexpr() {
160 CAElementexpr *oldindex=NULL;
161 bool parselside=true;
163 Token t=reader->readnext();
164 switch(t.token_type) {
167 /* do shift-pack stuff */
169 oldee=new Expr(oldee,oldf);
171 oldee=new Expr(oldee,oldf,oldindex);
176 Token name=reader->readnext();
177 oldf=new Field(copystr(name.str));
180 case TOKEN_OPENBRACK:
181 oldindex=(CAElementexpr *)parseaelementexpr(true);
182 needtoken(TOKEN_CLOSEBRACK);
187 needtoken(TOKEN_OPENPAREN);
188 Token fld=reader->readnext();
189 needtoken(TOKEN_COMMA);
190 Expr *ex=parseexpr();
191 needtoken(TOKEN_CLOSEPAREN);
192 oldee=new Expr(copystr(fld.str),ex);
195 case TOKEN_CLOSEPAREN:
197 /* do shift-pack stuff */
199 oldee=new Expr(oldee,oldf);
201 oldee=new Expr(oldee,oldf,oldindex);
209 oldee=new Expr(new Label(copystr(t.str)));
215 Statementb * CParser::parsestatementb() {
218 CAElementexpr *oldindex=NULL;
219 bool parselside=true;
221 Token t=reader->readnext();
222 switch(t.token_type) {
225 /* do shift-pack stuff */
227 oldee=new Expr(oldee,oldf);
229 oldee=new Expr(oldee,oldf,oldindex);
234 Token name=reader->readnext();
235 oldf=new Field(copystr(name.str));
238 case TOKEN_OPENBRACK:
239 oldindex=(CAElementexpr *)parseaelementexpr(true);
240 needtoken(TOKEN_CLOSEBRACK);
245 needtoken(TOKEN_OPENPAREN);
246 Token fld=reader->readnext();
247 needtoken(TOKEN_COMMA);
248 Expr *ex=parseexpr();
249 oldee=new Expr(copystr(fld.str),ex);
260 oldee=new Expr(new Label(copystr(t.str)));
263 CAElementexpr *rside=(CAElementexpr *)parseaelementexpr(false);
265 return new CStatementb(oldee,oldf,rside);
267 return new CStatementb(oldee,oldf,oldindex,rside);