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