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