charmxi: Be more explicit about missing semicolons in a few likely places
[charm.git] / src / xlat-i / xi-grammar.y
1 %expect 6
2 %{
3 #include <iostream>
4 #include <string>
5 #include <string.h>
6 #include "xi-symbol.h"
7 #include "EToken.h"
8 using namespace xi;
9 extern int yylex (void) ;
10 extern unsigned char in_comment;
11 void yyerror(const char *);
12 extern unsigned int lineno;
13 extern int in_bracket,in_braces,in_int_expr;
14 extern TList<Entry *> *connectEntries;
15 ModuleList *modlist;
16 namespace xi {
17 extern int macroDefined(const char *str, int istrue);
18 extern const char *python_doc;
19 void splitScopedName(const char* name, const char** scope, const char** basename);
20 }
21
22 // Error handling
23 bool hasSeenConstructor = false;
24 char *lastConstructor;
25 %}
26
27 %union {
28   ModuleList *modlist;
29   Module *module;
30   ConstructList *conslist;
31   Construct *construct;
32   TParam *tparam;
33   TParamList *tparlist;
34   Type *type;
35   PtrType *ptype;
36   NamedType *ntype;
37   FuncType *ftype;
38   Readonly *readonly;
39   Message *message;
40   Chare *chare;
41   Entry *entry;
42   EntryList *entrylist;
43   Parameter *pname;
44   ParamList *plist;
45   Template *templat;
46   TypeList *typelist;
47   MemberList *mbrlist;
48   Member *member;
49   TVar *tvar;
50   TVarList *tvarlist;
51   Value *val;
52   ValueList *vallist;
53   MsgVar *mv;
54   MsgVarList *mvlist;
55   PUPableClass *pupable;
56   IncludeFile *includeFile;
57   const char *strval;
58   int intval;
59   Chare::attrib_t cattr;
60   SdagConstruct *sc;
61   XStr* xstrptr;
62   AccelBlock* accelBlock;
63 }
64
65 %token MODULE
66 %token MAINMODULE
67 %token EXTERN
68 %token READONLY
69 %token INITCALL
70 %token INITNODE
71 %token INITPROC
72 %token PUPABLE
73 %token <intval> CHARE MAINCHARE GROUP NODEGROUP ARRAY
74 %token MESSAGE
75 %token CONDITIONAL
76 %token CLASS
77 %token INCLUDE
78 %token STACKSIZE
79 %token THREADED
80 %token TEMPLATE
81 %token SYNC IGET EXCLUSIVE IMMEDIATE SKIPSCHED INLINE VIRTUAL MIGRATABLE 
82 %token CREATEHERE CREATEHOME NOKEEP NOTRACE
83 %token VOID
84 %token CONST
85 %token PACKED
86 %token VARSIZE
87 %token ENTRY
88 %token FOR
89 %token FORALL
90 %token WHILE
91 %token WHEN
92 %token OVERLAP
93 %token ATOMIC
94 %token FORWARD
95 %token IF
96 %token ELSE
97 %token CONNECT
98 %token PUBLISHES 
99 %token PYTHON LOCAL
100 %token NAMESPACE
101 %token USING 
102 %token <strval> IDENT NUMBER LITERAL CPROGRAM HASHIF HASHIFDEF
103 %token <intval> INT LONG SHORT CHAR FLOAT DOUBLE UNSIGNED
104 %token ACCEL
105 %token READWRITE
106 %token WRITEONLY
107 %token ACCELBLOCK
108 %token MEMCRITICAL
109 %token REDUCTIONTARGET
110
111 %type <modlist>         ModuleEList File
112 %type <module>          Module
113 %type <conslist>        ConstructEList ConstructList
114 %type <construct>       Construct ConstructSemi
115 %type <strval>          Name QualName CCode CPROGRAM_List OptNameInit 
116 %type <strval>          OptTraceName
117 %type <val>             OptStackSize
118 %type <intval>          OptExtern OptSemiColon MAttribs MAttribList MAttrib
119 %type <intval>          OptConditional MsgArray
120 %type <intval>          EAttribs EAttribList EAttrib OptVoid
121 %type <cattr>           CAttribs CAttribList CAttrib
122 %type <cattr>           ArrayAttribs ArrayAttribList ArrayAttrib
123 %type <tparam>          TParam
124 %type <tparlist>        TParamList TParamEList OptTParams
125 %type <type>            BaseType Type SimpleType OptTypeInit EReturn
126 %type <type>            BuiltinType
127 %type <ftype>           FuncType
128 %type <ntype>           NamedType QualNamedType ArrayIndexType
129 %type <ptype>           PtrType OnePtrType
130 %type <readonly>        Readonly ReadonlyMsg
131 %type <message>         Message TMessage
132 %type <chare>           Chare Group NodeGroup Array TChare TGroup TNodeGroup TArray
133 %type <entry>           Entry SEntry
134 %type <entrylist>       SEntryList
135 %type <templat>         Template
136 %type <pname>           Parameter ParamBracketStart AccelParameter AccelArrayParam
137 %type <plist>           ParamList EParameters AccelParamList AccelEParameters
138 %type <intval>          AccelBufferType
139 %type <xstrptr>         AccelInstName
140 %type <accelBlock>      AccelBlock
141 %type <typelist>        BaseList OptBaseList
142 %type <mbrlist>         MemberEList MemberList
143 %type <member>          Member MemberBody NonEntryMember InitNode InitProc UnexpectedToken
144 %type <pupable>         PUPableClass
145 %type <includeFile>     IncludeFile
146 %type <tvar>            TVar
147 %type <tvarlist>        TVarList TemplateSpec
148 %type <val>             ArrayDim Dim DefaultParameter
149 %type <vallist>         DimList
150 %type <mv>              Var
151 %type <mvlist>          VarList
152 %type <intval>          ParamBraceStart ParamBraceEnd SParamBracketStart SParamBracketEnd StartIntExpr EndIntExpr
153 %type <sc>              Slist SingleConstruct Olist OptSdagCode HasElse ForwardList PublishesList OptPubList
154 %type <intval>          PythonOptions
155
156 %%
157
158 File            : ModuleEList
159                 { $$ = $1; modlist = $1; }
160                 ;
161
162 ModuleEList     : /* Empty */
163                 { 
164                   $$ = 0; 
165                 }
166                 | Module ModuleEList
167                 { $$ = new ModuleList(lineno, $1, $2); }
168                 ;
169
170 OptExtern       : /* Empty */
171                 { $$ = 0; }
172                 | EXTERN
173                 { $$ = 1; }
174                 ;
175
176 OptSemiColon    : /* Empty */
177                 { $$ = 0; }
178                 | ';'
179                 { $$ = 1; }
180                 ;
181
182 Name            : IDENT
183                 { $$ = $1; }
184                 ;
185
186 QualName        : IDENT
187                 { $$ = $1; }
188                 | QualName ':'':' IDENT
189                 {
190                   char *tmp = new char[strlen($1)+strlen($4)+3];
191                   sprintf(tmp,"%s::%s", $1, $4);
192                   $$ = tmp;
193                 }
194                 ;
195
196 Module          : MODULE Name ConstructEList
197                 { 
198                     $$ = new Module(lineno, $2, $3); 
199                 }
200                 | MAINMODULE Name ConstructEList
201                 {  
202                     $$ = new Module(lineno, $2, $3); 
203                     $$->setMain();
204                 }
205                 ;
206
207 ConstructEList  : ';'
208                 { $$ = 0; }
209                 | '{' ConstructList '}' OptSemiColon
210                 { $$ = $2; }
211                 ;
212
213 ConstructList   : /* Empty */
214                 { $$ = 0; }
215                 | Construct ConstructList
216                 { $$ = new ConstructList(lineno, $1, $2); }
217                 ;
218
219 ConstructSemi   : USING NAMESPACE QualName
220                 { $$ = new UsingScope($3, false); }
221                 | USING QualName
222                 { $$ = new UsingScope($2, true); }
223                 | OptExtern NonEntryMember
224                 { $2->setExtern($1); $$ = $2; }
225                 | OptExtern Message
226                 { $2->setExtern($1); $$ = $2; }
227                 | EXTERN ENTRY EReturn QualNamedType Name OptTParams EParameters
228                 {
229                   Entry *e = new Entry(lineno, 0, $3, $5, $7, 0, 0, 0, 0, 0);
230                   int isExtern = 1;
231                   e->setExtern(isExtern);
232                   e->targs = $6;
233                   e->label = new XStr;
234                   $4->print(*e->label);
235                   $$ = e;
236                 }
237                 ;
238
239 Construct       : OptExtern '{' ConstructList '}' OptSemiColon
240         { if($3) $3->setExtern($1); $$ = $3; }
241         | NAMESPACE Name '{' ConstructList '}'
242         { $$ = new Scope($2, $4); }
243         | ConstructSemi ';'
244         { $$ = $1; }
245         | ConstructSemi UnexpectedToken
246         { yyerror("The preceding construct must be semicolon terminated"); YYABORT; }
247         | OptExtern Module
248         { $2->setExtern($1); $$ = $2; }
249         | OptExtern Chare
250         { $2->setExtern($1); $$ = $2; }
251         | OptExtern Group
252         { $2->setExtern($1); $$ = $2; }
253         | OptExtern NodeGroup
254         { $2->setExtern($1); $$ = $2; }
255         | OptExtern Array
256         { $2->setExtern($1); $$ = $2; }
257         | OptExtern Template
258         { $2->setExtern($1); $$ = $2; }
259         | HashIFComment
260         { $$ = NULL; }
261         | HashIFDefComment
262         { $$ = NULL; }
263         | AccelBlock
264         { $$ = $1; }
265         | error
266         { printf("Invalid construct\n"); YYABORT; }
267         ;
268
269 TParam          : Type
270                 { $$ = new TParamType($1); }
271                 | NUMBER
272                 { $$ = new TParamVal($1); }
273                 | LITERAL
274                 { $$ = new TParamVal($1); }
275                 ;
276
277 TParamList      : TParam
278                 { $$ = new TParamList($1); }
279                 | TParam ',' TParamList
280                 { $$ = new TParamList($1, $3); }
281                 ;
282
283 TParamEList     : /* Empty */
284                 { $$ = 0; }
285                 | TParamList
286                 { $$ = $1; }
287                 ;
288
289 OptTParams      :  /* Empty */
290                 { $$ = 0; }
291                 | '<' TParamEList '>'
292                 { $$ = $2; }
293                 ;
294
295 BuiltinType     : INT
296                 { $$ = new BuiltinType("int"); }
297                 | LONG
298                 { $$ = new BuiltinType("long"); }
299                 | SHORT
300                 { $$ = new BuiltinType("short"); }
301                 | CHAR
302                 { $$ = new BuiltinType("char"); }
303                 | UNSIGNED INT
304                 { $$ = new BuiltinType("unsigned int"); }
305                 | UNSIGNED LONG
306                 { $$ = new BuiltinType("unsigned long"); }
307                 | UNSIGNED LONG INT
308                 { $$ = new BuiltinType("unsigned long"); }
309                 | UNSIGNED LONG LONG
310                 { $$ = new BuiltinType("unsigned long long"); }
311                 | UNSIGNED SHORT
312                 { $$ = new BuiltinType("unsigned short"); }
313                 | UNSIGNED CHAR
314                 { $$ = new BuiltinType("unsigned char"); }
315                 | LONG LONG
316                 { $$ = new BuiltinType("long long"); }
317                 | FLOAT
318                 { $$ = new BuiltinType("float"); }
319                 | DOUBLE
320                 { $$ = new BuiltinType("double"); }
321                 | LONG DOUBLE
322                 { $$ = new BuiltinType("long double"); }
323                 | VOID
324                 { $$ = new BuiltinType("void"); }
325                 ;
326
327 NamedType       : Name OptTParams { $$ = new NamedType($1,$2); };
328 QualNamedType   : QualName OptTParams { 
329                     const char* basename, *scope;
330                     splitScopedName($1, &scope, &basename);
331                     $$ = new NamedType(basename, $2, scope);
332                 }
333                 ;
334
335 SimpleType      : BuiltinType
336                 { $$ = $1; }
337                 | QualNamedType
338                 { $$ = $1; }
339                 ;
340
341 OnePtrType      : SimpleType '*'
342                 { $$ = new PtrType($1); }
343                 ;
344
345 PtrType         : OnePtrType '*'
346                 { $1->indirect(); $$ = $1; }
347                 | PtrType '*'
348                 { $1->indirect(); $$ = $1; }
349                 ;
350
351 FuncType        : BaseType '(' '*' Name ')' '(' ParamList ')'
352                 { $$ = new FuncType($1, $4, $7); }
353                 ;
354
355 BaseType        : SimpleType
356                 { $$ = $1; }
357                 | OnePtrType
358                 { $$ = $1; }
359                 | PtrType
360                 { $$ = $1; }
361                 | FuncType
362                 { $$ = $1; }
363                 //{ $$ = $1; }
364                 | CONST BaseType 
365                 { $$ = $2; }
366                 | BaseType CONST
367                 { $$ = $1; }
368                 ;
369
370 Type            : BaseType '&'
371                 { $$ = new ReferenceType($1); }
372                 | BaseType
373                 { $$ = $1; }
374                 ;
375
376 ArrayDim        : NUMBER
377                 { $$ = new Value($1); }
378                 | QualName
379                 { $$ = new Value($1); }
380                 ;
381
382 Dim             : '[' ArrayDim ']'
383                 { $$ = $2; }
384                 ;
385
386 DimList         : /* Empty */
387                 { $$ = 0; }
388                 | Dim DimList
389                 { $$ = new ValueList($1, $2); }
390                 ;
391
392 Readonly        : READONLY Type QualName DimList
393                 { $$ = new Readonly(lineno, $2, $3, $4); }
394                 ;
395
396 ReadonlyMsg     : READONLY MESSAGE SimpleType '*'  Name
397                 { $$ = new Readonly(lineno, $3, $5, 0, 1); }
398                 ;
399
400 OptVoid         : /*Empty*/
401                 { $$ = 0;}
402                 | VOID
403                 { $$ = 0;}
404                 ;
405
406 MAttribs        : /* Empty */
407                 { $$ = 0; }
408                 | '[' MAttribList ']'
409                 { 
410                   /*
411                   printf("Warning: Message attributes are being phased out.\n");
412                   printf("Warning: Please remove them from interface files.\n");
413                   */
414                   $$ = $2; 
415                 }
416                 ;
417
418 MAttribList     : MAttrib
419                 { $$ = $1; }
420                 | MAttrib ',' MAttribList
421                 { $$ = $1 | $3; }
422                 ;
423
424 MAttrib         : PACKED
425                 { $$ = 0; }
426                 | VARSIZE
427                 { $$ = 0; }
428                 ;
429
430 CAttribs        : /* Empty */
431                 { $$ = 0; }
432                 | '[' CAttribList ']'
433                 { $$ = $2; }
434                 ;
435
436 CAttribList     : CAttrib
437                 { $$ = $1; }
438                 | CAttrib ',' CAttribList
439                 { $$ = $1 | $3; }
440                 ;
441
442 PythonOptions   : /* Empty */
443                 { python_doc = NULL; $$ = 0; }
444                 | LITERAL
445                 { python_doc = $1; $$ = 0; }
446                 ;
447
448 ArrayAttrib     : PYTHON
449                 { $$ = Chare::CPYTHON; }
450                 ;
451
452 ArrayAttribs    : /* Empty */
453                 { $$ = 0; }
454                 | '[' ArrayAttribList ']'
455                 { $$ = $2; }
456                 ;
457
458 ArrayAttribList : ArrayAttrib
459                 { $$ = $1; }
460                 | ArrayAttrib ',' ArrayAttribList
461                 { $$ = $1 | $3; }
462                 ;
463
464 CAttrib         : MIGRATABLE
465                 { $$ = Chare::CMIGRATABLE; }
466                 | PYTHON
467                 { $$ = Chare::CPYTHON; }
468                 ;
469
470 OptConditional  : /* Empty */
471                 { $$ = 0; }
472                 | CONDITIONAL
473                 { $$ = 1; }
474
475 MsgArray        : /* Empty */
476                 { $$ = 0; }
477                 | '[' ']'
478                 { $$ = 1; }
479
480 Var             : OptConditional Type Name MsgArray ';'
481                 { $$ = new MsgVar($2, $3, $1, $4); }
482                 ;
483
484 VarList         : Var
485                 { $$ = new MsgVarList($1); }
486                 | Var VarList
487                 { $$ = new MsgVarList($1, $2); }
488                 ;
489
490 Message         : MESSAGE MAttribs NamedType
491                 { $$ = new Message(lineno, $3); }
492                 | MESSAGE MAttribs NamedType '{' VarList '}'
493                 { $$ = new Message(lineno, $3, $5); }
494                 ;
495
496 OptBaseList     : /* Empty */
497                 { $$ = 0; }
498                 | ':' BaseList
499                 { $$ = $2; }
500                 ;
501
502 BaseList        : QualNamedType
503                 { $$ = new TypeList($1); }
504                 | QualNamedType ',' BaseList
505                 { $$ = new TypeList($1, $3); }
506                 ;
507
508 Chare           : CHARE CAttribs NamedType OptBaseList MemberEList
509                 { $$ = new Chare(lineno, $2|Chare::CCHARE, $3, $4, $5);
510           hasSeenConstructor = false;
511         }
512                 | MAINCHARE CAttribs NamedType OptBaseList MemberEList
513                 { $$ = new MainChare(lineno, $2, $3, $4, $5);
514           hasSeenConstructor = false;
515         }
516                 ;
517
518 Group           : GROUP CAttribs NamedType OptBaseList MemberEList
519                 { $$ = new Group(lineno, $2, $3, $4, $5);
520           hasSeenConstructor = false;
521         }
522                 ;
523
524 NodeGroup       : NODEGROUP CAttribs NamedType OptBaseList MemberEList
525                 { $$ = new NodeGroup(lineno, $2, $3, $4, $5);
526           hasSeenConstructor = false;
527         }
528                 ;
529
530 ArrayIndexType  : '[' NUMBER Name ']'
531                 {/*Stupid special case for [1D] indices*/
532                         char *buf=new char[40];
533                         sprintf(buf,"%sD",$2);
534                         $$ = new NamedType(buf); 
535                 }
536                 | '[' Name ']'
537                 { $$ = new NamedType($2); }
538                 ;
539
540 Array           : ARRAY ArrayAttribs ArrayIndexType NamedType OptBaseList MemberEList
541                 {  $$ = new Array(lineno, $2, $3, $4, $5, $6);
542           hasSeenConstructor = false;
543         }
544                 | ARRAY ArrayIndexType ArrayAttribs NamedType OptBaseList MemberEList
545                 {  $$ = new Array(lineno, $3, $2, $4, $5, $6);
546           hasSeenConstructor = false;
547         }
548                 ;
549
550 TChare          : CHARE CAttribs Name OptBaseList MemberEList
551                 { $$ = new Chare(lineno, $2|Chare::CCHARE, new NamedType($3), $4, $5);
552           hasSeenConstructor = false;
553         }
554                 | MAINCHARE CAttribs Name OptBaseList MemberEList
555                 { $$ = new MainChare(lineno, $2, new NamedType($3), $4, $5);
556           hasSeenConstructor = false;
557         }
558                 ;
559
560 TGroup          : GROUP CAttribs Name OptBaseList MemberEList
561                 { $$ = new Group(lineno, $2, new NamedType($3), $4, $5);
562           hasSeenConstructor = false;
563         }
564                 ;
565
566 TNodeGroup      : NODEGROUP CAttribs Name OptBaseList MemberEList
567                 { $$ = new NodeGroup( lineno, $2, new NamedType($3), $4, $5);
568           hasSeenConstructor = false;
569         }
570                 ;
571
572 TArray          : ARRAY ArrayIndexType Name OptBaseList MemberEList
573                 { $$ = new Array( lineno, 0, $2, new NamedType($3), $4, $5);
574           hasSeenConstructor = false;
575         }
576                 ;
577
578 TMessage        : MESSAGE MAttribs Name ';'
579                 { $$ = new Message(lineno, new NamedType($3)); }
580                 | MESSAGE MAttribs Name '{' VarList '}' ';'
581                 { $$ = new Message(lineno, new NamedType($3), $5); }
582                 ;
583
584 OptTypeInit     : /* Empty */
585                 { $$ = 0; }
586                 | '=' Type
587                 { $$ = $2; }
588                 ;
589
590 OptNameInit     : /* Empty */
591                 { $$ = 0; }
592                 | '=' NUMBER
593                 { $$ = $2; }
594                 | '=' LITERAL
595                 { $$ = $2; }
596                 ;
597
598 TVar            : CLASS Name OptTypeInit
599                 { $$ = new TType(new NamedType($2), $3); }
600                 | FuncType OptNameInit
601                 { $$ = new TFunc($1, $2); }
602                 | Type Name OptNameInit
603                 { $$ = new TName($1, $2, $3); }
604                 ;
605
606 TVarList        : TVar
607                 { $$ = new TVarList($1); }
608                 | TVar ',' TVarList
609                 { $$ = new TVarList($1, $3); }
610                 ;
611
612 TemplateSpec    : TEMPLATE '<' TVarList '>'
613                 { $$ = $3; }
614                 ;
615
616 Template        : TemplateSpec TChare
617                 { $$ = new Template($1, $2); $2->setTemplate($$); }
618                 | TemplateSpec TGroup
619                 { $$ = new Template($1, $2); $2->setTemplate($$); }
620                 | TemplateSpec TNodeGroup
621                 { $$ = new Template($1, $2); $2->setTemplate($$); }
622                 | TemplateSpec TArray
623                 { $$ = new Template($1, $2); $2->setTemplate($$); }
624                 | TemplateSpec TMessage
625                 { $$ = new Template($1, $2); $2->setTemplate($$); }
626                 ;
627
628 MemberEList     : ';'
629                 { $$ = 0; }
630                 | '{' MemberList '}' OptSemiColon
631                 { $$ = $2; }
632                 ;
633
634 MemberList      : /* Empty */
635                 { 
636                   Entry *tempEntry;
637                   if (!connectEntries->empty()) {
638                     tempEntry = connectEntries->begin();
639                     MemberList *ml;
640                     ml = new MemberList(tempEntry, 0);
641                     tempEntry = connectEntries->next();
642                     for(; !connectEntries->end(); tempEntry = connectEntries->next()) {
643                       ml->appendMember(tempEntry); 
644                     }
645                     while (!connectEntries->empty())
646                       connectEntries->pop();
647                     $$ = ml; 
648                   }
649                   else {
650                     $$ = 0; 
651                   }
652                 }
653                 | Member MemberList
654                 { $$ = new MemberList($1, $2); }
655                 ;
656
657 NonEntryMember  : Readonly
658                 { $$ = $1; }
659                 | ReadonlyMsg
660                 { $$ = $1; }
661                 | InitProc
662                 | InitNode
663                 { $$ = $1; }
664                 | PUPABLE PUPableClass
665                 { $$ = $2; }
666                 | INCLUDE IncludeFile
667                 { $$ = $2; }
668                 | CLASS Name
669                 { $$ = new ClassDeclaration(lineno,$2); } 
670                 ;
671
672 InitNode        : INITNODE OptVoid QualName
673                 { $$ = new InitCall(lineno, $3, 1); }
674                 | INITNODE OptVoid QualName '(' OptVoid ')'
675                 { $$ = new InitCall(lineno, $3, 1); }
676                 | INITNODE OptVoid QualName '<' TParamList '>' '(' OptVoid ')'
677                 { $$ = new InitCall(lineno,
678                                     strdup((std::string($3) + '<' +
679                                             ($5)->to_string() + '>').c_str()),
680                                     1);
681                 }
682                 | INITCALL OptVoid QualName
683                 { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n"); 
684                   $$ = new InitCall(lineno, $3, 1); }
685                 | INITCALL OptVoid QualName '(' OptVoid ')'
686                 { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n");
687                   $$ = new InitCall(lineno, $3, 1); }
688                 ;
689
690 InitProc        : INITPROC OptVoid QualName
691                 { $$ = new InitCall(lineno, $3, 0); }
692                 | INITPROC OptVoid QualName '(' OptVoid ')'
693                 { $$ = new InitCall(lineno, $3, 0); }
694                 | INITPROC OptVoid QualName '<' TParamList '>' '(' OptVoid ')'
695                 { $$ = new InitCall(lineno,
696                                     strdup((std::string($3) + '<' +
697                                             ($5)->to_string() + '>').c_str()),
698                                     0);
699                 }
700                 | INITPROC '[' ACCEL ']' OptVoid QualName '(' OptVoid ')'
701                 {
702                   InitCall* rtn = new InitCall(lineno, $6, 0);
703                   rtn->setAccel();
704                   $$ = rtn;
705                 }
706                 ;
707
708 PUPableClass    : QualNamedType
709                 { $$ = new PUPableClass(lineno,$1,0); } 
710                 | QualNamedType ',' PUPableClass
711                 { $$ = new PUPableClass(lineno,$1,$3); }
712                 ;
713 IncludeFile    : LITERAL
714                 { $$ = new IncludeFile(lineno,$1); } 
715                 ;
716
717 Member          : MemberBody ';'
718                 { $$ = $1; }
719                 // Error constructions
720                 | MemberBody UnexpectedToken
721                 { yyerror("The preceding entry method declaration must be semicolon-terminated."); YYABORT; }
722                 ;
723
724 MemberBody      : Entry
725                 { $$ = $1; }
726                 | TemplateSpec Entry
727                 {
728                   $2->tspec = $1;
729                   $$ = $2;
730                 }
731                 | NonEntryMember
732                 { $$ = $1; }
733                 ;
734
735 UnexpectedToken : ENTRY
736                 { $$ = 0; }
737                 | '}'
738                 { $$ = 0; }
739                 | INITCALL
740                 { $$ = 0; }
741                 | INITNODE
742                 { $$ = 0; }
743                 | INITPROC
744                 { $$ = 0; }
745                 | CHARE
746                 { $$ = 0; }
747                 | MAINCHARE
748                 { $$ = 0; }
749                 | ARRAY
750                 { $$ = 0; }
751                 | GROUP
752                 { $$ = 0; }
753                 | NODEGROUP
754                 { $$ = 0; }
755                 | READONLY
756                 { $$ = 0; }
757
758 Entry           : ENTRY EAttribs EReturn Name EParameters OptStackSize OptSdagCode
759                 { 
760                   if ($7 != 0) { 
761                     $7->con1 = new SdagConstruct(SIDENT, $4);
762                     $7->param = new ParamList($5);
763                   }
764                   $$ = new Entry(lineno, $2, $3, $4, $5, $6, $7, 0, 0); 
765                 }
766                 | ENTRY EAttribs Name EParameters OptSdagCode /*Constructor*/
767                 { 
768           if (hasSeenConstructor && strcmp(lastConstructor, $3) != 0) {
769             yyerror("Entry method has no return type and we've seen a constructor already\n");
770           } else {
771             // If we see another method without a return type, it should better be an overloaded constructor!
772             if (!lastConstructor) free(lastConstructor);
773             lastConstructor = (char *) malloc(strlen($3) + 1);
774             strcpy(lastConstructor, $3);
775             hasSeenConstructor = true;
776
777             if ($5 != 0) {
778               $5->con1 = new SdagConstruct(SIDENT, $3);
779               $5->param = new ParamList($4);
780             }
781             Entry *e = new Entry(lineno, $2, 0, $3, $4, 0, $5, 0, 0);
782             if (e->param && e->param->isCkMigMsgPtr()) {
783               yyerror("Charm++ generates a CkMigrateMsg chare constructor implicitly, but continuing anyway");
784               $$ = NULL;
785             } else {
786               $$ = e;
787             }
788           }
789                 }
790                 | ENTRY '[' ACCEL ']' VOID Name EParameters AccelEParameters ParamBraceStart CCode ParamBraceEnd Name /* DMK : Accelerated Entry Method */
791         {
792           int attribs = SACCEL;
793           const char* name = $6;
794           ParamList* paramList = $7;
795           ParamList* accelParamList = $8;
796           XStr* codeBody = new XStr($10);
797           const char* callbackName = $12;
798
799           $$ = new Entry(lineno, attribs, new BuiltinType("void"), name, paramList,
800                          0, 0, 0, 0, 0
801                         );
802           $$->setAccelParam(accelParamList);
803           $$->setAccelCodeBody(codeBody);
804           $$->setAccelCallbackName(new XStr(callbackName));
805         }
806                 ;
807
808 AccelBlock:  ACCELBLOCK ParamBraceStart CCode ParamBraceEnd ';'
809            { $$ = new AccelBlock(lineno, new XStr($3)); }
810            | ACCELBLOCK ';'
811            { $$ = new AccelBlock(lineno, NULL); }
812            ;
813
814 EReturn         : VOID
815                 { $$ = new BuiltinType("void"); }
816                 | OnePtrType
817                 { $$ = $1; }
818                 ;
819
820 EAttribs        : /* Empty */
821                 { $$ = 0; }
822                 | '[' EAttribList ']'
823                 { $$ = $2; }
824         | error
825         { printf("Invalid entry method attribute list\n"); YYABORT; }
826                 ;
827
828 EAttribList     : EAttrib
829                 { $$ = $1; }
830                 | EAttrib ',' EAttribList
831                 { $$ = $1 | $3; }
832                 ;
833
834 EAttrib         : THREADED
835                 { $$ = STHREADED; }
836                 | SYNC
837                 { $$ = SSYNC; }
838                 | IGET
839                 { $$ = SIGET; }
840                 | EXCLUSIVE
841                 { $$ = SLOCKED; }
842                 | CREATEHERE
843                 { $$ = SCREATEHERE; }
844                 | CREATEHOME
845                 { $$ = SCREATEHOME; }
846                 | NOKEEP
847                 { $$ = SNOKEEP; }
848                 | NOTRACE
849                 { $$ = SNOTRACE; }
850                 | IMMEDIATE
851                 { $$ = SIMMEDIATE; }
852                 | SKIPSCHED
853                 { $$ = SSKIPSCHED; }
854                 | INLINE
855                 { $$ = SINLINE; }
856                 | LOCAL
857                 { $$ = SLOCAL; }
858                 | PYTHON PythonOptions
859                 { $$ = SPYTHON; }
860                 | MEMCRITICAL
861                 { $$ = SMEM; }
862         | REDUCTIONTARGET
863         { $$ = SREDUCE; }
864                 | error
865                 { printf("Invalid entry method attribute: %s\n", yylval); YYABORT; }
866                 ;
867
868 DefaultParameter: LITERAL
869                 { $$ = new Value($1); }
870                 | NUMBER
871                 { $$ = new Value($1); }
872                 | QualName
873                 { $$ = new Value($1); }
874                 ;
875
876 CPROGRAM_List   :  /* Empty */
877                 { $$ = ""; }
878                 | CPROGRAM
879                 { $$ = $1; }
880                 | CPROGRAM ',' CPROGRAM_List
881                 {  /*Returned only when in_bracket*/
882                         char *tmp = new char[strlen($1)+strlen($3)+3];
883                         sprintf(tmp,"%s, %s", $1, $3);
884                         $$ = tmp;
885                 }
886                 ;
887
888 CCode           : /* Empty */
889                 { $$ = ""; }
890                 | CPROGRAM
891                 { $$ = $1; }
892                 | CPROGRAM '[' CCode ']' CCode
893                 {  /*Returned only when in_bracket*/
894                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
895                         sprintf(tmp,"%s[%s]%s", $1, $3, $5);
896                         $$ = tmp;
897                 }
898                 | CPROGRAM '{' CCode '}' CCode
899                 { /*Returned only when in_braces*/
900                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
901                         sprintf(tmp,"%s{%s}%s", $1, $3, $5);
902                         $$ = tmp;
903                 }
904                 | CPROGRAM '(' CPROGRAM_List ')' CCode
905                 { /*Returned only when in_braces*/
906                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
907                         sprintf(tmp,"%s(%s)%s", $1, $3, $5);
908                         $$ = tmp;
909                 }
910                 |'(' CCode ')' CCode
911                 { /*Returned only when in_braces*/
912                         char *tmp = new char[strlen($2)+strlen($4)+3];
913                         sprintf(tmp,"(%s)%s", $2, $4);
914                         $$ = tmp;
915                 }
916                 ;
917
918 ParamBracketStart : Type Name '['
919                 {  /*Start grabbing CPROGRAM segments*/
920                         in_bracket=1;
921                         $$ = new Parameter(lineno, $1,$2);
922                 }
923                 ;
924
925 ParamBraceStart : '{'
926                 { 
927                    /*Start grabbing CPROGRAM segments*/
928                         in_braces=1;
929                         $$ = 0;
930                 }
931                 ;
932
933 ParamBraceEnd   : '}'
934                 { 
935                         in_braces=0;
936                         $$ = 0;
937                 }
938                 ;
939
940 Parameter       : Type
941                 { $$ = new Parameter(lineno, $1);}
942                 | Type Name OptConditional
943                 { $$ = new Parameter(lineno, $1,$2); $$->setConditional($3); }
944                 | Type Name '=' DefaultParameter
945                 { $$ = new Parameter(lineno, $1,$2,0,$4);} 
946                 | ParamBracketStart CCode ']'
947                 { /*Stop grabbing CPROGRAM segments*/
948                         in_bracket=0;
949                         $$ = new Parameter(lineno, $1->getType(), $1->getName() ,$2);
950                 } 
951                 ;
952
953 AccelBufferType : READONLY  { $$ = Parameter::ACCEL_BUFFER_TYPE_READONLY; }
954                 | READWRITE { $$ = Parameter::ACCEL_BUFFER_TYPE_READWRITE; }
955                 | WRITEONLY { $$ = Parameter::ACCEL_BUFFER_TYPE_WRITEONLY; }
956                 ;
957
958 AccelInstName   : Name { $$ = new XStr($1); }
959                 | AccelInstName '-' '>' Name { $$ = new XStr(""); *($$) << *($1) << "->" << $4; }
960                 | AccelInstName '.' Name { $$ = new XStr(""); *($$) << *($1) << "." << $3; }
961                 | AccelInstName '[' AccelInstName ']'
962                 {
963                   $$ = new XStr("");
964                   *($$) << *($1) << "[" << *($3) << "]";
965                   delete $1;
966                   delete $3;
967                 }
968                 | AccelInstName '[' NUMBER ']'
969                 {
970                   $$ = new XStr("");
971                   *($$) << *($1) << "[" << $3 << "]";
972                   delete $1;
973                 }
974                 | AccelInstName '(' AccelInstName ')'
975                 {
976                   $$ = new XStr("");
977                   *($$) << *($1) << "(" << *($3) << ")";
978                   delete $1;
979                   delete $3;
980                 }
981                 ;
982
983 AccelArrayParam : ParamBracketStart CCode ']'
984                 {
985                   in_bracket = 0;
986                   $$ = new Parameter(lineno, $1->getType(), $1->getName(), $2);
987                 }
988                 ;
989
990 AccelParameter  : AccelBufferType ':' Type Name '<' AccelInstName '>'
991                 {
992                   $$ = new Parameter(lineno, $3, $4);
993                   $$->setAccelInstName($6);
994                   $$->setAccelBufferType($1);
995                 }
996                 | Type Name '<' AccelInstName '>'
997                 {
998                   $$ = new Parameter(lineno, $1, $2);
999                   $$->setAccelInstName($4);
1000                   $$->setAccelBufferType(Parameter::ACCEL_BUFFER_TYPE_READWRITE);
1001                 }
1002                 | AccelBufferType ':' AccelArrayParam '<' AccelInstName '>'
1003                 {
1004                   $$ = $3;
1005                   $$->setAccelInstName($5);
1006                   $$->setAccelBufferType($1);
1007                 }
1008                 ;
1009
1010 ParamList       : Parameter
1011                 { $$ = new ParamList($1); }
1012                 | Parameter ',' ParamList
1013                 { $$ = new ParamList($1,$3); }
1014                 ;
1015
1016 AccelParamList  : AccelParameter
1017                 { $$ = new ParamList($1); }
1018                 | AccelParameter ',' AccelParamList
1019                 { $$ = new ParamList($1,$3); }
1020                 ;
1021
1022 EParameters     : '(' ParamList ')'
1023                 { $$ = $2; }
1024                 | '(' ')'
1025                 { $$ = new ParamList(new Parameter(0, new BuiltinType("void"))); }
1026                 ;
1027
1028 AccelEParameters  : '[' AccelParamList ']'
1029                   { $$ = $2; }
1030                   | '[' ']'
1031                   { $$ = 0; }
1032                   ;
1033
1034 OptStackSize    : /* Empty */
1035                 { $$ = 0; }
1036                 | STACKSIZE '=' NUMBER
1037                 { $$ = new Value($3); }
1038                 ;
1039
1040 OptSdagCode     : /* Empty */
1041                 { $$ = 0; }
1042                 | SingleConstruct
1043                 { $$ = new SdagConstruct(SSDAGENTRY, $1); }
1044                 | '{' Slist '}'
1045                 { $$ = new SdagConstruct(SSDAGENTRY, $2); }
1046                 ;
1047
1048 Slist           : SingleConstruct
1049                 { $$ = new SdagConstruct(SSLIST, $1); }
1050                 | SingleConstruct Slist
1051                 { $$ = new SdagConstruct(SSLIST, $1, $2);  }
1052                 ;
1053
1054 Olist           : SingleConstruct
1055                 { $$ = new SdagConstruct(SOLIST, $1); }
1056                 | SingleConstruct Slist
1057                 { $$ = new SdagConstruct(SOLIST, $1, $2); } 
1058                 ;
1059
1060 OptPubList      : /* Empty */
1061                 { $$ = 0; }
1062                 | PUBLISHES '(' PublishesList ')'
1063                 { $$ = $3; }
1064                 ;
1065
1066 PublishesList   : IDENT 
1067                 { $$ = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, $1)); }
1068                 | IDENT ',' PublishesList 
1069                 { $$ = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, $1), $3);  }
1070                 ;
1071
1072 OptTraceName    : LITERAL
1073                  { $$ = $1; }
1074                 |
1075                  { $$ = 0; }
1076                 ;
1077
1078 SingleConstruct : ATOMIC OptTraceName ParamBraceStart CCode ParamBraceEnd OptPubList 
1079                  {
1080                    $$ = buildAtomic($4, $6, $2);
1081                  }
1082                 | CONNECT '(' IDENT EParameters ')' ParamBraceStart CCode '}'
1083                 {  
1084                    in_braces = 0;
1085                    if (($4->isVoid() == 0) && ($4->isMessage() == 0))
1086                    {
1087                       connectEntries->append(new Entry(0, 0, new BuiltinType("void"), $3, 
1088                                         new ParamList(new Parameter(lineno, new PtrType( 
1089                                         new NamedType("CkMarshallMsg")), "_msg")), 0, 0, 0, 1, $4));
1090                    }
1091                    else  {
1092                       connectEntries->append(new Entry(0, 0, new BuiltinType("void"), $3, $4, 0, 0, 0, 1, $4));
1093                    }
1094                    $$ = new SdagConstruct(SCONNECT, $3, $7, $4);
1095                 }
1096                 | WHEN SEntryList '{' '}'
1097                 { $$ = new SdagConstruct(SWHEN, 0, 0, 0,0,0, 0,  $2); }
1098                 | WHEN SEntryList SingleConstruct
1099                 { $$ = new SdagConstruct(SWHEN, 0, 0, 0,0,0, $3, $2); }
1100                 | WHEN SEntryList '{' Slist '}'
1101                 { $$ = new SdagConstruct(SWHEN, 0, 0, 0,0,0, $4, $2); }
1102                 | OVERLAP '{' Olist '}'
1103                 { $$ = new SdagConstruct(SOVERLAP,0, 0,0,0,0,$3, 0); }  
1104                 | FOR StartIntExpr CCode ';' CCode ';' CCode  EndIntExpr '{' Slist '}'
1105                 { $$ = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, $3), new SdagConstruct(SINT_EXPR, $5),
1106                              new SdagConstruct(SINT_EXPR, $7), 0, $10, 0); }
1107                 | FOR StartIntExpr CCode ';' CCode ';' CCode  EndIntExpr SingleConstruct
1108                 { $$ = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, $3), new SdagConstruct(SINT_EXPR, $5), 
1109                          new SdagConstruct(SINT_EXPR, $7), 0, $9, 0); }
1110                 | FORALL '[' IDENT ']' StartIntExpr CCode ':' CCode ',' CCode  EndIntExpr SingleConstruct
1111                 { $$ = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, $3), new SdagConstruct(SINT_EXPR, $6), 
1112                              new SdagConstruct(SINT_EXPR, $8), new SdagConstruct(SINT_EXPR, $10), $12, 0); }
1113                 | FORALL '[' IDENT ']' StartIntExpr CCode ':' CCode ',' CCode  EndIntExpr '{' Slist '}' 
1114                 { $$ = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, $3), new SdagConstruct(SINT_EXPR, $6), 
1115                                  new SdagConstruct(SINT_EXPR, $8), new SdagConstruct(SINT_EXPR, $10), $13, 0); }
1116                 | IF StartIntExpr CCode EndIntExpr SingleConstruct HasElse
1117                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), $6,0,0,$5,0); }
1118                 | IF StartIntExpr CCode EndIntExpr '{' Slist '}' HasElse
1119                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), $8,0,0,$6,0); }
1120                 | WHILE StartIntExpr CCode EndIntExpr SingleConstruct 
1121                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), 0,0,0,$5,0); }
1122                 | WHILE StartIntExpr CCode EndIntExpr '{' Slist '}' 
1123                 { $$ = new SdagConstruct(SWHILE, 0, new SdagConstruct(SINT_EXPR, $3), 0,0,0,$6,0); }
1124                 | FORWARD ForwardList ';'
1125                 { $$ = $2; }
1126                 | ParamBraceStart CCode ParamBraceEnd
1127                 { $$ = buildAtomic($2, NULL, NULL); }
1128         | error
1129         { printf("Unknown SDAG construct or malformed entry method definition.\n"
1130                  "You may have forgotten to terminate an entry method definition with a"
1131                  " semicolon or forgotten to mark a block of sequential SDAG code as 'atomic'\n"); YYABORT; }
1132         ;
1133
1134 HasElse         : /* Empty */
1135                 { $$ = 0; }
1136                 | ELSE SingleConstruct
1137                 { $$ = new SdagConstruct(SELSE, 0,0,0,0,0, $2,0); }
1138                 | ELSE '{' Slist '}'
1139                 { $$ = new SdagConstruct(SELSE, 0,0,0,0,0, $3,0); }
1140                 ;
1141 ForwardList     : IDENT 
1142                 { $$ = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, $1)); }
1143                 | IDENT ',' ForwardList 
1144                 { $$ = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, $1), $3);  }
1145                 ;
1146
1147 EndIntExpr      : ')'
1148                 { in_int_expr = 0; $$ = 0; }
1149                 ;
1150
1151 StartIntExpr    : '('
1152                 { in_int_expr = 1; $$ = 0; }
1153                 ;
1154
1155 SEntry          : IDENT EParameters
1156                 { $$ = new Entry(lineno, 0, 0, $1, $2, 0, 0, 0, 0); }
1157                 | IDENT SParamBracketStart CCode SParamBracketEnd EParameters 
1158                 { $$ = new Entry(lineno, 0, 0, $1, $5, 0, 0, $3, 0); }
1159                 ;
1160
1161 SEntryList      : SEntry 
1162                 { $$ = new EntryList($1); }
1163                 | SEntry ',' SEntryList
1164                 { $$ = new EntryList($1,$3); }
1165                 ;
1166
1167 SParamBracketStart : '['
1168                    { in_bracket=1; } 
1169                    ;
1170 SParamBracketEnd   : ']'
1171                    { in_bracket=0; } 
1172                    ;
1173
1174 HashIFComment   : HASHIF Name
1175                 { if (!macroDefined($2, 1)) in_comment = 1; }
1176                 ;
1177
1178 HashIFDefComment: HASHIFDEF Name
1179                 { if (!macroDefined($2, 0)) in_comment = 1; }
1180                 ;
1181
1182 %%
1183 void yyerror(const char *mesg)
1184 {
1185     std::cerr << cur_file<<":"<<lineno<<": Charmxi syntax error> "
1186               << mesg << std::endl;
1187 }