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