charmxi: Don't use std::bind2nd with a reference argument, because older g++ (4.1...
[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 std::list<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                   if (!connectEntries.empty()) {
611                     $$ = new MemberList(connectEntries);
612                   } else {
613                     $$ = 0; 
614                   }
615                 }
616                 | Member MemberList
617                 { $$ = new MemberList($1, $2); }
618                 ;
619
620 NonEntryMember  : Readonly
621                 { $$ = $1; }
622                 | ReadonlyMsg
623                 { $$ = $1; }
624                 | InitProc
625                 | InitNode
626                 { $$ = $1; }
627                 | PUPABLE PUPableClass
628                 { $$ = $2; }
629                 | INCLUDE IncludeFile
630                 { $$ = $2; }
631                 | CLASS Name
632                 { $$ = new ClassDeclaration(lineno,$2); } 
633                 ;
634
635 InitNode        : INITNODE OptVoid QualName
636                 { $$ = new InitCall(lineno, $3, 1); }
637                 | INITNODE OptVoid QualName '(' OptVoid ')'
638                 { $$ = new InitCall(lineno, $3, 1); }
639                 | INITNODE OptVoid QualName '<' TParamList '>' '(' OptVoid ')'
640                 { $$ = new InitCall(lineno,
641                                     strdup((std::string($3) + '<' +
642                                             ($5)->to_string() + '>').c_str()),
643                                     1);
644                 }
645                 | INITCALL OptVoid QualName
646                 { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n"); 
647                   $$ = new InitCall(lineno, $3, 1); }
648                 | INITCALL OptVoid QualName '(' OptVoid ')'
649                 { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n");
650                   $$ = new InitCall(lineno, $3, 1); }
651                 ;
652
653 InitProc        : INITPROC OptVoid QualName
654                 { $$ = new InitCall(lineno, $3, 0); }
655                 | INITPROC OptVoid QualName '(' OptVoid ')'
656                 { $$ = new InitCall(lineno, $3, 0); }
657                 | INITPROC OptVoid QualName '<' TParamList '>' '(' OptVoid ')'
658                 { $$ = new InitCall(lineno,
659                                     strdup((std::string($3) + '<' +
660                                             ($5)->to_string() + '>').c_str()),
661                                     0);
662                 }
663                 | INITPROC '[' ACCEL ']' OptVoid QualName '(' OptVoid ')'
664                 {
665                   InitCall* rtn = new InitCall(lineno, $6, 0);
666                   rtn->setAccel();
667                   $$ = rtn;
668                 }
669                 ;
670
671 PUPableClass    : QualNamedType
672                 { $$ = new PUPableClass(lineno,$1,0); } 
673                 | QualNamedType ',' PUPableClass
674                 { $$ = new PUPableClass(lineno,$1,$3); }
675                 ;
676 IncludeFile    : LITERAL
677                 { $$ = new IncludeFile(lineno,$1); } 
678                 ;
679
680 Member          : MemberBody ';'
681                 { $$ = $1; }
682                 // Error constructions
683                 | MemberBody UnexpectedToken
684                 { yyerror("The preceding entry method declaration must be semicolon-terminated."); YYABORT; }
685                 ;
686
687 MemberBody      : Entry
688                 { $$ = $1; }
689                 | TemplateSpec Entry
690                 {
691                   $2->tspec = $1;
692                   $$ = $2;
693                 }
694                 | NonEntryMember
695                 { $$ = $1; }
696                 ;
697
698 UnexpectedToken : ENTRY
699                 { $$ = 0; }
700                 | '}'
701                 { $$ = 0; }
702                 | INITCALL
703                 { $$ = 0; }
704                 | INITNODE
705                 { $$ = 0; }
706                 | INITPROC
707                 { $$ = 0; }
708                 | CHARE
709                 { $$ = 0; }
710                 | MAINCHARE
711                 { $$ = 0; }
712                 | ARRAY
713                 { $$ = 0; }
714                 | GROUP
715                 { $$ = 0; }
716                 | NODEGROUP
717                 { $$ = 0; }
718                 | READONLY
719                 { $$ = 0; }
720
721 Entry           : ENTRY EAttribs EReturn Name EParameters OptStackSize OptSdagCode
722                 { 
723                   if ($7 != 0) { 
724                     $7->con1 = new SdagConstruct(SIDENT, $4);
725                     $7->param = new ParamList($5);
726                   }
727                   $$ = new Entry(lineno, $2, $3, $4, $5, $6, $7, 0, 0); 
728                 }
729                 | ENTRY EAttribs Name EParameters OptSdagCode /*Constructor*/
730                 { 
731                   if ($5 != 0) {
732                     $5->con1 = new SdagConstruct(SIDENT, $3);
733                     $5->param = new ParamList($4);
734                   }
735                   Entry *e = new Entry(lineno, $2,     0, $3, $4,  0, $5, 0, 0);
736                   if (e->param && e->param->isCkMigMsgPtr()) {
737                     yyerror("Charm++ takes a CkMigrateMsg chare constructor for granted, but continuing anyway");
738                     $$ = NULL;
739                   } else
740                     $$ = e;
741                 }
742                 | ENTRY '[' ACCEL ']' VOID Name EParameters AccelEParameters ParamBraceStart CCode ParamBraceEnd Name /* DMK : Accelerated Entry Method */
743                 {
744                   int attribs = SACCEL;
745                   const char* name = $6;
746                   ParamList* paramList = $7;
747                   ParamList* accelParamList = $8;
748                   XStr* codeBody = new XStr($10);
749                   const char* callbackName = $12;
750
751                   $$ = new Entry(lineno, attribs, new BuiltinType("void"), name, paramList,
752                                  0, 0, 0, 0, 0
753                                 );
754                   $$->setAccelParam(accelParamList);
755                   $$->setAccelCodeBody(codeBody);
756                   $$->setAccelCallbackName(new XStr(callbackName));
757                 }
758                 ;
759
760 AccelBlock      : ACCELBLOCK ParamBraceStart CCode ParamBraceEnd ';'
761                 { $$ = new AccelBlock(lineno, new XStr($3)); }
762                 | ACCELBLOCK ';'
763                 { $$ = new AccelBlock(lineno, NULL); }
764                 ;
765
766 EReturn         : VOID
767                 { $$ = new BuiltinType("void"); }
768                 | OnePtrType
769                 { $$ = $1; }
770                 ;
771
772 EAttribs        : /* Empty */
773                 { $$ = 0; }
774                 | '[' EAttribList ']'
775                 { $$ = $2; }
776                 | error
777                 { printf("Invalid entry method attribute list\n"); YYABORT; }
778                 ;
779
780 EAttribList     : EAttrib
781                 { $$ = $1; }
782                 | EAttrib ',' EAttribList
783                 { $$ = $1 | $3; }
784                 ;
785
786 EAttrib         : THREADED
787                 { $$ = STHREADED; }
788                 | SYNC
789                 { $$ = SSYNC; }
790                 | IGET
791                 { $$ = SIGET; }
792                 | EXCLUSIVE
793                 { $$ = SLOCKED; }
794                 | CREATEHERE
795                 { $$ = SCREATEHERE; }
796                 | CREATEHOME
797                 { $$ = SCREATEHOME; }
798                 | NOKEEP
799                 { $$ = SNOKEEP; }
800                 | NOTRACE
801                 { $$ = SNOTRACE; }
802                 | IMMEDIATE
803                 { $$ = SIMMEDIATE; }
804                 | SKIPSCHED
805                 { $$ = SSKIPSCHED; }
806                 | INLINE
807                 { $$ = SINLINE; }
808                 | LOCAL
809                 { $$ = SLOCAL; }
810                 | PYTHON PythonOptions
811                 { $$ = SPYTHON; }
812                 | MEMCRITICAL
813                 { $$ = SMEM; }
814                 | REDUCTIONTARGET
815                 { $$ = SREDUCE; }
816                 | error
817                 { printf("Invalid entry method attribute: %s\n", yylval); YYABORT; }
818                 ;
819
820 DefaultParameter: LITERAL
821                 { $$ = new Value($1); }
822                 | NUMBER
823                 { $$ = new Value($1); }
824                 | QualName
825                 { $$ = new Value($1); }
826                 ;
827
828 CPROGRAM_List   :  /* Empty */
829                 { $$ = ""; }
830                 | CPROGRAM
831                 { $$ = $1; }
832                 | CPROGRAM ',' CPROGRAM_List
833                 {  /*Returned only when in_bracket*/
834                         char *tmp = new char[strlen($1)+strlen($3)+3];
835                         sprintf(tmp,"%s, %s", $1, $3);
836                         $$ = tmp;
837                 }
838                 ;
839
840 CCode           : /* Empty */
841                 { $$ = ""; }
842                 | CPROGRAM
843                 { $$ = $1; }
844                 | CPROGRAM '[' CCode ']' CCode
845                 {  /*Returned only when in_bracket*/
846                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
847                         sprintf(tmp,"%s[%s]%s", $1, $3, $5);
848                         $$ = tmp;
849                 }
850                 | CPROGRAM '{' CCode '}' CCode
851                 { /*Returned only when in_braces*/
852                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
853                         sprintf(tmp,"%s{%s}%s", $1, $3, $5);
854                         $$ = tmp;
855                 }
856                 | CPROGRAM '(' CPROGRAM_List ')' CCode
857                 { /*Returned only when in_braces*/
858                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
859                         sprintf(tmp,"%s(%s)%s", $1, $3, $5);
860                         $$ = tmp;
861                 }
862                 |'(' CCode ')' CCode
863                 { /*Returned only when in_braces*/
864                         char *tmp = new char[strlen($2)+strlen($4)+3];
865                         sprintf(tmp,"(%s)%s", $2, $4);
866                         $$ = tmp;
867                 }
868                 ;
869
870 ParamBracketStart : Type Name '['
871                 {  /*Start grabbing CPROGRAM segments*/
872                         in_bracket=1;
873                         $$ = new Parameter(lineno, $1,$2);
874                 }
875                 ;
876
877 ParamBraceStart : '{'
878                 { 
879                    /*Start grabbing CPROGRAM segments*/
880                         in_braces=1;
881                         $$ = 0;
882                 }
883                 ;
884
885 ParamBraceEnd   : '}'
886                 { 
887                         in_braces=0;
888                         $$ = 0;
889                 }
890                 ;
891
892 Parameter       : Type
893                 { $$ = new Parameter(lineno, $1);}
894                 | Type Name OptConditional
895                 { $$ = new Parameter(lineno, $1,$2); $$->setConditional($3); }
896                 | Type Name '=' DefaultParameter
897                 { $$ = new Parameter(lineno, $1,$2,0,$4);} 
898                 | ParamBracketStart CCode ']'
899                 { /*Stop grabbing CPROGRAM segments*/
900                         in_bracket=0;
901                         $$ = new Parameter(lineno, $1->getType(), $1->getName() ,$2);
902                 } 
903                 ;
904
905 AccelBufferType : READONLY  { $$ = Parameter::ACCEL_BUFFER_TYPE_READONLY; }
906                 | READWRITE { $$ = Parameter::ACCEL_BUFFER_TYPE_READWRITE; }
907                 | WRITEONLY { $$ = Parameter::ACCEL_BUFFER_TYPE_WRITEONLY; }
908                 ;
909
910 AccelInstName   : Name { $$ = new XStr($1); }
911                 | AccelInstName '-' '>' Name { $$ = new XStr(""); *($$) << *($1) << "->" << $4; }
912                 | AccelInstName '.' Name { $$ = new XStr(""); *($$) << *($1) << "." << $3; }
913                 | AccelInstName '[' AccelInstName ']'
914                 {
915                   $$ = new XStr("");
916                   *($$) << *($1) << "[" << *($3) << "]";
917                   delete $1;
918                   delete $3;
919                 }
920                 | AccelInstName '[' NUMBER ']'
921                 {
922                   $$ = new XStr("");
923                   *($$) << *($1) << "[" << $3 << "]";
924                   delete $1;
925                 }
926                 | AccelInstName '(' AccelInstName ')'
927                 {
928                   $$ = new XStr("");
929                   *($$) << *($1) << "(" << *($3) << ")";
930                   delete $1;
931                   delete $3;
932                 }
933                 ;
934
935 AccelArrayParam : ParamBracketStart CCode ']'
936                 {
937                   in_bracket = 0;
938                   $$ = new Parameter(lineno, $1->getType(), $1->getName(), $2);
939                 }
940                 ;
941
942 AccelParameter  : AccelBufferType ':' Type Name '<' AccelInstName '>'
943                 {
944                   $$ = new Parameter(lineno, $3, $4);
945                   $$->setAccelInstName($6);
946                   $$->setAccelBufferType($1);
947                 }
948                 | Type Name '<' AccelInstName '>'
949                 {
950                   $$ = new Parameter(lineno, $1, $2);
951                   $$->setAccelInstName($4);
952                   $$->setAccelBufferType(Parameter::ACCEL_BUFFER_TYPE_READWRITE);
953                 }
954                 | AccelBufferType ':' AccelArrayParam '<' AccelInstName '>'
955                 {
956                   $$ = $3;
957                   $$->setAccelInstName($5);
958                   $$->setAccelBufferType($1);
959                 }
960                 ;
961
962 ParamList       : Parameter
963                 { $$ = new ParamList($1); }
964                 | Parameter ',' ParamList
965                 { $$ = new ParamList($1,$3); }
966                 ;
967
968 AccelParamList  : AccelParameter
969                 { $$ = new ParamList($1); }
970                 | AccelParameter ',' AccelParamList
971                 { $$ = new ParamList($1,$3); }
972                 ;
973
974 EParameters     : '(' ParamList ')'
975                 { $$ = $2; }
976                 | '(' ')'
977                 { $$ = new ParamList(new Parameter(0, new BuiltinType("void"))); }
978                 ;
979
980 AccelEParameters  : '[' AccelParamList ']'
981                   { $$ = $2; }
982                   | '[' ']'
983                   { $$ = 0; }
984                   ;
985
986 OptStackSize    : /* Empty */
987                 { $$ = 0; }
988                 | STACKSIZE '=' NUMBER
989                 { $$ = new Value($3); }
990                 ;
991
992 OptSdagCode     : /* Empty */
993                 { $$ = 0; }
994                 | SingleConstruct
995                 { $$ = new SdagConstruct(SSDAGENTRY, $1); }
996                 | '{' Slist '}'
997                 { $$ = new SdagConstruct(SSDAGENTRY, $2); }
998                 ;
999
1000 Slist           : SingleConstruct
1001                 { $$ = new SdagConstruct(SSLIST, $1); }
1002                 | SingleConstruct Slist
1003                 { $$ = new SdagConstruct(SSLIST, $1, $2);  }
1004                 ;
1005
1006 Olist           : SingleConstruct
1007                 { $$ = new SdagConstruct(SOLIST, $1); }
1008                 | SingleConstruct Slist
1009                 { $$ = new SdagConstruct(SOLIST, $1, $2); } 
1010                 ;
1011
1012 OptPubList      : /* Empty */
1013                 { $$ = 0; }
1014                 | PUBLISHES '(' PublishesList ')'
1015                 { $$ = $3; }
1016                 ;
1017
1018 PublishesList   : IDENT 
1019                 { $$ = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, $1)); }
1020                 | IDENT ',' PublishesList 
1021                 { $$ = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, $1), $3);  }
1022                 ;
1023
1024 OptTraceName    : LITERAL
1025                  { $$ = $1; }
1026                 |
1027                  { $$ = 0; }
1028                 ;
1029
1030 SingleConstruct : ATOMIC OptTraceName ParamBraceStart CCode ParamBraceEnd OptPubList 
1031                  {
1032                    $$ = buildAtomic($4, $6, $2);
1033                  }
1034                 | CONNECT '(' IDENT EParameters ')' ParamBraceStart CCode '}'
1035                 {  
1036                    in_braces = 0;
1037                    if (($4->isVoid() == 0) && ($4->isMessage() == 0))
1038                    {
1039                       connectEntries.push_back(new Entry(0, 0, new BuiltinType("void"), $3,
1040                                         new ParamList(new Parameter(lineno, new PtrType( 
1041                                         new NamedType("CkMarshallMsg")), "_msg")), 0, 0, 0, 1, $4));
1042                    }
1043                    else  {
1044                       connectEntries.push_back(new Entry(0, 0, new BuiltinType("void"), $3, $4, 0, 0, 0, 1, $4));
1045                    }
1046                    $$ = new SdagConstruct(SCONNECT, $3, $7, $4);
1047                 }
1048                 | WHEN SEntryList '{' '}'
1049                 { $$ = new WhenConstruct($2, 0); }
1050                 | WHEN SEntryList SingleConstruct
1051                 { $$ = new WhenConstruct($2, $3); }
1052                 | WHEN SEntryList '{' Slist '}'
1053                 { $$ = new WhenConstruct($2, $4); }
1054                 | OVERLAP '{' Olist '}'
1055                 { $$ = new SdagConstruct(SOVERLAP,0, 0,0,0,0,$3, 0); }  
1056                 | FOR StartIntExpr CCode ';' CCode ';' CCode  EndIntExpr '{' Slist '}'
1057                 { $$ = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, $3), new SdagConstruct(SINT_EXPR, $5),
1058                              new SdagConstruct(SINT_EXPR, $7), 0, $10, 0); }
1059                 | FOR StartIntExpr CCode ';' CCode ';' CCode  EndIntExpr SingleConstruct
1060                 { $$ = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, $3), new SdagConstruct(SINT_EXPR, $5), 
1061                          new SdagConstruct(SINT_EXPR, $7), 0, $9, 0); }
1062                 | FORALL '[' IDENT ']' StartIntExpr CCode ':' CCode ',' CCode  EndIntExpr SingleConstruct
1063                 { $$ = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, $3), new SdagConstruct(SINT_EXPR, $6), 
1064                              new SdagConstruct(SINT_EXPR, $8), new SdagConstruct(SINT_EXPR, $10), $12, 0); }
1065                 | FORALL '[' IDENT ']' StartIntExpr CCode ':' CCode ',' CCode  EndIntExpr '{' Slist '}' 
1066                 { $$ = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, $3), new SdagConstruct(SINT_EXPR, $6), 
1067                                  new SdagConstruct(SINT_EXPR, $8), new SdagConstruct(SINT_EXPR, $10), $13, 0); }
1068                 | IF StartIntExpr CCode EndIntExpr SingleConstruct HasElse
1069                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), $6,0,0,$5,0); }
1070                 | IF StartIntExpr CCode EndIntExpr '{' Slist '}' HasElse
1071                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), $8,0,0,$6,0); }
1072                 | WHILE StartIntExpr CCode EndIntExpr SingleConstruct 
1073                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), 0,0,0,$5,0); }
1074                 | WHILE StartIntExpr CCode EndIntExpr '{' Slist '}' 
1075                 { $$ = new SdagConstruct(SWHILE, 0, new SdagConstruct(SINT_EXPR, $3), 0,0,0,$6,0); }
1076                 | FORWARD ForwardList ';'
1077                 { $$ = $2; }
1078                 | ParamBraceStart CCode ParamBraceEnd
1079                 { $$ = buildAtomic($2, NULL, NULL); }
1080                 | error
1081                 { printf("Unknown SDAG construct or malformed entry method definition.\n"
1082                          "You may have forgotten to terminate an entry method definition with a"
1083                          " semicolon or forgotten to mark a block of sequential SDAG code as 'atomic'\n"); YYABORT; }
1084                 ;
1085
1086 HasElse         : /* Empty */
1087                 { $$ = 0; }
1088                 | ELSE SingleConstruct
1089                 { $$ = new SdagConstruct(SELSE, 0,0,0,0,0, $2,0); }
1090                 | ELSE '{' Slist '}'
1091                 { $$ = new SdagConstruct(SELSE, 0,0,0,0,0, $3,0); }
1092                 ;
1093 ForwardList     : IDENT 
1094                 { $$ = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, $1)); }
1095                 | IDENT ',' ForwardList 
1096                 { $$ = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, $1), $3);  }
1097                 ;
1098
1099 EndIntExpr      : ')'
1100                 { in_int_expr = 0; $$ = 0; }
1101                 ;
1102
1103 StartIntExpr    : '('
1104                 { in_int_expr = 1; $$ = 0; }
1105                 ;
1106
1107 SEntry          : IDENT EParameters
1108                 { $$ = new Entry(lineno, 0, 0, $1, $2, 0, 0, 0, 0); }
1109                 | IDENT SParamBracketStart CCode SParamBracketEnd EParameters 
1110                 { $$ = new Entry(lineno, 0, 0, $1, $5, 0, 0, $3, 0); }
1111                 ;
1112
1113 SEntryList      : SEntry 
1114                 { $$ = new EntryList($1); }
1115                 | SEntry ',' SEntryList
1116                 { $$ = new EntryList($1,$3); }
1117                 ;
1118
1119 SParamBracketStart : '['
1120                    { in_bracket=1; } 
1121                    ;
1122 SParamBracketEnd   : ']'
1123                    { in_bracket=0; } 
1124                    ;
1125
1126 HashIFComment   : HASHIF Name
1127                 { if (!macroDefined($2, 1)) in_comment = 1; }
1128                 ;
1129
1130 HashIFDefComment: HASHIFDEF Name
1131                 { if (!macroDefined($2, 0)) in_comment = 1; }
1132                 ;
1133
1134 %%
1135 void yyerror(const char *mesg)
1136 {
1137     std::cerr << cur_file<<":"<<lineno<<": Charmxi syntax error> "
1138               << mesg << std::endl;
1139 }