Got rid of message attributes (varsize and packed).
[charm.git] / src / xlat-i / xi-grammar.y
1 %{
2 #include <iostream.h>
3 #include "xi-symbol.h"
4
5 extern int yylex (void) ;
6 void yyerror(const char *);
7 extern unsigned int lineno;
8 ModuleList *modlist;
9
10 %}
11
12 %union {
13   ModuleList *modlist;
14   Module *module;
15   ConstructList *conslist;
16   Construct *construct;
17   TParam *tparam;
18   TParamList *tparlist;
19   Type *type;
20   EnType *rtype;
21   PtrType *ptype;
22   NamedType *ntype;
23   FuncType *ftype;
24   Readonly *readonly;
25   Message *message;
26   Chare *chare;
27   Entry *entry;
28   Template *templat;
29   TypeList *typelist;
30   MemberList *mbrlist;
31   Member *member;
32   TVar *tvar;
33   TVarList *tvarlist;
34   Value *val;
35   ValueList *vallist;
36   MsgVar *mv;
37   MsgVarList *mvlist;
38   char *strval;
39   int intval;
40 }
41
42 %token MODULE
43 %token MAINMODULE
44 %token EXTERN
45 %token READONLY
46 %token <intval> CHARE GROUP NODEGROUP ARRAY
47 %token MESSAGE
48 %token CLASS
49 %token STACKSIZE
50 %token THREADED
51 %token MIGRATABLE
52 %token TEMPLATE
53 %token SYNC EXCLUSIVE VIRTUAL
54 %token VOID
55 %token PACKED
56 %token VARSIZE
57 %token ENTRY
58 %token <intval> MAINCHARE
59 %token <strval> IDENT NUMBER LITERAL
60 %token <intval> INT LONG SHORT CHAR FLOAT DOUBLE UNSIGNED
61
62 %type <modlist>         ModuleEList File
63 %type <module>          Module
64 %type <conslist>        ConstructEList ConstructList
65 %type <construct>       Construct
66 %type <strval>          Name QualName OptNameInit
67 %type <val>             OptStackSize
68 %type <intval>          OptExtern OptSemiColon MAttribs MAttribList MAttrib
69 %type <intval>          EAttribs EAttribList EAttrib OptPure
70 %type <intval>          CAttribs CAttribList CAttrib
71 %type <tparam>          TParam
72 %type <tparlist>        TParamList TParamEList OptTParams
73 %type <type>            Type SimpleType OptTypeInit 
74 %type <rtype>           OptType EParam
75 %type <type>            BuiltinType ArrayType
76 %type <ftype>           FuncType
77 %type <ntype>           NamedType ArrayIndexType
78 %type <ptype>           PtrType OnePtrType
79 %type <readonly>        Readonly ReadonlyMsg
80 %type <message>         Message TMessage
81 %type <chare>           Chare Group NodeGroup Array TChare TGroup TNodeGroup TArray
82 %type <entry>           Entry
83 %type <templat>         Template
84 %type <typelist>        BaseList OptBaseList TypeList
85 %type <mbrlist>         MemberEList MemberList
86 %type <member>          Member
87 %type <tvar>            TVar
88 %type <tvarlist>        TVarList TemplateSpec
89 %type <val>             ArrayDim Dim
90 %type <vallist>         DimList
91 %type <mv>              Var
92 %type <mvlist>          VarList
93
94 %%
95
96 File            : ModuleEList
97                 { $$ = $1; modlist = $1; }
98                 ;
99
100 ModuleEList     : /* Empty */
101                 { $$ = 0; }
102                 | Module ModuleEList
103                 { $$ = new ModuleList(lineno, $1, $2); }
104                 ;
105
106 OptExtern       : /* Empty */
107                 { $$ = 0; }
108                 | EXTERN
109                 { $$ = 1; }
110                 ;
111
112 OptSemiColon    : /* Empty */
113                 { $$ = 0; }
114                 | ';'
115                 { $$ = 1; }
116                 ;
117
118 Name            : IDENT
119                 { $$ = $1; }
120                 ;
121
122 QualName        : IDENT
123                 { $$ = $1; }
124                 | QualName ':'':' IDENT
125                 {
126                   char *tmp = new char[strlen($1)+strlen($4)+3];
127                   sprintf(tmp,"%s::%s", $1, $4);
128                   $$ = tmp;
129                 }
130                 ;
131
132 Module          : MODULE Name ConstructEList
133                 { $$ = new Module(lineno, $2, $3); }
134                 | MAINMODULE Name ConstructEList
135                 { $$ = new Module(lineno, $2, $3); $$->setMain(); }
136                 ;
137
138 ConstructEList  : ';'
139                 { $$ = 0; }
140                 | '{' ConstructList '}' OptSemiColon
141                 { $$ = $2; }
142                 ;
143
144 ConstructList   : /* Empty */
145                 { $$ = 0; }
146                 | Construct ConstructList
147                 { $$ = new ConstructList(lineno, $1, $2); }
148                 ;
149
150 Construct       : OptExtern '{' ConstructList '}' OptSemiColon
151                 { if($3) $3->setExtern($1); $$ = $3; }
152                 | OptExtern Module
153                 { $2->setExtern($1); $$ = $2; }
154                 | OptExtern Readonly ';'
155                 { $2->setExtern($1); $$ = $2; }
156                 | OptExtern ReadonlyMsg ';'
157                 { $2->setExtern($1); $$ = $2; }
158                 | OptExtern Message ';'
159                 { $2->setExtern($1); $$ = $2; }
160                 | OptExtern Chare
161                 { $2->setExtern($1); $$ = $2; }
162                 | OptExtern Group
163                 { $2->setExtern($1); $$ = $2; }
164                 | OptExtern NodeGroup
165                 { $2->setExtern($1); $$ = $2; }
166                 | OptExtern Array
167                 { $2->setExtern($1); $$ = $2; }
168                 | OptExtern Template
169                 { $2->setExtern($1); $$ = $2; }
170                 ;
171
172 TParam          : Type
173                 { $$ = new TParamType($1); }
174                 | NUMBER
175                 { $$ = new TParamVal($1); }
176                 | LITERAL
177                 { $$ = new TParamVal($1); }
178                 ;
179
180 TParamList      : TParam
181                 { $$ = new TParamList($1); }
182                 | TParam ',' TParamList
183                 { $$ = new TParamList($1, $3); }
184                 ;
185
186 TParamEList     : /* Empty */
187                 { $$ = 0; }
188                 | TParamList
189                 { $$ = $1; }
190                 ;
191
192 OptTParams      : /* Empty */
193                 { $$ = 0; }
194                 | '<' TParamEList '>'
195                 { $$ = $2; }
196                 ;
197
198 BuiltinType     : INT
199                 { $$ = new BuiltinType("int"); }
200                 | LONG
201                 { $$ = new BuiltinType("long"); }
202                 | SHORT
203                 { $$ = new BuiltinType("short"); }
204                 | CHAR
205                 { $$ = new BuiltinType("char"); }
206                 | UNSIGNED INT
207                 { $$ = new BuiltinType("unsigned int"); }
208                 | UNSIGNED LONG
209                 { $$ = new BuiltinType("long"); }
210                 | UNSIGNED SHORT
211                 { $$ = new BuiltinType("short"); }
212                 | UNSIGNED CHAR
213                 { $$ = new BuiltinType("char"); }
214                 | LONG LONG
215                 { $$ = new BuiltinType("long long"); }
216                 | FLOAT
217                 { $$ = new BuiltinType("float"); }
218                 | DOUBLE
219                 { $$ = new BuiltinType("double"); }
220                 | LONG DOUBLE
221                 { $$ = new BuiltinType("long double"); }
222                 | VOID
223                 { $$ = new BuiltinType("void"); }
224                 ;
225
226 NamedType       : Name OptTParams
227                 { $$ = new NamedType($1, $2); }
228                 ;
229
230 SimpleType      : BuiltinType
231                 { $$ = $1; }
232                 | NamedType
233                 { $$ = $1; }
234                 ;
235
236 OnePtrType      : SimpleType '*'
237                 { $$ = new PtrType($1); }
238                 ;
239
240 PtrType         : OnePtrType '*'
241                 { $1->indirect(); $$ = $1; }
242                 | PtrType '*'
243                 { $1->indirect(); $$ = $1; }
244                 ;
245
246 ArrayDim        : NUMBER
247                 { $$ = new Value($1); }
248                 | Name
249                 { $$ = new Value($1); }
250                 ;
251
252 ArrayType       : Type '[' ArrayDim ']'
253                 { $$ = new ArrayType($1, $3); }
254                 ;
255
256 FuncType        : Type '(' '*' Name ')' '(' TypeList ')'
257                 { $$ = new FuncType($1, $4, $7); }
258                 ;
259
260 Type            : SimpleType
261                 { $$ = $1; }
262                 | OnePtrType
263                 { $$ = (Type*) $1; }
264                 | PtrType
265                 { $$ = (Type*) $1; }
266                 | ArrayType
267                 { $$ = $1; }
268                 | FuncType
269                 { $$ = $1; }
270                 ;
271
272 TypeList        : /* Empty */
273                 { $$ = 0; }
274                 | Type
275                 { $$ = new TypeList($1); }
276                 | Type ',' TypeList
277                 { $$ = new TypeList($1, $3); }
278                 ;
279
280 Dim             : '[' ArrayDim ']'
281                 { $$ = $2; }
282                 ;
283
284 DimList         : /* Empty */
285                 { $$ = 0; }
286                 | Dim DimList
287                 { $$ = new ValueList($1, $2); }
288                 ;
289
290 Readonly        : READONLY Type QualName DimList
291                 { $$ = new Readonly(lineno, $2, $3, $4); }
292                 ;
293
294 ReadonlyMsg     : READONLY MESSAGE SimpleType '*'  Name
295                 { $$ = new Readonly(lineno, $3, $5, 0, 1); }
296                 ;
297
298 MAttribs        : /* Empty */
299                 { $$ = 0; }
300                 | '[' MAttribList ']'
301                 { 
302                   /*
303                   printf("Warning: Message attributes are being phased out.\n");
304                   printf("Warning: Please remove them from interface files.\n");
305                   */
306                   $$ = $2; 
307                 }
308                 ;
309
310 MAttribList     : MAttrib
311                 { $$ = $1; }
312                 | MAttrib ',' MAttribList
313                 { $$ = $1 | $3; }
314                 ;
315
316 MAttrib         : PACKED
317                 { $$ = 0; }
318                 | VARSIZE
319                 { $$ = 0; }
320                 ;
321
322 CAttribs        : /* Empty */
323                 { $$ = 0; }
324                 | '[' CAttribList ']'
325                 { $$ = $2; }
326                 ;
327
328 CAttribList     : CAttrib
329                 { $$ = $1; }
330                 | CAttrib ',' CAttribList
331                 { $$ = $1 | $3; }
332                 ;
333
334 CAttrib         : MIGRATABLE
335                 { $$ = 0x01; }
336                 ;
337
338 Var             : Type Name '[' ']' ';'
339                 { $$ = new MsgVar($1, $2); }
340                 ;
341
342 VarList         : Var
343                 { $$ = new MsgVarList($1); }
344                 | Var VarList
345                 { $$ = new MsgVarList($1, $2); }
346                 ;
347
348 Message         : MESSAGE MAttribs NamedType
349                 { $$ = new Message(lineno, $3); }
350                 | MESSAGE MAttribs NamedType '{' TypeList '}'
351                 { $$ = new Message(lineno, $3, $5); }
352                 | MESSAGE MAttribs NamedType '{' VarList '}'
353                 { $$ = new Message(lineno, $3, 0, $5); }
354                 ;
355
356 OptBaseList     : /* Empty */
357                 { $$ = 0; }
358                 | ':' BaseList
359                 { $$ = $2; }
360                 ;
361
362 BaseList        : NamedType
363                 { $$ = new TypeList($1); }
364                 | NamedType ',' BaseList
365                 { $$ = new TypeList($1, $3); }
366                 ;
367
368 Chare           : CHARE CAttribs NamedType OptBaseList MemberEList
369                 { $$ = new Chare(lineno, $3, $4, $5, $2); }
370                 | MAINCHARE CAttribs NamedType OptBaseList MemberEList
371                 { $$ = new MainChare(lineno, $3, $4, $5, $2); }
372                 ;
373
374 Group           : GROUP CAttribs NamedType OptBaseList MemberEList
375                 { $$ = new Group(lineno, $3, $4, $5, $2); }
376                 ;
377
378 NodeGroup       : NODEGROUP CAttribs NamedType OptBaseList MemberEList
379                 { $$ = new NodeGroup(lineno, $3, $4, $5, $2); }
380                 ;
381
382 ArrayIndexType  : '[' NUMBER Name ']'
383                 {/*Stupid special case for [1D] indices*/
384                         char *buf=new char[40];
385                         sprintf(buf,"%sD",$2);
386                         $$ = new NamedType(buf); 
387                 }
388                 | '[' Name ']'
389                 { $$ = new NamedType($2); }
390                 ;
391
392 Array           : ARRAY ArrayIndexType NamedType OptBaseList MemberEList
393                 { $$ = new Array(lineno, $2, $3, $4, $5); }
394                 ;
395
396 TChare          : CHARE CAttribs Name OptBaseList MemberEList
397                 { $$ = new Chare(lineno, new NamedType($3), $4, $5, $2);}
398                 | MAINCHARE CAttribs Name OptBaseList MemberEList
399                 { $$ = new MainChare(lineno, new NamedType($3), $4, $5, $2); }
400                 ;
401
402 TGroup          : GROUP CAttribs Name OptBaseList MemberEList
403                 { $$ = new Group(lineno, new NamedType($3), $4, $5, $2); }
404                 ;
405
406 TNodeGroup      : NODEGROUP CAttribs Name OptBaseList MemberEList
407                 { $$ = new NodeGroup( lineno, new NamedType($3), $4, $5, $2); }
408                 ;
409
410 TArray          : ARRAY ArrayIndexType Name OptBaseList MemberEList
411                 { $$ = new Array( lineno, $2, new NamedType($3), $4, $5); }
412                 ;
413
414 TMessage        : MESSAGE MAttribs Name ';'
415                 { $$ = new Message(lineno, new NamedType($3)); }
416                 ;
417
418 OptTypeInit     : /* Empty */
419                 { $$ = 0; }
420                 | '=' Type
421                 { $$ = $2; }
422                 ;
423
424 OptNameInit     : /* Empty */
425                 { $$ = 0; }
426                 | '=' NUMBER
427                 { $$ = $2; }
428                 | '=' LITERAL
429                 { $$ = $2; }
430                 ;
431
432 TVar            : CLASS Name OptTypeInit
433                 { $$ = new TType(new NamedType($2), $3); }
434                 | FuncType OptNameInit
435                 { $$ = new TFunc($1, $2); }
436                 | Type Name OptNameInit
437                 { $$ = new TName($1, $2, $3); }
438                 ;
439
440 TVarList        : TVar
441                 { $$ = new TVarList($1); }
442                 | TVar ',' TVarList
443                 { $$ = new TVarList($1, $3); }
444                 ;
445
446 TemplateSpec    : TEMPLATE '<' TVarList '>'
447                 { $$ = $3; }
448                 ;
449
450 Template        : TemplateSpec TChare
451                 { $$ = new Template($1, $2); $2->setTemplate($$); }
452                 | TemplateSpec TGroup
453                 { $$ = new Template($1, $2); $2->setTemplate($$); }
454                 | TemplateSpec TNodeGroup
455                 { $$ = new Template($1, $2); $2->setTemplate($$); }
456                 | TemplateSpec TArray
457                 { $$ = new Template($1, $2); $2->setTemplate($$); }
458                 | TemplateSpec TMessage
459                 { $$ = new Template($1, $2); $2->setTemplate($$); }
460                 ;
461
462 MemberEList     : ';'
463                 { $$ = 0; }
464                 | '{' MemberList '}' OptSemiColon
465                 { $$ = $2; }
466                 ;
467
468 MemberList      : /* Empty */
469                 { $$ = 0; }
470                 | Member MemberList
471                 { $$ = new MemberList($1, $2); }
472                 ;
473
474 Member          : Entry ';'
475                 { $$ = $1; }
476                 | Readonly ';'
477                 { $$ = $1; }
478                 | ReadonlyMsg ';'
479                 { $$ = $1; }
480                 ;
481
482 Entry           : ENTRY EAttribs VOID Name EParam OptPure OptStackSize
483                 { $$ = new Entry(lineno, $2|$6, new BuiltinType("void"), $4, $5, $7); }
484                 | ENTRY EAttribs OnePtrType Name EParam OptPure OptStackSize
485                 { $$ = new Entry(lineno, $2|$6, $3, $4, $5, $7); }
486                 | ENTRY EAttribs Name EParam
487                 { $$ = new Entry(lineno, $2, 0, $3, $4, 0); }
488                 ;
489
490 EAttribs        : /* Empty */
491                 { $$ = 0; }
492                 | '[' EAttribList ']'
493                 { $$ = $2; }
494                 ;
495
496 EAttribList     : EAttrib
497                 { $$ = $1; }
498                 | EAttrib ',' EAttribList
499                 { $$ = $1 | $3; }
500                 ;
501
502 EAttrib         : THREADED
503                 { $$ = STHREADED; }
504                 | SYNC
505                 { $$ = SSYNC; }
506                 | EXCLUSIVE
507                 { $$ = SLOCKED; }
508                 | VIRTUAL
509                 { $$ = SVIRTUAL; }
510                 ;
511
512 OptType         : /* Empty */
513                 { $$ = 0; }
514                 | VOID
515                 { $$ = new BuiltinType("void"); }
516                 | OnePtrType
517                 { $$ = $1; }
518                 ;
519
520 EParam          : '(' OptType ')'
521                 { $$ = $2; }
522                 ;
523
524 OptStackSize    : /* Empty */
525                 { $$ = 0; }
526                 | STACKSIZE '=' NUMBER
527                 { $$ = new Value($3); }
528                 ;
529
530 OptPure         : /* Empty */
531                 { $$ = 0; }
532                 | '=' NUMBER
533                 { if(strcmp($2, "0")) { yyerror("expected 0"); exit(1); }
534                   $$ = SPURE; 
535                 }
536                 ;
537 %%
538 void yyerror(const char *mesg)
539 {
540   cout << "Syntax error at line " << lineno << ": " << mesg << endl;
541   // return 0;
542 }