2 #include "typeparser.h"
10 Typeparser::Typeparser(Reader *r) {
14 structure * Typeparser::parsestructure() {
15 Token t=reader->peakahead();
17 if (t.token_type==TOKEN_EOF)
19 if (t.token_type!=TOKEN_EOL)
22 t=reader->peakahead();
24 needtoken(TOKEN_STRUCTURE);
25 Token typenam=reader->readnext();
26 structure *pstructure=new structure(copystr(typenam.str));
27 /* needtoken(TOKEN_OPENPAREN);
28 bool continueparse=true;
29 List *list=new List();
30 while(continueparse) {
31 Token t=reader->readnext();
32 switch(t.token_type) {
33 case TOKEN_CLOSEPAREN:
38 Token name=reader->readnext();
39 tparam * tpar=new tparam(new ttype(TTYPE_INT),copystr(name.str));
40 list->addobject(tpar);
46 Token name=reader->readnext();
47 tparam * tpar=new tparam(new ttype(TTYPE_BIT),copystr(name.str));
48 list->addobject(tpar);
54 Token name=reader->readnext();
55 tparam * tpar=new tparam(new ttype(TTYPE_BYTE),copystr(name.str));
56 list->addobject(tpar);
62 Token name=reader->readnext();
63 tparam *tpar=new tparam(new ttype(copystr(typenam.str)),copystr(name.str));
64 list->addobject(tpar);
70 tparam **tp=new tparam*[list->size()];
71 list->toArray((void**) tp);
72 pstructure->setparams(tp,list->size());
75 Token t2=reader->peakahead();
76 if (t2.token_type==TOKEN_SUBTYPE) {
79 pstructure->setsubtype(parsettype());
82 List *list=new List();
83 List *labellist=new List();
84 needtoken(TOKEN_OPENBRACE);
86 while (reader->peakahead().token_type==TOKEN_EOL)
88 Token t=reader->peakahead();
89 if (t.token_type==TOKEN_CLOSEBRACE)
91 if (t.token_type==TOKEN_LABEL) {
92 labellist->addobject(parsetlabel());
94 list->addobject(parsetfield());
96 tfield **tarray=new tfield*[list->size()];
97 tlabel **larray=new tlabel*[labellist->size()];
98 list->toArray((void **)tarray);
99 labellist->toArray((void**)larray);
100 pstructure->setfields(tarray,list->size());
101 pstructure->setlabels(larray,labellist->size());
102 needtoken(TOKEN_CLOSEBRACE);
108 tlabel * Typeparser::parsetlabel() {
109 needtoken(TOKEN_LABEL);
110 Token fieldname=reader->readnext();
111 AElementexpr *index=NULL;
112 if (reader->peakahead().token_type==TOKEN_OPENBRACK) {
114 index=parseaelementexpr(true);
115 needtoken(TOKEN_CLOSEBRACK);
117 needtoken(TOKEN_COLON);
118 tfield *tf=parsetfield();
119 return new tlabel(tf,copystr(fieldname.str),index);
122 tfield * Typeparser::parsetfield() {
124 Token t=reader->peakahead();
126 if (t.token_type==TOKEN_RESERVED) {
130 ttype *tt=parsettype();
132 Token isptr=reader->peakahead();
133 if (isptr.token_type==TOKEN_MULT) {
136 break; /*Only support direct pointers right now*/
142 fieldname=reader->readnext();
143 AElementexpr *size=parseindex();
145 needtoken(TOKEN_SEMI);
147 return new tfield(tt,copystr("RESERVED"+(rcount++)));
149 return new tfield(tt,copystr(fieldname.str));
152 ttype * Typeparser::parsettype() {
153 Token name=reader->readnext();
154 switch(name.token_type) {
157 return new ttype(TTYPE_BIT);
161 return new ttype(TTYPE_INT);
165 return new ttype(TTYPE_SHORT);
169 return new ttype(TTYPE_BYTE);
174 needtoken(TOKEN_OPENPAREN);
175 List *list=new List();
176 while(reader->peakahead().token_type!=TOKEN_CLOSEPAREN) {
177 list->addobject(parseaelementexpr(false));
181 AElementexpr **earray=new AElementexpr*[list->size()];
182 list->toArray((void**)earray);*/
183 ttype *ntt=new ttype(copystr(name.str),NULL);
190 AElementexpr * Typeparser::parseindex() {
191 Token t=reader->peakahead();
192 if (t.token_type!=TOKEN_OPENBRACK)
195 AElementexpr * ae=parseaelementexpr(true);
196 needtoken(TOKEN_CLOSEBRACK);
200 void Typeparser::commaorcloseparen() {
201 Token t=reader->peakahead();
202 if (t.token_type!=TOKEN_CLOSEPAREN)
203 needtoken(TOKEN_COMMA);
206 AElementexpr * Typeparser::parseaelementexpr(bool isstruct) {
207 AElementexpr *oldee=NULL;
210 Token t=reader->peakahead();
211 switch(t.token_type) {
214 if ((joinop==-1)&&(oldee!=NULL))
217 needtoken(TOKEN_OPENPAREN);
218 Token literal=reader->readnext();
219 needtoken(TOKEN_CLOSEPAREN);
221 oldee=new AElementexpr(new Literal(copystr(literal.str)));
224 oldee=new AElementexpr(oldee,new AElementexpr(new Literal(copystr(literal.str))),joinop);
231 case TOKEN_OPENPAREN:
233 if ((joinop==-1)&&(oldee!=NULL))
236 AElementexpr *ee=parseaelementexpr(false);
241 oldee=new AElementexpr(oldee,ee,joinop);
247 case TOKEN_CLOSEBRACK:
250 case TOKEN_CLOSEPAREN:
252 return checkdot(oldee);
256 if ((oldee!=NULL)&&(joinop==-1))
257 joinop=AELEMENTEXPR_SUB;
263 if ((oldee!=NULL)&&(joinop==-1))
264 joinop=AELEMENTEXPR_ADD;
270 if ((oldee!=NULL)&&(joinop==-1))
271 joinop=AELEMENTEXPR_MULT;
277 if ((oldee!=NULL)&&(joinop==-1))
278 joinop=AELEMENTEXPR_DIV;
283 if ((joinop==-1)&&(oldee!=NULL))
287 oldee=checkdot(new AElementexpr(new Label(copystr(t.str))));
290 oldee=new AElementexpr(oldee,checkdot(new AElementexpr(new Label(copystr(t.str)))),joinop);
298 AElementexpr * Typeparser::checkdot(AElementexpr * incoming) {
299 Token tdot=reader->peakahead();
300 if (tdot.token_type!=TOKEN_DOT) return incoming;
302 Token tfield=reader->readnext();
303 Token tpeak=reader->peakahead();
304 if (tpeak.token_type==TOKEN_OPENBRACK) {
306 AElementexpr *index=parseaelementexpr(false);
307 return checkdot(new AElementexpr(incoming, new Field(copystr(tfield.str)),index));
309 return checkdot(new AElementexpr(incoming, new Field(copystr(tfield.str))));
313 void Typeparser::error() {
319 void Typeparser::skiptoken() {
323 void Typeparser::needtoken(int token) {
324 Token t=reader->readnext();
325 if (!(t.token_type==token)) {
326 printf("Needed token: ");
328 printf("\n Got token: %s ",t.str);
329 tokenname(t.token_type);