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