Merge branch 'emenese2/liveVizBoundArray' into charm
[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
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 NonEntryMember InitNode InitProc
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 Construct       : OptExtern '{' ConstructList '}' OptSemiColon
216         { if($3) $3->setExtern($1); $$ = $3; }
217         | NAMESPACE Name '{' ConstructList '}'
218         { $$ = new Scope($2, $4); }
219         | USING NAMESPACE QualName ';'
220         { $$ = new UsingScope($3, false); }
221         | USING QualName ';'
222         { $$ = new UsingScope($2, true); }
223         | OptExtern Module
224         { $2->setExtern($1); $$ = $2; }
225         | OptExtern NonEntryMember
226         { $2->setExtern($1); $$ = $2; }
227         | OptExtern Message ';'
228         { $2->setExtern($1); $$ = $2; }
229         | OptExtern Chare
230         { $2->setExtern($1); $$ = $2; }
231         | OptExtern Group
232         { $2->setExtern($1); $$ = $2; }
233         | OptExtern NodeGroup
234         { $2->setExtern($1); $$ = $2; }
235         | OptExtern Array
236         { $2->setExtern($1); $$ = $2; }
237         | OptExtern Template
238         { $2->setExtern($1); $$ = $2; }
239         | EXTERN ENTRY EReturn QualNamedType Name OptTParams EParameters ';'
240         {
241           Entry *e = new Entry(lineno, 0, $3, $5, $7, 0, 0, 0, 0, 0);
242           int isExtern = 1;
243           e->setExtern(isExtern);
244           e->targs = $6;
245           e->label = new XStr;
246           $4->print(*e->label);
247           $$ = e;
248         }
249         | HashIFComment
250         { $$ = NULL; }
251         | HashIFDefComment
252         { $$ = NULL; }
253         | AccelBlock
254         { $$ = $1; }
255         ;
256
257 TParam          : Type
258                 { $$ = new TParamType($1); }
259                 | NUMBER
260                 { $$ = new TParamVal($1); }
261                 | LITERAL
262                 { $$ = new TParamVal($1); }
263                 ;
264
265 TParamList      : TParam
266                 { $$ = new TParamList($1); }
267                 | TParam ',' TParamList
268                 { $$ = new TParamList($1, $3); }
269                 ;
270
271 TParamEList     : /* Empty */
272                 { $$ = 0; }
273                 | TParamList
274                 { $$ = $1; }
275                 ;
276
277 OptTParams      :  /* Empty */
278                 { $$ = 0; }
279                 | '<' TParamEList '>'
280                 { $$ = $2; }
281                 ;
282
283 BuiltinType     : INT
284                 { $$ = new BuiltinType("int"); }
285                 | LONG
286                 { $$ = new BuiltinType("long"); }
287                 | SHORT
288                 { $$ = new BuiltinType("short"); }
289                 | CHAR
290                 { $$ = new BuiltinType("char"); }
291                 | UNSIGNED INT
292                 { $$ = new BuiltinType("unsigned int"); }
293                 | UNSIGNED LONG
294                 { $$ = new BuiltinType("unsigned long"); }
295                 | UNSIGNED LONG INT
296                 { $$ = new BuiltinType("unsigned long"); }
297                 | UNSIGNED LONG LONG
298                 { $$ = new BuiltinType("unsigned long long"); }
299                 | UNSIGNED SHORT
300                 { $$ = new BuiltinType("unsigned short"); }
301                 | UNSIGNED CHAR
302                 { $$ = new BuiltinType("unsigned char"); }
303                 | LONG LONG
304                 { $$ = new BuiltinType("long long"); }
305                 | FLOAT
306                 { $$ = new BuiltinType("float"); }
307                 | DOUBLE
308                 { $$ = new BuiltinType("double"); }
309                 | LONG DOUBLE
310                 { $$ = new BuiltinType("long double"); }
311                 | VOID
312                 { $$ = new BuiltinType("void"); }
313                 ;
314
315 NamedType       : Name OptTParams { $$ = new NamedType($1,$2); };
316 QualNamedType   : QualName OptTParams { 
317                     const char* basename, *scope;
318                     splitScopedName($1, &scope, &basename);
319                     $$ = new NamedType(basename, $2, scope);
320                 }
321                 ;
322
323 SimpleType      : BuiltinType
324                 { $$ = $1; }
325                 | QualNamedType
326                 { $$ = $1; }
327                 ;
328
329 OnePtrType      : SimpleType '*'
330                 { $$ = new PtrType($1); }
331                 ;
332
333 PtrType         : OnePtrType '*'
334                 { $1->indirect(); $$ = $1; }
335                 | PtrType '*'
336                 { $1->indirect(); $$ = $1; }
337                 ;
338
339 FuncType        : BaseType '(' '*' Name ')' '(' ParamList ')'
340                 { $$ = new FuncType($1, $4, $7); }
341                 ;
342
343 BaseType        : SimpleType
344                 { $$ = $1; }
345                 | OnePtrType
346                 { $$ = $1; }
347                 | PtrType
348                 { $$ = $1; }
349                 | FuncType
350                 { $$ = $1; }
351                 //{ $$ = $1; }
352                 | CONST BaseType 
353                 { $$ = $2; }
354                 | BaseType CONST
355                 { $$ = $1; }
356                 ;
357
358 Type            : BaseType '&'
359                 { $$ = new ReferenceType($1); }
360                 | BaseType
361                 { $$ = $1; }
362                 ;
363
364 ArrayDim        : NUMBER
365                 { $$ = new Value($1); }
366                 | QualName
367                 { $$ = new Value($1); }
368                 ;
369
370 Dim             : '[' ArrayDim ']'
371                 { $$ = $2; }
372                 ;
373
374 DimList         : /* Empty */
375                 { $$ = 0; }
376                 | Dim DimList
377                 { $$ = new ValueList($1, $2); }
378                 ;
379
380 Readonly        : READONLY Type QualName DimList
381                 { $$ = new Readonly(lineno, $2, $3, $4); }
382                 ;
383
384 ReadonlyMsg     : READONLY MESSAGE SimpleType '*'  Name
385                 { $$ = new Readonly(lineno, $3, $5, 0, 1); }
386                 ;
387
388 OptVoid         : /*Empty*/
389                 { $$ = 0;}
390                 | VOID
391                 { $$ = 0;}
392                 ;
393
394 MAttribs        : /* Empty */
395                 { $$ = 0; }
396                 | '[' MAttribList ']'
397                 { 
398                   /*
399                   printf("Warning: Message attributes are being phased out.\n");
400                   printf("Warning: Please remove them from interface files.\n");
401                   */
402                   $$ = $2; 
403                 }
404                 ;
405
406 MAttribList     : MAttrib
407                 { $$ = $1; }
408                 | MAttrib ',' MAttribList
409                 { $$ = $1 | $3; }
410                 ;
411
412 MAttrib         : PACKED
413                 { $$ = 0; }
414                 | VARSIZE
415                 { $$ = 0; }
416                 ;
417
418 CAttribs        : /* Empty */
419                 { $$ = 0; }
420                 | '[' CAttribList ']'
421                 { $$ = $2; }
422                 ;
423
424 CAttribList     : CAttrib
425                 { $$ = $1; }
426                 | CAttrib ',' CAttribList
427                 { $$ = $1 | $3; }
428                 ;
429
430 PythonOptions   : /* Empty */
431                 { python_doc = NULL; $$ = 0; }
432                 | LITERAL
433                 { python_doc = $1; $$ = 0; }
434                 ;
435
436 ArrayAttrib     : PYTHON
437                 { $$ = Chare::CPYTHON; }
438                 ;
439
440 ArrayAttribs    : /* Empty */
441                 { $$ = 0; }
442                 | '[' ArrayAttribList ']'
443                 { $$ = $2; }
444                 ;
445
446 ArrayAttribList : ArrayAttrib
447                 { $$ = $1; }
448                 | ArrayAttrib ',' ArrayAttribList
449                 { $$ = $1 | $3; }
450                 ;
451
452 CAttrib         : MIGRATABLE
453                 { $$ = Chare::CMIGRATABLE; }
454                 | PYTHON
455                 { $$ = Chare::CPYTHON; }
456                 ;
457
458 OptConditional  : /* Empty */
459                 { $$ = 0; }
460                 | CONDITIONAL
461                 { $$ = 1; }
462
463 MsgArray        : /* Empty */
464                 { $$ = 0; }
465                 | '[' ']'
466                 { $$ = 1; }
467
468 Var             : OptConditional Type Name MsgArray ';'
469                 { $$ = new MsgVar($2, $3, $1, $4); }
470                 ;
471
472 VarList         : Var
473                 { $$ = new MsgVarList($1); }
474                 | Var VarList
475                 { $$ = new MsgVarList($1, $2); }
476                 ;
477
478 Message         : MESSAGE MAttribs NamedType
479                 { $$ = new Message(lineno, $3); }
480                 | MESSAGE MAttribs NamedType '{' VarList '}'
481                 { $$ = new Message(lineno, $3, $5); }
482                 ;
483
484 OptBaseList     : /* Empty */
485                 { $$ = 0; }
486                 | ':' BaseList
487                 { $$ = $2; }
488                 ;
489
490 BaseList        : QualNamedType
491                 { $$ = new TypeList($1); }
492                 | QualNamedType ',' BaseList
493                 { $$ = new TypeList($1, $3); }
494                 ;
495
496 Chare           : CHARE CAttribs NamedType OptBaseList MemberEList
497                 { $$ = new Chare(lineno, $2|Chare::CCHARE, $3, $4, $5); }
498                 | MAINCHARE CAttribs NamedType OptBaseList MemberEList
499                 { $$ = new MainChare(lineno, $2, $3, $4, $5); }
500                 ;
501
502 Group           : GROUP CAttribs NamedType OptBaseList MemberEList
503                 { $$ = new Group(lineno, $2, $3, $4, $5); }
504                 ;
505
506 NodeGroup       : NODEGROUP CAttribs NamedType OptBaseList MemberEList
507                 { $$ = new NodeGroup(lineno, $2, $3, $4, $5); }
508                 ;
509
510 ArrayIndexType  : '[' NUMBER Name ']'
511                 {/*Stupid special case for [1D] indices*/
512                         char *buf=new char[40];
513                         sprintf(buf,"%sD",$2);
514                         $$ = new NamedType(buf); 
515                 }
516                 | '[' Name ']'
517                 { $$ = new NamedType($2); }
518                 ;
519
520 Array           : ARRAY ArrayAttribs ArrayIndexType NamedType OptBaseList MemberEList
521                 {  $$ = new Array(lineno, $2, $3, $4, $5, $6); }
522                 | ARRAY ArrayIndexType ArrayAttribs NamedType OptBaseList MemberEList
523                 {  $$ = new Array(lineno, $3, $2, $4, $5, $6); }
524                 ;
525
526 TChare          : CHARE CAttribs Name OptBaseList MemberEList
527                 { $$ = new Chare(lineno, $2|Chare::CCHARE, new NamedType($3), $4, $5);}
528                 | MAINCHARE CAttribs Name OptBaseList MemberEList
529                 { $$ = new MainChare(lineno, $2, new NamedType($3), $4, $5); }
530                 ;
531
532 TGroup          : GROUP CAttribs Name OptBaseList MemberEList
533                 { $$ = new Group(lineno, $2, new NamedType($3), $4, $5); }
534                 ;
535
536 TNodeGroup      : NODEGROUP CAttribs Name OptBaseList MemberEList
537                 { $$ = new NodeGroup( lineno, $2, new NamedType($3), $4, $5); }
538                 ;
539
540 TArray          : ARRAY ArrayIndexType Name OptBaseList MemberEList
541                 { $$ = new Array( lineno, 0, $2, new NamedType($3), $4, $5); }
542                 ;
543
544 TMessage        : MESSAGE MAttribs Name ';'
545                 { $$ = new Message(lineno, new NamedType($3)); }
546                 | MESSAGE MAttribs Name '{' VarList '}' ';'
547                 { $$ = new Message(lineno, new NamedType($3), $5); }
548                 ;
549
550 OptTypeInit     : /* Empty */
551                 { $$ = 0; }
552                 | '=' Type
553                 { $$ = $2; }
554                 ;
555
556 OptNameInit     : /* Empty */
557                 { $$ = 0; }
558                 | '=' NUMBER
559                 { $$ = $2; }
560                 | '=' LITERAL
561                 { $$ = $2; }
562                 ;
563
564 TVar            : CLASS Name OptTypeInit
565                 { $$ = new TType(new NamedType($2), $3); }
566                 | FuncType OptNameInit
567                 { $$ = new TFunc($1, $2); }
568                 | Type Name OptNameInit
569                 { $$ = new TName($1, $2, $3); }
570                 ;
571
572 TVarList        : TVar
573                 { $$ = new TVarList($1); }
574                 | TVar ',' TVarList
575                 { $$ = new TVarList($1, $3); }
576                 ;
577
578 TemplateSpec    : TEMPLATE '<' TVarList '>'
579                 { $$ = $3; }
580                 ;
581
582 Template        : TemplateSpec TChare
583                 { $$ = new Template($1, $2); $2->setTemplate($$); }
584                 | TemplateSpec TGroup
585                 { $$ = new Template($1, $2); $2->setTemplate($$); }
586                 | TemplateSpec TNodeGroup
587                 { $$ = new Template($1, $2); $2->setTemplate($$); }
588                 | TemplateSpec TArray
589                 { $$ = new Template($1, $2); $2->setTemplate($$); }
590                 | TemplateSpec TMessage
591                 { $$ = new Template($1, $2); $2->setTemplate($$); }
592                 ;
593
594 MemberEList     : ';'
595                 { $$ = 0; }
596                 | '{' MemberList '}' OptSemiColon
597                 { $$ = $2; }
598                 ;
599
600 MemberList      : /* Empty */
601                 { 
602                   Entry *tempEntry;
603                   if (!connectEntries->empty()) {
604                     tempEntry = connectEntries->begin();
605                     MemberList *ml;
606                     ml = new MemberList(tempEntry, 0);
607                     tempEntry = connectEntries->next();
608                     for(; !connectEntries->end(); tempEntry = connectEntries->next()) {
609                       ml->appendMember(tempEntry); 
610                     }
611                     while (!connectEntries->empty())
612                       connectEntries->pop();
613                     $$ = ml; 
614                   }
615                   else {
616                     $$ = 0; 
617                   }
618                 }
619                 | Member MemberList
620                 { $$ = new MemberList($1, $2); }
621                 ;
622
623 NonEntryMember  : Readonly ';'
624                 { $$ = $1; }
625                 | ReadonlyMsg ';'
626                 { $$ = $1; }
627                 | InitProc ';'
628                 | InitNode ';'
629                 { $$ = $1; }
630                 | PUPABLE PUPableClass ';'
631                 { $$ = $2; }
632                 | INCLUDE IncludeFile ';'
633                 { $$ = $2; }
634                 | CLASS Name ';'
635                 { $$ = new ClassDeclaration(lineno,$2); } 
636                 ;
637
638 InitNode        : INITNODE OptVoid QualName
639                 { $$ = new InitCall(lineno, $3, 1); }
640                 | INITNODE OptVoid QualName '(' OptVoid ')'
641                 { $$ = new InitCall(lineno, $3, 1); }
642                 | INITNODE OptVoid QualName '<' TParamList '>' '(' OptVoid ')'
643                 { $$ = new InitCall(lineno,
644                                     strdup((std::string($3) + '<' +
645                                             ($5)->to_string() + '>').c_str()),
646                                     1);
647                 }
648                 | INITCALL OptVoid QualName
649                 { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n"); 
650                   $$ = new InitCall(lineno, $3, 1); }
651                 | INITCALL OptVoid QualName '(' OptVoid ')'
652                 { printf("Warning: deprecated use of initcall. Use initnode or initproc instead.\n");
653                   $$ = new InitCall(lineno, $3, 1); }
654                 ;
655
656 InitProc        : INITPROC OptVoid QualName
657                 { $$ = new InitCall(lineno, $3, 0); }
658                 | INITPROC OptVoid QualName '(' OptVoid ')'
659                 { $$ = new InitCall(lineno, $3, 0); }
660                 | INITPROC OptVoid QualName '<' TParamList '>' '(' OptVoid ')'
661                 { $$ = new InitCall(lineno,
662                                     strdup((std::string($3) + '<' +
663                                             ($5)->to_string() + '>').c_str()),
664                                     0);
665                 }
666                 | INITPROC '[' ACCEL ']' OptVoid QualName '(' OptVoid ')'
667                 {
668                   InitCall* rtn = new InitCall(lineno, $6, 0);
669                   rtn->setAccel();
670                   $$ = rtn;
671                 }
672                 ;
673
674 PUPableClass    : QualNamedType
675                 { $$ = new PUPableClass(lineno,$1,0); } 
676                 | QualNamedType ',' PUPableClass
677                 { $$ = new PUPableClass(lineno,$1,$3); }
678                 ;
679 IncludeFile    : LITERAL
680                 { $$ = new IncludeFile(lineno,$1); } 
681                 ;
682
683 Member          : Entry ';'
684                 { $$ = $1; }
685                 | TemplateSpec Entry ';'
686                 {
687                   $2->tspec = $1;
688                   $$ = $2;
689                 }
690                 | NonEntryMember
691                 { $$ = $1; }
692                 ;
693
694 Entry           : ENTRY EAttribs EReturn Name EParameters OptStackSize OptSdagCode
695                 { 
696                   if ($7 != 0) { 
697                     $7->con1 = new SdagConstruct(SIDENT, $4);
698                     $7->param = new ParamList($5);
699                   }
700                   $$ = new Entry(lineno, $2, $3, $4, $5, $6, $7, 0, 0); 
701                 }
702                 | ENTRY EAttribs Name EParameters OptSdagCode /*Constructor*/
703                 { 
704                   if ($5 != 0) {
705                     $5->con1 = new SdagConstruct(SIDENT, $3);
706                     $5->param = new ParamList($4);
707                   }
708                   Entry *e = new Entry(lineno, $2,     0, $3, $4,  0, $5, 0, 0);
709                   if (e->param && e->param->isCkMigMsgPtr()) {
710                     yyerror("Charm++ takes a CkMigrateMsg chare constructor for granted, but continuing anyway");
711                     $$ = NULL;
712                   } else
713                     $$ = e;
714                 }
715                 | ENTRY '[' ACCEL ']' VOID Name EParameters AccelEParameters ParamBraceStart CCode ParamBraceEnd Name /* DMK : Accelerated Entry Method */
716                 {
717                   int attribs = SACCEL;
718                   const char* name = $6;
719                   ParamList* paramList = $7;
720                   ParamList* accelParamList = $8;
721                   XStr* codeBody = new XStr($10);
722                   const char* callbackName = $12;
723
724                   $$ = new Entry(lineno, attribs, new BuiltinType("void"), name, paramList,
725                                  0, 0, 0, 0, 0
726                                 );
727                   $$->setAccelParam(accelParamList);
728                   $$->setAccelCodeBody(codeBody);
729                   $$->setAccelCallbackName(new XStr(callbackName));
730                 }
731                 ;
732
733 AccelBlock      : ACCELBLOCK ParamBraceStart CCode ParamBraceEnd ';'
734                 { $$ = new AccelBlock(lineno, new XStr($3)); }
735                 | ACCELBLOCK ';'
736                 { $$ = new AccelBlock(lineno, NULL); }
737                 ;
738
739 EReturn         : VOID
740                 { $$ = new BuiltinType("void"); }
741                 | OnePtrType
742                 { $$ = $1; }
743                 ;
744
745 EAttribs        : /* Empty */
746                 { $$ = 0; }
747                 | '[' EAttribList ']'
748                 { $$ = $2; }
749                 ;
750
751 EAttribList     : EAttrib
752                 { $$ = $1; }
753                 | EAttrib ',' EAttribList
754                 { $$ = $1 | $3; }
755                 ;
756
757 EAttrib         : THREADED
758                 { $$ = STHREADED; }
759                 | SYNC
760                 { $$ = SSYNC; }
761                 | IGET
762                 { $$ = SIGET; }
763                 | EXCLUSIVE
764                 { $$ = SLOCKED; }
765                 | CREATEHERE
766                 { $$ = SCREATEHERE; }
767                 | CREATEHOME
768                 { $$ = SCREATEHOME; }
769                 | NOKEEP
770                 { $$ = SNOKEEP; }
771                 | NOTRACE
772                 { $$ = SNOTRACE; }
773                 | IMMEDIATE
774                 { $$ = SIMMEDIATE; }
775                 | SKIPSCHED
776                 { $$ = SSKIPSCHED; }
777                 | INLINE
778                 { $$ = SINLINE; }
779                 | LOCAL
780                 { $$ = SLOCAL; }
781                 | PYTHON PythonOptions
782                 { $$ = SPYTHON; }
783                 | MEMCRITICAL
784                 { $$ = SMEM; }
785         | REDUCTIONTARGET
786         { $$ = SREDUCE; }
787                 ;
788
789 DefaultParameter: LITERAL
790                 { $$ = new Value($1); }
791                 | NUMBER
792                 { $$ = new Value($1); }
793                 | QualName
794                 { $$ = new Value($1); }
795                 ;
796
797 CPROGRAM_List   :  /* Empty */
798                 { $$ = ""; }
799                 | CPROGRAM
800                 { $$ = $1; }
801                 | CPROGRAM ',' CPROGRAM_List
802                 {  /*Returned only when in_bracket*/
803                         char *tmp = new char[strlen($1)+strlen($3)+3];
804                         sprintf(tmp,"%s, %s", $1, $3);
805                         $$ = tmp;
806                 }
807                 ;
808
809 CCode           : /* Empty */
810                 { $$ = ""; }
811                 | CPROGRAM
812                 { $$ = $1; }
813                 | CPROGRAM '[' CCode ']' CCode
814                 {  /*Returned only when in_bracket*/
815                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
816                         sprintf(tmp,"%s[%s]%s", $1, $3, $5);
817                         $$ = tmp;
818                 }
819                 | CPROGRAM '{' CCode '}' CCode
820                 { /*Returned only when in_braces*/
821                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
822                         sprintf(tmp,"%s{%s}%s", $1, $3, $5);
823                         $$ = tmp;
824                 }
825                 | CPROGRAM '(' CPROGRAM_List ')' CCode
826                 { /*Returned only when in_braces*/
827                         char *tmp = new char[strlen($1)+strlen($3)+strlen($5)+3];
828                         sprintf(tmp,"%s(%s)%s", $1, $3, $5);
829                         $$ = tmp;
830                 }
831                 |'(' CCode ')' CCode
832                 { /*Returned only when in_braces*/
833                         char *tmp = new char[strlen($2)+strlen($4)+3];
834                         sprintf(tmp,"(%s)%s", $2, $4);
835                         $$ = tmp;
836                 }
837                 ;
838
839 ParamBracketStart : Type Name '['
840                 {  /*Start grabbing CPROGRAM segments*/
841                         in_bracket=1;
842                         $$ = new Parameter(lineno, $1,$2);
843                 }
844                 ;
845
846 ParamBraceStart : '{'
847                 { 
848                    /*Start grabbing CPROGRAM segments*/
849                         in_braces=1;
850                         $$ = 0;
851                 }
852                 ;
853
854 ParamBraceEnd   : '}'
855                 { 
856                         in_braces=0;
857                         $$ = 0;
858                 }
859                 ;
860
861 Parameter       : Type
862                 { $$ = new Parameter(lineno, $1);}
863                 | Type Name OptConditional
864                 { $$ = new Parameter(lineno, $1,$2); $$->setConditional($3); }
865                 | Type Name '=' DefaultParameter
866                 { $$ = new Parameter(lineno, $1,$2,0,$4);} 
867                 | ParamBracketStart CCode ']'
868                 { /*Stop grabbing CPROGRAM segments*/
869                         in_bracket=0;
870                         $$ = new Parameter(lineno, $1->getType(), $1->getName() ,$2);
871                 } 
872                 ;
873
874 AccelBufferType : READONLY  { $$ = Parameter::ACCEL_BUFFER_TYPE_READONLY; }
875                 | READWRITE { $$ = Parameter::ACCEL_BUFFER_TYPE_READWRITE; }
876                 | WRITEONLY { $$ = Parameter::ACCEL_BUFFER_TYPE_WRITEONLY; }
877                 ;
878
879 AccelInstName   : Name { $$ = new XStr($1); }
880                 | AccelInstName '-' '>' Name { $$ = new XStr(""); *($$) << *($1) << "->" << $4; }
881                 | AccelInstName '.' Name { $$ = new XStr(""); *($$) << *($1) << "." << $3; }
882                 | AccelInstName '[' AccelInstName ']'
883                 {
884                   $$ = new XStr("");
885                   *($$) << *($1) << "[" << *($3) << "]";
886                   delete $1;
887                   delete $3;
888                 }
889                 | AccelInstName '[' NUMBER ']'
890                 {
891                   $$ = new XStr("");
892                   *($$) << *($1) << "[" << $3 << "]";
893                   delete $1;
894                 }
895                 | AccelInstName '(' AccelInstName ')'
896                 {
897                   $$ = new XStr("");
898                   *($$) << *($1) << "(" << *($3) << ")";
899                   delete $1;
900                   delete $3;
901                 }
902                 ;
903
904 AccelArrayParam : ParamBracketStart CCode ']'
905                 {
906                   in_bracket = 0;
907                   $$ = new Parameter(lineno, $1->getType(), $1->getName(), $2);
908                 }
909                 ;
910
911 AccelParameter  : AccelBufferType ':' Type Name '<' AccelInstName '>'
912                 {
913                   $$ = new Parameter(lineno, $3, $4);
914                   $$->setAccelInstName($6);
915                   $$->setAccelBufferType($1);
916                 }
917                 | Type Name '<' AccelInstName '>'
918                 {
919                   $$ = new Parameter(lineno, $1, $2);
920                   $$->setAccelInstName($4);
921                   $$->setAccelBufferType(Parameter::ACCEL_BUFFER_TYPE_READWRITE);
922                 }
923                 | AccelBufferType ':' AccelArrayParam '<' AccelInstName '>'
924                 {
925                   $$ = $3;
926                   $$->setAccelInstName($5);
927                   $$->setAccelBufferType($1);
928                 }
929                 ;
930
931 ParamList       : Parameter
932                 { $$ = new ParamList($1); }
933                 | Parameter ',' ParamList
934                 { $$ = new ParamList($1,$3); }
935                 ;
936
937 AccelParamList  : AccelParameter
938                 { $$ = new ParamList($1); }
939                 | AccelParameter ',' AccelParamList
940                 { $$ = new ParamList($1,$3); }
941                 ;
942
943 EParameters     : '(' ParamList ')'
944                 { $$ = $2; }
945                 | '(' ')'
946                 { $$ = new ParamList(new Parameter(0, new BuiltinType("void"))); }
947                 ;
948
949 AccelEParameters  : '[' AccelParamList ']'
950                   { $$ = $2; }
951                   | '[' ']'
952                   { $$ = 0; }
953                   ;
954
955 OptStackSize    : /* Empty */
956                 { $$ = 0; }
957                 | STACKSIZE '=' NUMBER
958                 { $$ = new Value($3); }
959                 ;
960
961 OptSdagCode     : /* Empty */
962                 { $$ = 0; }
963                 | SingleConstruct
964                 { $$ = new SdagConstruct(SSDAGENTRY, $1); }
965                 | '{' Slist '}'
966                 { $$ = new SdagConstruct(SSDAGENTRY, $2); }
967                 ;
968
969 Slist           : SingleConstruct
970                 { $$ = new SdagConstruct(SSLIST, $1); }
971                 | SingleConstruct Slist
972                 { $$ = new SdagConstruct(SSLIST, $1, $2);  }
973                 ;
974
975 Olist           : SingleConstruct
976                 { $$ = new SdagConstruct(SOLIST, $1); }
977                 | SingleConstruct Slist
978                 { $$ = new SdagConstruct(SOLIST, $1, $2); } 
979                 ;
980
981 OptPubList      : /* Empty */
982                 { $$ = 0; }
983                 | PUBLISHES '(' PublishesList ')'
984                 { $$ = $3; }
985                 ;
986
987 PublishesList   : IDENT 
988                 { $$ = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, $1)); }
989                 | IDENT ',' PublishesList 
990                 { $$ = new SdagConstruct(SPUBLISHES, new SdagConstruct(SIDENT, $1), $3);  }
991                 ;
992
993 OptTraceName    : LITERAL
994                  { $$ = $1; }
995                 |
996                  { $$ = 0; }
997                 ;
998
999 SingleConstruct : ATOMIC OptTraceName ParamBraceStart CCode ParamBraceEnd OptPubList 
1000                  {
1001                    $$ = buildAtomic($4, $6, $2);
1002                  }
1003                 | CONNECT '(' IDENT EParameters ')' ParamBraceStart CCode '}'
1004                 {  
1005                    in_braces = 0;
1006                    if (($4->isVoid() == 0) && ($4->isMessage() == 0))
1007                    {
1008                       connectEntries->append(new Entry(0, 0, new BuiltinType("void"), $3, 
1009                                         new ParamList(new Parameter(lineno, new PtrType( 
1010                                         new NamedType("CkMarshallMsg")), "_msg")), 0, 0, 0, 1, $4));
1011                    }
1012                    else  {
1013                       connectEntries->append(new Entry(0, 0, new BuiltinType("void"), $3, $4, 0, 0, 0, 1, $4));
1014                    }
1015                    $$ = new SdagConstruct(SCONNECT, $3, $7, $4);
1016                 }
1017                 | WHEN SEntryList '{' '}'
1018                 { $$ = new SdagConstruct(SWHEN, 0, 0, 0,0,0, 0,  $2); }
1019                 | WHEN SEntryList SingleConstruct
1020                 { $$ = new SdagConstruct(SWHEN, 0, 0, 0,0,0, $3, $2); }
1021                 | WHEN SEntryList '{' Slist '}'
1022                 { $$ = new SdagConstruct(SWHEN, 0, 0, 0,0,0, $4, $2); }
1023                 | OVERLAP '{' Olist '}'
1024                 { $$ = new SdagConstruct(SOVERLAP,0, 0,0,0,0,$3, 0); }  
1025                 | FOR StartIntExpr CCode ';' CCode ';' CCode  EndIntExpr '{' Slist '}'
1026                 { $$ = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, $3), new SdagConstruct(SINT_EXPR, $5),
1027                              new SdagConstruct(SINT_EXPR, $7), 0, $10, 0); }
1028                 | FOR StartIntExpr CCode ';' CCode ';' CCode  EndIntExpr SingleConstruct
1029                 { $$ = new SdagConstruct(SFOR, 0, new SdagConstruct(SINT_EXPR, $3), new SdagConstruct(SINT_EXPR, $5), 
1030                          new SdagConstruct(SINT_EXPR, $7), 0, $9, 0); }
1031                 | FORALL '[' IDENT ']' StartIntExpr CCode ':' CCode ',' CCode  EndIntExpr SingleConstruct
1032                 { $$ = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, $3), new SdagConstruct(SINT_EXPR, $6), 
1033                              new SdagConstruct(SINT_EXPR, $8), new SdagConstruct(SINT_EXPR, $10), $12, 0); }
1034                 | FORALL '[' IDENT ']' StartIntExpr CCode ':' CCode ',' CCode  EndIntExpr '{' Slist '}' 
1035                 { $$ = new SdagConstruct(SFORALL, 0, new SdagConstruct(SIDENT, $3), new SdagConstruct(SINT_EXPR, $6), 
1036                                  new SdagConstruct(SINT_EXPR, $8), new SdagConstruct(SINT_EXPR, $10), $13, 0); }
1037                 | IF StartIntExpr CCode EndIntExpr SingleConstruct HasElse
1038                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), $6,0,0,$5,0); }
1039                 | IF StartIntExpr CCode EndIntExpr '{' Slist '}' HasElse
1040                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), $8,0,0,$6,0); }
1041                 | WHILE StartIntExpr CCode EndIntExpr SingleConstruct 
1042                 { $$ = new SdagConstruct(SIF, 0, new SdagConstruct(SINT_EXPR, $3), 0,0,0,$5,0); }
1043                 | WHILE StartIntExpr CCode EndIntExpr '{' Slist '}' 
1044                 { $$ = new SdagConstruct(SWHILE, 0, new SdagConstruct(SINT_EXPR, $3), 0,0,0,$6,0); }
1045                 | FORWARD ForwardList ';'
1046                 { $$ = $2; }
1047                 | ParamBraceStart CCode ParamBraceEnd
1048                 { $$ = buildAtomic($2, NULL, NULL); }
1049
1050 HasElse         : /* Empty */
1051                 { $$ = 0; }
1052                 | ELSE SingleConstruct
1053                 { $$ = new SdagConstruct(SELSE, 0,0,0,0,0, $2,0); }
1054                 | ELSE '{' Slist '}'
1055                 { $$ = new SdagConstruct(SELSE, 0,0,0,0,0, $3,0); }
1056                 ;
1057 ForwardList     : IDENT 
1058                 { $$ = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, $1)); }
1059                 | IDENT ',' ForwardList 
1060                 { $$ = new SdagConstruct(SFORWARD, new SdagConstruct(SIDENT, $1), $3);  }
1061                 ;
1062
1063 EndIntExpr      : ')'
1064                 { in_int_expr = 0; $$ = 0; }
1065                 ;
1066
1067 StartIntExpr    : '('
1068                 { in_int_expr = 1; $$ = 0; }
1069                 ;
1070
1071 SEntry          : IDENT EParameters
1072                 { $$ = new Entry(lineno, 0, 0, $1, $2, 0, 0, 0, 0); }
1073                 | IDENT SParamBracketStart CCode SParamBracketEnd EParameters 
1074                 { $$ = new Entry(lineno, 0, 0, $1, $5, 0, 0, $3, 0); }
1075                 ;
1076
1077 SEntryList      : SEntry 
1078                 { $$ = new EntryList($1); }
1079                 | SEntry ',' SEntryList
1080                 { $$ = new EntryList($1,$3); }
1081                 ;
1082
1083 SParamBracketStart : '['
1084                    { in_bracket=1; } 
1085                    ;
1086 SParamBracketEnd   : ']'
1087                    { in_bracket=0; } 
1088                    ;
1089
1090 HashIFComment   : HASHIF Name
1091                 { if (!macroDefined($2, 1)) in_comment = 1; }
1092                 ;
1093
1094 HashIFDefComment: HASHIFDEF Name
1095                 { if (!macroDefined($2, 0)) in_comment = 1; }
1096                 ;
1097
1098 %%
1099 void yyerror(const char *mesg)
1100 {
1101     std::cerr << cur_file<<":"<<lineno<<": Charmxi syntax error> "
1102               << mesg << std::endl;
1103 }