* ILParser.jay: Implement properties
[mono.git] / mcs / ilasm / parser / ILParser.jay
1 %{\r
2 // Mono::ILASM::ILParser\r
3 //\r
4 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
5 \r
6 using PEAPI;\r
7 using System;\r
8 using System.IO;\r
9 using System.Collections;\r
10 using System.Globalization;\r
11 \r
12 namespace Mono.ILASM {\r
13 \r
14         public class ILParser {\r
15 \r
16                 private CodeGen codegen;\r
17 \r
18                 public ILParser (CodeGen codegen) {\r
19                         this.codegen = codegen;\r
20                 }\r
21 \r
22                 public CodeGen CodeGen {\r
23                         get { return codegen; }\r
24                 }\r
25                 \r
26 %}\r
27 \r
28 %token EOF\r
29 \r
30 /* ID - alpha-numeric identifier */\r
31 %token ID\r
32 \r
33 /* QSTRING - quoted string */\r
34 %token QSTRING\r
35 \r
36 /* SQSTRING - single quoted string */\r
37 %token SQSTRING\r
38 \r
39 /* INT32 - 32 bit integer */\r
40 %token INT32\r
41 \r
42 /* INT64 - 64 bit integer */\r
43 %token INT64\r
44 \r
45 /* FLOAT64 - floating point number */\r
46 %token FLOAT64\r
47 \r
48 /* HEXBYTE - two digit hex number */\r
49 %token HEXBYTE\r
50 \r
51 \r
52 /* Punctuation */\r
53 %token DOT           "."\r
54 %token OPEN_BRACE    "{"\r
55 %token CLOSE_BRACE   "}"\r
56 %token OPEN_BRACKET  "["\r
57 %token CLOSE_BRACKET "]"\r
58 %token OPEN_PARENS   "("\r
59 %token CLOSE_PARENS  ")"\r
60 %token COMMA         ","\r
61 %token COLON         ":"\r
62 %token DOUBLE_COLON  "::"\r
63 %token SEMICOLON     ";"\r
64 %token ASSIGN        "="\r
65 %token STAR          "*"\r
66 %token AMPERSAND     "&"\r
67 %token PLUS          "+"\r
68 %token SLASH         "/"\r
69 %token BANG          "!"\r
70 %token ELLIPSIS      "..."\r
71 %token DASH          "-"\r
72 %token OPEN_ANGLE_BRACKET   "<"\r
73 %token CLOSE_ANGLE_BRACKET  ">"\r
74 \r
75 \r
76 \r
77 %token UNKNOWN\r
78 \r
79 \r
80 /* INSTR_* instruction types */\r
81 %token INSTR_NONE\r
82 %token INSTR_VAR\r
83 %token INSTR_I\r
84 %token INSTR_I8\r
85 %token INSTR_R\r
86 %token INSTR_BRTARGET\r
87 %token INSTR_METHOD\r
88 %token INSTR_NEWOBJ\r
89 %token INSTR_FIELD\r
90 %token INSTR_TYPE\r
91 %token INSTR_STRING\r
92 %token INSTR_SIG\r
93 %token INSTR_RVA\r
94 %token INSTR_TOK\r
95 %token INSTR_SWITCH\r
96 %token INSTR_PHI\r
97 %token INSTR_LOCAL\r
98 %token INSTR_PARAM\r
99 \r
100 \r
101 \r
102 \r
103 \r
104 /* Mechanically generated  - DO NOT EDIT! */\r
105 \r
106 \r
107 /* Directives */\r
108 %token D_ADDON\r
109 %token D_ALGORITHM\r
110 %token D_ASSEMBLY\r
111 %token D_BACKING\r
112 %token D_BLOB\r
113 %token D_CAPABILITY\r
114 %token D_CCTOR\r
115 %token D_CLASS\r
116 %token D_COMTYPE\r
117 %token D_CONFIG\r
118 %token D_CORFLAGS\r
119 %token D_CTOR\r
120 %token D_CUSTOM\r
121 %token D_DATA\r
122 %token D_EMITBYTE\r
123 %token D_ENTRYPOINT\r
124 %token D_EVENT\r
125 %token D_EXELOC\r
126 %token D_EXPORT\r
127 %token D_FIELD\r
128 %token D_FILE\r
129 %token D_FIRE\r
130 %token D_GET\r
131 %token D_HASH\r
132 %token D_IMPLICITCOM\r
133 %token D_LANGUAGE\r
134 %token D_LINE\r
135 %token D_XLINE\r
136 %token D_LOCALE\r
137 %token D_LOCALS\r
138 %token D_MANIFESTRES\r
139 %token D_MAXSTACK\r
140 %token D_METHOD\r
141 %token D_MIME\r
142 %token D_MODULE\r
143 %token D_MRESOURCE\r
144 %token D_NAMESPACE\r
145 %token D_ORIGINATOR\r
146 %token D_OS\r
147 %token D_OTHER\r
148 %token D_OVERRIDE\r
149 %token D_PACK\r
150 %token D_PARAM\r
151 %token D_PERMISSION\r
152 %token D_PERMISSIONSET\r
153 %token D_PROCESSOR\r
154 %token D_PROPERTY\r
155 %token D_PUBLICKEY\r
156 %token D_PUBLICKEYTOKEN\r
157 %token D_REMOVEON\r
158 %token D_SET\r
159 %token D_SIZE\r
160 %token D_SUBSYSTEM\r
161 %token D_TITLE\r
162 %token D_TRY\r
163 %token D_VER\r
164 %token D_VTABLE\r
165 %token D_VTENTRY\r
166 %token D_VTFIXUP\r
167 %token D_ZEROINIT\r
168 \r
169 \r
170 /* Keywords */\r
171 %token K_AT\r
172 %token K_AS\r
173 %token K_IMPLICITCOM\r
174 %token K_IMPLICITRES\r
175 %token K_NOAPPDOMAIN\r
176 %token K_NOPROCESS\r
177 %token K_NOMACHINE\r
178 %token K_EXTERN\r
179 %token K_INSTANCE\r
180 %token K_EXPLICIT\r
181 %token K_DEFAULT\r
182 %token K_VARARG\r
183 %token K_UNMANAGED\r
184 %token K_CDECL\r
185 %token K_STDCALL\r
186 %token K_THISCALL\r
187 %token K_FASTCALL\r
188 %token K_MARSHAL\r
189 %token K_IN\r
190 %token K_OUT\r
191 %token K_OPT\r
192 %token K_LCID\r
193 %token K_RETVAL\r
194 %token K_STATIC\r
195 %token K_PUBLIC\r
196 %token K_PRIVATE\r
197 %token K_FAMILY\r
198 %token K_INITONLY\r
199 %token K_RTSPECIALNAME\r
200 %token K_SPECIALNAME\r
201 %token K_ASSEMBLY\r
202 %token K_FAMANDASSEM\r
203 %token K_FAMORASSEM\r
204 %token K_PRIVATESCOPE\r
205 %token K_LITERAL\r
206 %token K_NOTSERIALIZED\r
207 %token K_VALUE\r
208 %token K_NOT_IN_GC_HEAP\r
209 %token K_INTERFACE\r
210 %token K_SEALED\r
211 %token K_ABSTRACT\r
212 %token K_AUTO\r
213 %token K_SEQUENTIAL\r
214 %token K_ANSI\r
215 %token K_UNICODE\r
216 %token K_AUTOCHAR\r
217 %token K_IMPORT\r
218 %token K_SERIALIZABLE\r
219 %token K_NESTED\r
220 %token K_LATEINIT\r
221 %token K_EXTENDS\r
222 %token K_IMPLEMENTS\r
223 %token K_FINAL\r
224 %token K_VIRTUAL\r
225 %token K_HIDEBYSIG\r
226 %token K_NEWSLOT\r
227 %token K_UNMANAGEDEXP\r
228 %token K_PINVOKEIMPL\r
229 %token K_NOMANGLE\r
230 %token K_OLE\r
231 %token K_LASTERR\r
232 %token K_WINAPI\r
233 %token K_NATIVE\r
234 %token K_IL\r
235 %token K_CIL\r
236 %token K_OPTIL\r
237 %token K_MANAGED\r
238 %token K_FORWARDREF\r
239 %token K_RUNTIME\r
240 %token K_INTERNALCALL\r
241 %token K_SYNCHRONIZED\r
242 %token K_NOINLINING\r
243 %token K_CUSTOM\r
244 %token K_FIXED\r
245 %token K_SYSSTRING\r
246 %token K_ARRAY\r
247 %token K_VARIANT\r
248 %token K_CURRENCY\r
249 %token K_SYSCHAR\r
250 %token K_VOID\r
251 %token K_BOOL\r
252 %token K_INT8\r
253 %token K_INT16\r
254 %token K_INT32\r
255 %token K_INT64\r
256 %token K_FLOAT32\r
257 %token K_FLOAT64\r
258 %token K_ERROR\r
259 %token K_UNSIGNED\r
260 %token K_DECIMAL\r
261 %token K_DATE\r
262 %token K_BSTR\r
263 %token K_LPSTR\r
264 %token K_LPWSTR\r
265 %token K_LPTSTR\r
266 %token K_OBJECTREF\r
267 %token K_IUNKNOWN\r
268 %token K_IDISPATCH\r
269 %token K_STRUCT\r
270 %token K_SAFEARRAY\r
271 %token K_INT\r
272 %token K_BYVALSTR\r
273 %token K_TBSTR\r
274 %token K_LPVOID\r
275 %token K_ANY\r
276 %token K_FLOAT\r
277 %token K_LPSTRUCT\r
278 %token K_NULL\r
279 %token K_PTR\r
280 %token K_VECTOR\r
281 %token K_HRESULT\r
282 %token K_CARRAY\r
283 %token K_USERDEFINED\r
284 %token K_RECORD\r
285 %token K_FILETIME\r
286 %token K_BLOB\r
287 %token K_STREAM\r
288 %token K_STORAGE\r
289 %token K_STREAMED_OBJECT\r
290 %token K_STORED_OBJECT\r
291 %token K_BLOB_OBJECT\r
292 %token K_CF\r
293 %token K_CLSID\r
294 %token K_METHOD\r
295 %token K_CLASS\r
296 %token K_PINNED\r
297 %token K_MODREQ\r
298 %token K_MODOPT\r
299 %token K_TYPEDREF\r
300 %token K_WCHAR\r
301 %token K_CHAR\r
302 %token K_FROMUNMANAGED\r
303 %token K_CALLMOSTDERIVED\r
304 %token K_BYTEARRAY\r
305 %token K_WITH\r
306 %token K_INIT\r
307 %token K_TO\r
308 %token K_CATCH\r
309 %token K_FILTER\r
310 %token K_FINALLY\r
311 %token K_FAULT\r
312 %token K_HANDLER\r
313 %token K_TLS\r
314 %token K_FIELD\r
315 %token K_REQUEST\r
316 %token K_DEMAND\r
317 %token K_ASSERT\r
318 %token K_DENY\r
319 %token K_PERMITONLY\r
320 %token K_LINKCHECK\r
321 %token K_INHERITCHECK\r
322 %token K_REQMIN\r
323 %token K_REQOPT\r
324 %token K_REQREFUSE\r
325 %token K_PREJITGRANT\r
326 %token K_PREJITDENY\r
327 %token K_NONCASDEMAND\r
328 %token K_NONCASLINKDEMAND\r
329 %token K_NONCASINHERITANCE\r
330 %token K_READONLY\r
331 %token K_NOMETADATA\r
332 %token K_ALGORITHM\r
333 %token K_FULLORIGIN\r
334 // %token K_NAN\r
335 // %token K_INF\r
336 %token K_PUBLICKEY\r
337 %token K_ENABLEJITTRACKING\r
338 %token K_DISABLEJITOPTIMIZER\r
339 %token K_PRESERVESIG\r
340 %token K_BEFOREFIELDINIT\r
341 %token K_ALIGNMENT\r
342 %token K_NULLREF\r
343 %token K_VALUETYPE\r
344 %token K_COMPILERCONTROLLED\r
345 %token K_REQSECOBJ\r
346 %token K_ENUM\r
347 %token K_OBJECT\r
348 %token K_STRING\r
349 %token K_TRUE\r
350 %token K_FALSE\r
351 \r
352 /* end generated */\r
353 \r
354 \r
355 \r
356 \r
357 \r
358 %start il_file\r
359 \r
360 %%\r
361 \r
362 il_file                 : decls\r
363                         ;\r
364 \r
365 decls                   : /* EMPTY */\r
366                         | decls decl\r
367                         ;\r
368 \r
369 decl                    : class_all\r
370                         | namespace_all\r
371                         | method_all\r
372                         | field_decl\r
373                         | data_decl\r
374                         | vtfixup_decl\r
375                         | file_decl\r
376                         | assembly_all\r
377                         | assemblyref_all\r
378                         | exptype_all\r
379                         | manifestres_all\r
380                         | module_head\r
381                         | sec_decl\r
382                         | customattr_decl\r
383                         | D_SUBSYSTEM int32\r
384                         | D_CORFLAGS int32\r
385                         | D_FILE K_ALIGNMENT int32\r
386                 /*      | D_IMAGEBASE int64     */\r
387                         | extsource_spec\r
388                         | language_decl\r
389                         ;\r
390 \r
391 extsource_spec          : D_LINE int32 SQSTRING\r
392                         | D_LINE int32\r
393                         | D_LINE int32 COLON int32 SQSTRING\r
394                         | D_LINE int32 COLON int32\r
395                         ;\r
396 \r
397 language_decl           : D_LANGUAGE SQSTRING\r
398                         | D_LANGUAGE SQSTRING COMMA SQSTRING\r
399                         | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
400                         ;\r
401 \r
402 vtfixup_decl            : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
403                           vtfixup_attr K_AT id\r
404                         ;\r
405 \r
406 vtfixup_attr            : /* EMPTY */\r
407                         | vtfixup_attr int64\r
408                         | vtfixup_attr K_FROMUNMANAGED\r
409                         | vtfixup_attr K_CALLMOSTDERIVED\r
410                         ;\r
411 \r
412 namespace_all           : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
413                           {\r
414                                 codegen.CurrentNameSpace = null;\r
415                           }\r
416                         ;\r
417 \r
418 namespace_head          : D_NAMESPACE comp_name\r
419                           {\r
420                                 codegen.CurrentNameSpace = (string) $2;\r
421                           }\r
422                         ;\r
423 \r
424 class_all               : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
425                           {\r
426                                 codegen.EndTypeDef ();\r
427                           }\r
428                         ;\r
429 \r
430 class_head              : D_CLASS class_attr id typars_clause extends_clause\r
431                           impl_clause\r
432                           {\r
433                                 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
434                                                 $5 as IClassRef, $6 as ArrayList, null);\r
435 \r
436                                 // Lets not worry about generics for now :p\r
437                                 if ($4 != null) {\r
438                                         ArrayList typars_list = (ArrayList) $4;\r
439                                         foreach (DictionaryEntry entry in typars_list) {\r
440                                                 string name = (string) entry.Key;\r
441                                                 string id = (string) entry.Value;\r
442                                                 codegen.CurrentTypeDef.AddGenericParam (name, id);\r
443                                         }\r
444                                 }\r
445                                 \r
446                           }\r
447                         ;\r
448 \r
449 class_attrs             : class_attrs class_attr\r
450                         ;\r
451 \r
452 class_attr              : /* EMPTY */                           { $$ = new TypeAttr (); }\r
453                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
454                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
455                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
456                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
457                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
458                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
459                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
460                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
461                         | class_attr K_VALUE                    {  }\r
462                         | class_attr K_ENUM                     {  }\r
463                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
464                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
465                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
466                         | class_attr K_AUTO                     {  }\r
467                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
468                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
469                         | class_attr K_ANSI                     {  }\r
470                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
471                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
472                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
473                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
474                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
475                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
476                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
477                         ;\r
478 \r
479 extends_clause          : /* EMPTY */\r
480                         | K_EXTENDS class_ref\r
481                           {\r
482                                 $$ = $2;\r
483                           }\r
484                         ;\r
485 \r
486 impl_clause             : /* EMPTY */\r
487                         | K_IMPLEMENTS class_refs\r
488                           {\r
489                                 $$ = $2;\r
490                           }\r
491                         ;\r
492 \r
493 typars_clause           : /* EMPTY */\r
494                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
495                           {\r
496                                 $$ = $2;\r
497                           }\r
498                         ;\r
499 \r
500 typars                  : type\r
501                           {\r
502                                 ArrayList typars_list = new ArrayList ();\r
503                                 typars_list.Add ($1);\r
504                                 $$ = typars_list;\r
505                           }\r
506                         | typars COMMA type\r
507                           {\r
508                                 ArrayList typars_list = (ArrayList) $1;\r
509                                 typars_list.Add ($3);\r
510                                 $$ = typars_list;\r
511                           }\r
512                         ;\r
513 \r
514 formal_typars           : formal_typar\r
515                           {\r
516                                 ArrayList formal_list = new ArrayList ();\r
517                                 formal_list.Add ($1);\r
518                                 $$ = formal_list;\r
519                           }\r
520                         | formal_typars COMMA formal_typar\r
521                           {\r
522                                 ArrayList formal_list = (ArrayList) $1;\r
523                                 formal_list.Add ($3);\r
524                                 $$ = formal_list;\r
525                           }\r
526                         ;\r
527 \r
528 \r
529 formal_typar            : id\r
530                           {\r
531                                 $$ = new DictionaryEntry ($1, null);\r
532                           }\r
533                         | id id\r
534                           {\r
535                                 $$ = new DictionaryEntry ($1, $2);\r
536                           }\r
537                         ;\r
538                         \r
539 class_refs              : class_ref\r
540                           {\r
541                                 ArrayList class_list = new ArrayList ();\r
542                                 class_list.Add ($1);\r
543                                 $$ = class_list; \r
544                           }\r
545                         | class_refs COMMA class_ref\r
546                           {\r
547                                 ArrayList class_list = (ArrayList) $1;\r
548                                 class_list.Add ($3);\r
549                           }\r
550                         ;\r
551 \r
552 slashed_name            : comp_name\r
553                         | slashed_name SLASH comp_name\r
554                           {\r
555                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
556                           }\r
557                         ;\r
558 \r
559 class_ref               : OPEN_BRACKET file_name CLOSE_BRACKET slashed_name\r
560                           {\r
561                                 if (codegen.IsThisAssembly ((string) $2)) {\r
562                                         $$ = new TypeRef ((string) $4, null);\r
563                                 } else {\r
564                                         ClassRef klass = codegen.ExternTable.GetClass (\r
565                                                 (string) $2, (string)$4);\r
566                                         $$ = new ExternTypeRef (klass, (string) $4);\r
567                                 }\r
568                           }\r
569                         | OPEN_BRACKET D_MODULE file_name CLOSE_BRACKET slashed_name\r
570                         | slashed_name\r
571                           {\r
572                                 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);\r
573 \r
574                                 if (prim != null)\r
575                                         $$ = prim;\r
576                                 else\r
577                                         $$ = new TypeRef ((string) $1, null);\r
578                           }\r
579                         ;\r
580 \r
581 class_decls             : /* EMPTY */\r
582                         | class_decls class_decl\r
583                         ;\r
584 \r
585 class_decl              : method_all\r
586                         | class_all\r
587                         | event_all\r
588                         | prop_all\r
589                         | field_decl\r
590                         | data_decl\r
591                         | sec_decl\r
592                         | extsource_spec\r
593                         | customattr_decl\r
594                           {\r
595                                 codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);\r
596                           }\r
597                         | D_SIZE int32\r
598                           {\r
599                                 codegen.CurrentTypeDef.SetSize ((int) $2);\r
600                           }\r
601                         | D_PACK int32\r
602                           {\r
603                                 codegen.CurrentTypeDef.SetPack ((int) $2);\r
604                           }\r
605                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
606                           K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
607                           OPEN_PARENS sig_args CLOSE_PARENS\r
608                         | language_decl\r
609                         ;\r
610 \r
611 type                    : K_CLASS class_ref\r
612                           {\r
613                                 $$ = $2;\r
614                           }\r
615                         | K_OBJECT\r
616                           {\r
617                                 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
618                           }\r
619                         | K_STRING\r
620                           {\r
621                                 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
622                           }\r
623                         | K_VALUE K_CLASS class_ref\r
624                           {\r
625                                 $$ = $3;\r
626                           }\r
627                         | K_VALUETYPE OPEN_BRACKET file_name CLOSE_BRACKET slashed_name\r
628                           {\r
629                                 ClassRef klass = codegen.ExternTable.GetValueClass ((string) $3, (string)$5);\r
630                                 $$ = new ExternTypeRef (klass, (string) $5);\r
631                           }\r
632                         | K_VALUETYPE slashed_name\r
633                           {\r
634                                 $$ = new TypeRef ((string) $2, null);\r
635                           }\r
636                         | type OPEN_BRACKET CLOSE_BRACKET\r
637                           {\r
638                                 ITypeRef base_type = (ITypeRef) $1;\r
639                                 base_type.MakeArray ();\r
640                           }\r
641                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
642                           {\r
643                                 ITypeRef base_type = (ITypeRef) $1;\r
644                                 ArrayList bound_list = (ArrayList) $3;\r
645                                 base_type.MakeBoundArray (bound_list);\r
646                           }\r
647                         | type AMPERSAND\r
648                           {\r
649                                 ITypeRef base_type = (ITypeRef) $1;\r
650                                 base_type.MakeManagedPointer ();\r
651                           }\r
652                         | type STAR\r
653                           {\r
654                                 ITypeRef base_type = (ITypeRef) $1;\r
655                                 base_type.MakeUnmanagedPointer ();\r
656                           }\r
657                         | type K_PINNED\r
658                           {\r
659                                 ITypeRef base_type = (ITypeRef) $1;\r
660                                 base_type.MakePinned ();\r
661                           }\r
662                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
663                           {\r
664                                 /*\r
665                                 ITypeRef base_type = (ITypeRef) $1;\r
666                                 ITypeRef class_ref = (ITypeRef) $4;\r
667 \r
668                                 $$ = new CustomModifiedType (base_type.Type,\r
669                                         CustomModifier.modreq, (Class) class_ref.Type);\r
670                                 */\r
671                           }\r
672                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
673                           {\r
674                                 /*\r
675                                 TypeRef base_type = (TypeRef) $1;\r
676                                 TypeRef class_ref = (TypeRef) $4;\r
677 \r
678                                 $$ = new CustomModifiedType (base_type.Type,\r
679                                         CustomModifier.modopt, (Class) class_ref.Type);\r
680                                 */\r
681                           }\r
682                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
683                         | K_TYPEDREF\r
684                           {\r
685                                 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
686                                         "System.TypedReference");\r
687                           }\r
688                         | K_CHAR\r
689                           {\r
690                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
691                           }\r
692                         | K_VOID\r
693                           {\r
694                                 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
695                           }\r
696                         | K_BOOL\r
697                           {\r
698                                 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
699                           }\r
700                         | K_INT8\r
701                           {\r
702                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
703                           }\r
704                         | K_INT16\r
705                           {\r
706                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
707                           }\r
708                         | K_INT32\r
709                           {\r
710                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
711                           }\r
712                         | K_INT64\r
713                           {\r
714                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
715                           }\r
716                         | K_FLOAT32\r
717                           {\r
718                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
719                           }\r
720                         | K_FLOAT64\r
721                           {\r
722                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
723                           }\r
724                         | K_UNSIGNED K_INT8\r
725                           {\r
726                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
727                           }\r
728                         | K_UNSIGNED K_INT16\r
729                           {\r
730                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
731                           }\r
732                         | K_UNSIGNED K_INT32\r
733                           {\r
734                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
735                           }\r
736                         | K_UNSIGNED K_INT64\r
737                           {\r
738                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
739                           }\r
740                         | K_NATIVE K_INT\r
741                           {\r
742                                 // TODO: Is this the proper full name\r
743                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
744                           }\r
745                         \r
746                         | K_NATIVE K_UNSIGNED K_INT\r
747                           {\r
748                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
749                           }\r
750                         | BANG int32\r
751                           {\r
752                                 // access class type parameter by number\r
753                           }\r
754                         | BANG BANG int32\r
755                           {\r
756                                 // access method type parameter by number\r
757                           }\r
758                         ;\r
759 \r
760 bounds                  : bound\r
761                           {\r
762                                 ArrayList bound_list = new ArrayList ();\r
763                                 bound_list.Add ($1);\r
764                                 $$ = bound_list;\r
765                           }\r
766                         | bounds COMMA bound\r
767                           {\r
768                                 ArrayList bound_list = (ArrayList) $1;\r
769                                 bound_list.Add ($3);\r
770                           }\r
771                         ;\r
772 \r
773 bound                   : /* EMPTY */\r
774                         | ELLIPSIS\r
775                           {\r
776                                 // No lower bound or size\r
777                                 $$ = new DictionaryEntry (null,null);\r
778                           }\r
779                         | int32\r
780                           {\r
781                                 // ******** Not sure what this is?\r
782                                 // For now I will say it is size because there\r
783                                 // is allready a way to set lower\r
784                                 $$ = new DictionaryEntry (null, $1);\r
785                           }\r
786                         | int32 ELLIPSIS int32\r
787                           {\r
788                                 // lower bound and size\r
789                                 $$ = new DictionaryEntry ($1, $3);\r
790                           }\r
791                         | int32 ELLIPSIS\r
792                           {\r
793                                 // Just lower bound\r
794                                 $$ = new DictionaryEntry ($1, null);\r
795                           }\r
796                         ;\r
797 \r
798 call_conv               : K_INSTANCE call_conv\r
799                           {\r
800                                 $$ = (CallConv) $2 | CallConv.Instance;\r
801                           }\r
802                         | K_EXPLICIT call_conv\r
803                           {\r
804                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
805                           }\r
806                         | call_kind\r
807                         ;\r
808 \r
809 call_kind               : /* EMPTY */\r
810                           {\r
811                                 $$ = new CallConv ();\r
812                           }\r
813                         | K_DEFAULT\r
814                           {\r
815                                 $$ = CallConv.Default;\r
816                           }\r
817                         | K_VARARG\r
818                           {\r
819                                 $$ = CallConv.Vararg;\r
820                           }\r
821                         | K_UNMANAGED K_CDECL\r
822                           {\r
823                                 $$ = CallConv.Cdecl;\r
824                           }\r
825                         | K_UNMANAGED K_STDCALL\r
826                           {\r
827                                 $$ = CallConv.Stdcall;\r
828                           }\r
829                         | K_UNMANAGED K_THISCALL\r
830                           {\r
831                                 $$ = CallConv.Thiscall;\r
832                           }\r
833                         | K_UNMANAGED K_FASTCALL\r
834                           {\r
835                                 $$ = CallConv.Fastcall;\r
836                           }\r
837                         ;\r
838 \r
839 native_type             : /* EMPTY */\r
840                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
841                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
842                           {\r
843                                 $$ = NativeType.FixedSysString;\r
844                           }\r
845                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
846                         | K_VARIANT\r
847                         | K_CURRENCY\r
848                           {\r
849                                 $$ = NativeType.Currency;\r
850                           }\r
851                         | K_SYSCHAR\r
852                         | K_VOID\r
853                           {\r
854                                 $$ = NativeType.Void;\r
855                           }\r
856                         | K_BOOL\r
857                           {\r
858                                 $$ = NativeType.Boolean;\r
859                           }\r
860                         | K_INT8\r
861                           {\r
862                                 $$ = NativeType.Int8;\r
863                           }\r
864                         | K_INT16\r
865                           {\r
866                                 $$ = NativeType.Int16;\r
867                           }\r
868                         | K_INT32\r
869                           {\r
870                                 $$ = NativeType.Int32;\r
871                           }\r
872                         | K_INT64\r
873                           {\r
874                                 $$ = NativeType.Int64;\r
875                           }\r
876                         | K_FLOAT32\r
877                           {\r
878                                 $$ = NativeType.Float32;\r
879                           }\r
880                         | K_FLOAT64\r
881                           {\r
882                                 $$ = NativeType.Float64;\r
883                           }\r
884                         | K_ERROR\r
885                         | K_UNSIGNED K_INT8\r
886                           {\r
887                                 $$ = NativeType.UInt8;\r
888                           }\r
889                         | K_UNSIGNED K_INT16\r
890                           {\r
891                                 $$ = NativeType.UInt16;\r
892                           }\r
893                         | K_UNSIGNED K_INT32\r
894                           {\r
895                                 $$ = NativeType.UInt32;\r
896                           }\r
897                         | K_UNSIGNED K_INT64\r
898                           {\r
899                                 $$ = NativeType.UInt64;\r
900                           }\r
901                         | native_type STAR\r
902                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
903                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
904                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
905                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
906                         | K_DECIMAL\r
907                         | K_DATE\r
908                         | K_BSTR\r
909                           {\r
910                                 $$ = NativeType.BStr;\r
911                           }\r
912                         | K_LPSTR\r
913                           {\r
914                                 $$ = NativeType.LPStr;\r
915                           }\r
916                         | K_LPWSTR\r
917                           {\r
918                                 $$ = NativeType.LPWStr;\r
919                           }\r
920                         | K_LPTSTR\r
921                           {\r
922                                 $$ = NativeType.LPTStr;\r
923                           }\r
924                         | K_OBJECTREF\r
925                         | K_IUNKNOWN\r
926                           {\r
927                                 $$ = NativeType.IUnknown;\r
928                           }\r
929                         | K_IDISPATCH\r
930                           {\r
931                                 $$ = NativeType.IDispatch;\r
932                           }\r
933                         | K_STRUCT\r
934                           {\r
935                                 $$ = NativeType.Struct;\r
936                           }\r
937                         | K_INTERFACE\r
938                           {\r
939                                 $$ = NativeType.Interface;\r
940                           }\r
941                         | K_SAFEARRAY variant_type\r
942                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
943                         | K_INT\r
944                           {\r
945                                 $$ = NativeType.Int;\r
946                           }\r
947                         | K_UNSIGNED K_INT\r
948                           {\r
949                                 $$ = NativeType.UInt;\r
950                           }\r
951                         | K_NESTED K_STRUCT\r
952                         | K_BYVALSTR\r
953                           {\r
954                                 $$ = NativeType.ByValStr;\r
955                           }\r
956                         | K_ANSI K_BSTR\r
957                           {\r
958                                 $$ = NativeType.AnsiBStr;\r
959                           }\r
960                         | K_TBSTR\r
961                           {\r
962                                 $$ = NativeType.TBstr;\r
963                           }\r
964                         | K_VARIANT K_BOOL\r
965                           {\r
966                                 $$ = NativeType.VariantBool;\r
967                           }\r
968                         | K_METHOD\r
969                         | K_AS K_ANY\r
970                           {\r
971                                 $$ = NativeType.AsAny;\r
972                           }\r
973                         | K_LPSTRUCT\r
974                         ;\r
975 \r
976 variant_type            : /* EMPTY */\r
977                         | K_NULL\r
978                         | K_VARIANT\r
979                         | K_CURRENCY\r
980                         | K_VOID\r
981                         | K_BOOL\r
982                         | K_INT8\r
983                         | K_INT16\r
984                         | K_INT32\r
985                         | K_INT64\r
986                         | K_FLOAT32\r
987                         | K_FLOAT64\r
988                         | K_UNSIGNED K_INT8\r
989                         | K_UNSIGNED K_INT16\r
990                         | K_UNSIGNED K_INT32\r
991                         | K_UNSIGNED K_INT64\r
992                         | STAR\r
993                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
994                         | variant_type K_VECTOR\r
995                         | variant_type AMPERSAND\r
996                         | K_DECIMAL\r
997                         | K_DATE\r
998                         | K_BSTR\r
999                         | K_LPSTR\r
1000                         | K_LPWSTR\r
1001                         | K_IUNKNOWN\r
1002                         | K_IDISPATCH\r
1003                         | K_SAFEARRAY\r
1004                         | K_INT\r
1005                         | K_UNSIGNED K_INT\r
1006                         | K_ERROR\r
1007                         | K_HRESULT\r
1008                         | K_CARRAY\r
1009                         | K_USERDEFINED\r
1010                         | K_RECORD\r
1011                         | K_FILETIME\r
1012                         | K_BLOB\r
1013                         | K_STREAM\r
1014                         | K_STORAGE\r
1015                         | K_STREAMED_OBJECT\r
1016                         | K_STORED_OBJECT\r
1017                         | K_BLOB_OBJECT\r
1018                         | K_CF\r
1019                         | K_CLSID\r
1020                         ;\r
1021 \r
1022 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
1023                           {\r
1024                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
1025                                         (string) $5, (ITypeRef) $4);\r
1026                                 codegen.AddFieldDef (field_def);\r
1027                                 \r
1028                                 if ($2 != null) {\r
1029                                         field_def.SetOffset ((uint) $2);\r
1030                                 }\r
1031                                 /*\r
1032                                 if ($6 != null) {\r
1033                                         field_def.AddDataValue ((DataConstant) $6);\r
1034                                 }\r
1035                                 */\r
1036                                 if ($7 != null) {\r
1037                                         field_def.SetValue ((Constant) $7);\r
1038                                 }\r
1039                           }\r
1040                         ;\r
1041 \r
1042 repeat_opt              : /* EMPTY */\r
1043                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1044                           {\r
1045                                 $$ = $2;\r
1046                           }\r
1047                         ;\r
1048 \r
1049 field_attr              : /* EMPTY */\r
1050                           {\r
1051                                 $$ = new FieldAttr ();\r
1052                           }\r
1053                         | field_attr K_PUBLIC\r
1054                           {\r
1055                                 $$ = (FieldAttr) $1 | FieldAttr.Public;\r
1056                           }\r
1057                         | field_attr K_PRIVATE\r
1058                           {\r
1059                                 $$ = (FieldAttr) $1 | FieldAttr.Private;\r
1060                           }\r
1061                         | field_attr K_FAMILY\r
1062                           {\r
1063                                 $$ = (FieldAttr) $1 | FieldAttr.Family;\r
1064                           }\r
1065                         | field_attr K_ASSEMBLY\r
1066                           {\r
1067                                 $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
1068                           }\r
1069                         | field_attr K_FAMANDASSEM\r
1070                           {\r
1071                                 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
1072                           }\r
1073                         | field_attr K_FAMORASSEM\r
1074                           {\r
1075                                 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
1076                           }\r
1077                         | field_attr K_PRIVATESCOPE\r
1078                           {\r
1079                                 // This is just 0x0000\r
1080                           }\r
1081                         | field_attr K_STATIC\r
1082                           {\r
1083                                 $$ = (FieldAttr) $1 | FieldAttr.Static;\r
1084                           }\r
1085                         | field_attr K_INITONLY\r
1086                           {\r
1087                                 $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
1088                           }\r
1089                         | field_attr K_RTSPECIALNAME\r
1090                           {\r
1091                                 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
1092                           }\r
1093                         | field_attr K_SPECIALNAME\r
1094                           {\r
1095                                 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
1096                           }\r
1097                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1098                           {\r
1099                                 \r
1100                           }\r
1101                         | field_attr K_LITERAL\r
1102                           {\r
1103                                 $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
1104                           }\r
1105                         | field_attr K_NOTSERIALIZED\r
1106                           {\r
1107                                 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
1108                           }\r
1109                         ;\r
1110 \r
1111 at_opt                  : /* EMPTY */\r
1112                         | K_AT id\r
1113                           {\r
1114                                 // TODO: Implement DataTable\r
1115                                 // $$ = new DataConstant (DataTable.GetOffset ((string) $2));\r
1116                           }\r
1117                         ;\r
1118 \r
1119 init_opt                : /* EMPTY */\r
1120                         | ASSIGN field_init\r
1121                           {\r
1122                                 $$ = $2;\r
1123                           }\r
1124                         ;\r
1125 \r
1126 field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1127                           {\r
1128                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1129                           }\r
1130                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1131                           {\r
1132                                 $$ = new DoubleConst (Convert.ToDouble ($3));\r
1133                           }\r
1134                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1135                           {\r
1136                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
1137                           }\r
1138                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1139                           {\r
1140                                 $$ = new DoubleConst (Convert.ToDouble (3));\r
1141                           }\r
1142                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1143                           {\r
1144                                 $$ = new IntConst (Convert.ToInt64 ($3));\r
1145                           }\r
1146                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1147                           {\r
1148                                 $$ = new IntConst (Convert.ToUInt32 ($3));\r
1149                           }\r
1150                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1151                           {\r
1152                                 $$ = new IntConst (Convert.ToUInt16 ($3));\r
1153                           }\r
1154                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1155                           {\r
1156                                 $$ = new CharConst (Convert.ToChar ($3));\r
1157                           }\r
1158                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1159                           {\r
1160                                 $$ = new IntConst (Convert.ToByte ($3));\r
1161                           }\r
1162                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1163                           {\r
1164                                 $$ = new BoolConst ((bool) $3);\r
1165                           }\r
1166                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1167                           {\r
1168                                 $$ = new ByteArrConst ((byte[]) $3);\r
1169                           }\r
1170                         | comp_qstring\r
1171                           {\r
1172                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
1173                                 $$ = new StringConst ((string) $1);\r
1174                           }\r
1175                         | K_NULLREF\r
1176                           {\r
1177                                 $$ = new NullConst ();\r
1178                           }\r
1179                         ;\r
1180 \r
1181 data_decl               : data_head data_body\r
1182                           {\r
1183                                 /*\r
1184                                 Console.WriteLine ("Creating data decl: '{0}' '{1}'", $1, $2);\r
1185 \r
1186                                 DataDef datadef = (DataDef) $1;\r
1187                                 \r
1188                                 if ($2 is ArrayList) {\r
1189                                         ArrayList const_list = (ArrayList) $2;\r
1190                                         DataConstant[] const_arr = new DataConstant[const_list.Count];\r
1191                                         \r
1192                                         for (int i=0; i<const_arr.Length; i++)\r
1193                                                 const_arr[i] = (DataConstant) const_list[i];\r
1194 \r
1195                                         datadef.PeapiConstant = new ArrayConstant (const_arr);\r
1196                                 } else {\r
1197                                         datadef.PeapiConstant = (PEAPI.Constant) $2;\r
1198                                 }\r
1199                                 */\r
1200                           }\r
1201                         ;\r
1202 \r
1203 data_head               : D_DATA tls id ASSIGN\r
1204                           {\r
1205                                 $$ = new DataDef ((string) $3, (bool) $2);    \r
1206                           } \r
1207                         | D_DATA tls\r
1208                           {\r
1209                                 $$ = new DataDef (String.Empty, (bool) $2);\r
1210                           }\r
1211                         ;\r
1212 \r
1213 tls                     : /* EMPTY */   { $$ = false; }\r
1214                         | K_TLS         { $$ = true; }\r
1215                         ;\r
1216 \r
1217 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1218                         | dataitem\r
1219                         ;\r
1220 \r
1221 dataitem_list           : dataitem\r
1222                         | dataitem_list COMMA dataitem\r
1223                         ;\r
1224 \r
1225 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1226                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1227                         | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1228                           {\r
1229                                 $$ = new ByteArrConst ((byte[]) $4);\r
1230                           }\r
1231                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1232                           {\r
1233                                 // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
1234                                 $$ = new ByteArrConst ((byte[]) $3);\r
1235                           }\r
1236                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1237                           {\r
1238                                 FloatConst float_const = new FloatConst ((float) $3);\r
1239 \r
1240                                 if ($5 != null)\r
1241                                         $$ = new RepeatedConstant (float_const, (int) $5);\r
1242                                 else\r
1243                                         $$ = float_const;\r
1244                           }\r
1245                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1246                           {\r
1247                                 DoubleConst double_const = new DoubleConst ((double) $3);\r
1248 \r
1249                                 if ($5 != null)\r
1250                                         $$ = new RepeatedConstant (double_const, (int) $5);\r
1251                                 else\r
1252                                         $$ = double_const;\r
1253                           }\r
1254                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1255                           {\r
1256                                 IntConst int_const = new IntConst ((long) $3);\r
1257 \r
1258                                 if ($5 != null)\r
1259                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1260                                 else\r
1261                                         $$ = int_const;\r
1262                           }\r
1263                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1264                           {\r
1265                                 IntConst int_const = new IntConst ((int) $3);\r
1266 \r
1267                                 if ($5 != null)\r
1268                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1269                                 else\r
1270                                         $$ = int_const;\r
1271                           }\r
1272                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1273                           {\r
1274                                 IntConst int_const = new IntConst ((short) $3);\r
1275 \r
1276                                 if ($5 != null)\r
1277                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1278                                 else\r
1279                                         $$ = int_const;\r
1280                           }\r
1281                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1282                           {\r
1283                                 IntConst int_const = new IntConst ((sbyte) $3);\r
1284 \r
1285                                 if ($5 != null)\r
1286                                         $$ = new RepeatedConstant (int_const, (int) $5);\r
1287                                 else\r
1288                                         $$ = int_const;\r
1289                           }\r
1290                         | K_FLOAT32 repeat_opt\r
1291                           {\r
1292                                 FloatConst float_const = new FloatConst (0F);\r
1293 \r
1294                                 if ($2 != null)\r
1295                                         $$ = new RepeatedConstant (float_const, (int) $2);\r
1296                                 else\r
1297                                         $$ = float_const;\r
1298                           }\r
1299                         | K_FLOAT64 repeat_opt\r
1300                           {\r
1301                                 DoubleConst double_const = new DoubleConst (0);\r
1302 \r
1303                                 if ($2 != null)\r
1304                                         $$ = new RepeatedConstant (double_const, (int) $2);\r
1305                                 else\r
1306                                         $$ = double_const;\r
1307                           }\r
1308                         | K_INT64 repeat_opt\r
1309                           {\r
1310                                 IntConst int_const = new IntConst ((long) 0);\r
1311 \r
1312                                 if ($2 != null)\r
1313                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1314                                 else\r
1315                                         $$ = int_const;\r
1316                           }\r
1317                         | K_INT32 repeat_opt\r
1318                           {\r
1319                                 IntConst int_const = new IntConst ((int) 0);\r
1320 \r
1321                                 if ($2 != null)\r
1322                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1323                                 else\r
1324                                         $$ = int_const;\r
1325                           }\r
1326                         | K_INT16 repeat_opt\r
1327                           {\r
1328                                 IntConst int_const = new IntConst ((short) 0);\r
1329 \r
1330                                 if ($2 != null)\r
1331                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1332                                 else\r
1333                                         $$ = int_const;\r
1334                           }\r
1335                         | K_INT8 repeat_opt\r
1336                           {\r
1337                                 IntConst int_const = new IntConst ((sbyte) 0);\r
1338 \r
1339                                 if ($2 != null)\r
1340                                         $$ = new RepeatedConstant (int_const, (int) $2);\r
1341                                 else\r
1342                                         $$ = int_const;\r
1343                           }\r
1344                         ;\r
1345 \r
1346 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1347                           {\r
1348                                 codegen.EndMethodDef ();\r
1349                           }\r
1350                         ;\r
1351 \r
1352 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1353                           typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1354                           {\r
1355                                 MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,\r
1356                                         (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
1357                                         (ArrayList) $9);\r
1358                                 codegen.BeginMethodDef (methdef);\r
1359                           }\r
1360                         | D_METHOD meth_attr call_conv param_attr type \r
1361                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1362                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1363                         ;\r
1364 \r
1365 meth_attr               : /* EMPTY */                   { $$ = new MethAttr (); }\r
1366                         | meth_attr K_STATIC            { $$ = (MethAttr) $1 | MethAttr.Static; }\r
1367                         | meth_attr K_PUBLIC            { $$ = (MethAttr) $1 | MethAttr.Public; }\r
1368                         | meth_attr K_PRIVATE           { $$ = (MethAttr) $1 | MethAttr.Private; }\r
1369                         | meth_attr K_FAMILY            { $$ = (MethAttr) $1 | MethAttr.Family; }\r
1370                         | meth_attr K_ASSEMBLY          { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
1371                         | meth_attr K_FAMANDASSEM       { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
1372                         | meth_attr K_FAMORASSEM        { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
1373                         | meth_attr K_PRIVATESCOPE      { /* CHECK HEADERS */ }\r
1374                         | meth_attr K_FINAL             { $$ = (MethAttr) $1 | MethAttr.Final; } \r
1375                         | meth_attr K_VIRTUAL           { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
1376                         | meth_attr K_ABSTRACT          { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
1377                         | meth_attr K_HIDEBYSIG         { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
1378                         | meth_attr K_NEWSLOT           { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
1379                         | meth_attr K_REQSECOBJ         { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
1380                         | meth_attr K_SPECIALNAME       { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
1381                         | meth_attr K_RTSPECIALNAME     { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
1382                         | meth_attr K_UNMANAGEDEXP      \r
1383                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1384                                 comp_qstring pinv_attr CLOSE_PARENS\r
1385                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1386                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1387                         ;\r
1388 \r
1389 pinv_attr               : /* EMPTY */\r
1390                         | pinv_attr K_NOMANGLE\r
1391                         | pinv_attr K_ANSI\r
1392                         | pinv_attr K_UNICODE\r
1393                         | pinv_attr K_AUTOCHAR\r
1394                         | pinv_attr K_LASTERR\r
1395                         | pinv_attr K_WINAPI\r
1396                         | pinv_attr K_CDECL\r
1397                         | pinv_attr K_STDCALL\r
1398                         | pinv_attr K_THISCALL\r
1399                         | pinv_attr K_FASTCALL\r
1400                         ;\r
1401 \r
1402 method_name             : D_CTOR\r
1403                         | D_CCTOR\r
1404                         | comp_name\r
1405                         ;\r
1406 \r
1407 param_attr              : /* EMPTY */                                   { $$ = new ParamAttr (); }\r
1408                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET    { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
1409                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
1410                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET   { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
1411                         ;\r
1412 \r
1413 impl_attr               : /* EMPTY */                   { $$ = new ImplAttr (); }\r
1414                         | impl_attr K_NATIVE            { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
1415                         | impl_attr K_CIL               { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1416                         | impl_attr K_IL                { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
1417                         | impl_attr K_OPTIL             { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
1418                         | impl_attr K_MANAGED           { /* should this reset? */ }\r
1419                         | impl_attr K_UNMANAGED         { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
1420                         | impl_attr K_FORWARDREF        { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
1421                         | impl_attr K_PRESERVESIG       { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
1422                         | impl_attr K_RUNTIME           { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
1423                         | impl_attr K_INTERNALCALL      { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
1424                         | impl_attr K_SYNCHRONIZED      { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
1425                         | impl_attr K_NOINLINING        { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
1426                         ;\r
1427 \r
1428 sig_args                : /* EMPTY */\r
1429                         | sig_arg_list\r
1430                         ;\r
1431 \r
1432 sig_arg_list            : sig_arg\r
1433                           {\r
1434                                 ArrayList sig_list = new ArrayList ();\r
1435                                 sig_list.Add ($1);\r
1436                                 $$ = sig_list;\r
1437                           }\r
1438                         | sig_arg_list COMMA sig_arg\r
1439                           {\r
1440                                 ArrayList sig_list = (ArrayList) $1;\r
1441                                 sig_list.Add ($3);\r
1442                                 $$ = sig_list;\r
1443                           }\r
1444                         ;\r
1445 \r
1446 sig_arg                 : param_attr type\r
1447                           {\r
1448                                 $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
1449                           }\r
1450                         | param_attr type id\r
1451                           {\r
1452                                 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
1453                           }\r
1454                         | ELLIPSIS\r
1455                           {\r
1456                                 $$ = ParamDef.Ellipsis;\r
1457                           }\r
1458                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1459                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
1460                         ;\r
1461 \r
1462 type_list               : /* EMPTY */\r
1463                         | ELLIPSIS\r
1464                           {\r
1465                                 ArrayList type_list = new ArrayList ();\r
1466                                 type_list.Add (TypeRef.Ellipsis);\r
1467                                 $$ = type_list;\r
1468                           }\r
1469                         | type_list COMMA ELLIPSIS\r
1470                           {\r
1471                                 ArrayList type_list = (ArrayList) $1;\r
1472                                 type_list.Add (TypeRef.Ellipsis);\r
1473                           }\r
1474                         | type opt_id\r
1475                           {\r
1476                                 ArrayList type_list = new ArrayList ();\r
1477                                 type_list.Add ($1);\r
1478                                 $$ = type_list;\r
1479                           }\r
1480                         | type_list COMMA type opt_id\r
1481                           {\r
1482                                 ArrayList type_list = (ArrayList) $1;\r
1483                                 type_list.Add ($3);\r
1484                           }\r
1485                         ;\r
1486 \r
1487 opt_id                  : /* EMPTY */\r
1488                         | id\r
1489                         ;\r
1490 \r
1491 method_decls            : /* EMPTY */\r
1492                         | method_decls method_decl\r
1493                         ;\r
1494 \r
1495 method_decl             : D_EMITBYTE int32\r
1496                         | D_MAXSTACK int32\r
1497                         | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
1498                           {\r
1499                                 if ($3 != null) {\r
1500                                         codegen.CurrentMethodDef.AddLocals (\r
1501                                                 (ArrayList) $3);\r
1502                                 }\r
1503                           }\r
1504                         | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
1505                           {\r
1506                                 if ($4 != null) {\r
1507                                         codegen.CurrentMethodDef.AddLocals (\r
1508                                                 (ArrayList) $4);\r
1509                                         codegen.CurrentMethodDef.InitLocals ();\r
1510                                 }\r
1511                           }\r
1512                         | D_ENTRYPOINT\r
1513                           {\r
1514                                 codegen.CurrentMethodDef.EntryPoint ();\r
1515                           }\r
1516                         | D_ZEROINIT\r
1517                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
1518                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
1519                         | D_VTENTRY int32 COLON int32 \r
1520                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
1521                         | scope_block\r
1522                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
1523                         | id COLON\r
1524                           {\r
1525                                 codegen.CurrentMethodDef.AddLabel ((string) $1);\r
1526                           }\r
1527                         | seh_block\r
1528                         | instr\r
1529                         | sec_decl\r
1530                         | extsource_spec\r
1531                         | language_decl\r
1532                         | customattr_decl\r
1533                           {\r
1534                                 codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);\r
1535                           }\r
1536                         | data_decl\r
1537                         ;\r
1538 \r
1539 local_list              : /* EMPTY */\r
1540                         | local\r
1541                           {\r
1542                                 ArrayList local_list = new ArrayList ();\r
1543                                 local_list.Add ($1);\r
1544                                 $$ = local_list;\r
1545                           }\r
1546                         | local_list COMMA local\r
1547                           {\r
1548                                 ArrayList local_list = (ArrayList) $1;\r
1549                                 local_list.Add ($3);\r
1550                           }\r
1551                         ;\r
1552 \r
1553 local                   : type\r
1554                           {\r
1555                                 $$ = new Local (-1, (ITypeRef) $1);\r
1556                           }\r
1557                         | type id\r
1558                           {\r
1559                                 $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
1560                           }\r
1561                         | slot_num type\r
1562                           {\r
1563                                 $$ = new Local ((int) $1, (ITypeRef) $2);\r
1564                           }\r
1565                         | slot_num type id\r
1566                           {\r
1567                                 $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
1568                           }\r
1569                         ;\r
1570 \r
1571 slot_num                : OPEN_BRACKET int32 CLOSE_BRACKET\r
1572                           {\r
1573                                 $$ = $2;\r
1574                           }\r
1575                         ;\r
1576 \r
1577 type_spec               : class_ref\r
1578                         | OPEN_BRACKET file_name CLOSE_BRACKET\r
1579                           {\r
1580                                 // This is a reference to a global method in another\r
1581                                 // assembly. This is not supported in the MS version of ilasm\r
1582                           }\r
1583                         | OPEN_BRACKET D_MODULE file_name CLOSE_BRACKET\r
1584                         | type\r
1585                         ;\r
1586 \r
1587 scope_block             : scope_block_begin method_decls CLOSE_BRACE\r
1588                           {\r
1589                                 $$ = new HandlerBlock ((string) $1,\r
1590                                         codegen.CurrentMethodDef.RandomLabel ());\r
1591                           }\r
1592                         ;\r
1593 \r
1594 scope_block_begin       : OPEN_BRACE\r
1595                           {\r
1596                                 $$ = codegen.CurrentMethodDef.RandomLabel ();\r
1597                           }\r
1598                         ;\r
1599                         \r
1600                         \r
1601 seh_block               : try_block seh_clauses\r
1602                           {\r
1603                                 TryBlock try_block = (TryBlock) $1;\r
1604                                 try_block.SetMethod (codegen.CurrentMethodDef);\r
1605 \r
1606                                 ArrayList clause_list = (ArrayList) $2;\r
1607                                 foreach (object clause in clause_list)\r
1608                                         try_block.AddSehClause ((ISehClause) clause);\r
1609 \r
1610                                 codegen.CurrentMethodDef.AddInstr (try_block);\r
1611                           }\r
1612                         ;\r
1613 \r
1614 try_block               : D_TRY scope_block\r
1615                           {\r
1616                                 $$ = new TryBlock ((HandlerBlock) $2);\r
1617                           }\r
1618                         | D_TRY id K_TO id\r
1619                           {\r
1620                                 $$ = new TryBlock ((string) $2, (string) $4);\r
1621                           }\r
1622                         | D_TRY int32 K_TO int32\r
1623                         ;\r
1624 \r
1625 seh_clauses             : seh_clause\r
1626                           {\r
1627                                 ArrayList clause_list = new ArrayList ();\r
1628                                 clause_list.Add ($1);\r
1629                                 $$ = clause_list;\r
1630                           }\r
1631                         | seh_clauses seh_clause\r
1632                           {\r
1633                                 ArrayList clause_list = (ArrayList) $1;\r
1634                                 clause_list.Add ($2);\r
1635                           }\r
1636                         ;\r
1637 \r
1638 seh_clause              : K_CATCH class_ref handler_block\r
1639                           {\r
1640                                 ITypeRef type = (ITypeRef) $2;\r
1641                                 CatchBlock cb = new CatchBlock (type.AsClassRef (codegen));\r
1642                                 cb.SetHandlerBlock ((HandlerBlock) $3);\r
1643                                 $$ = cb;\r
1644                           }\r
1645                         | K_FINALLY handler_block\r
1646                           {\r
1647                                 FinallyBlock fb = new FinallyBlock ();\r
1648                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
1649                                 $$ = fb;\r
1650                           }\r
1651                         | K_FAULT handler_block\r
1652                           {\r
1653                                 FaultBlock fb = new FaultBlock ();\r
1654                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
1655                                 $$ = fb;\r
1656                           }\r
1657                         | filter_clause handler_block\r
1658                           {\r
1659                                 FilterBlock fb = (FilterBlock) $1;\r
1660                                 fb.SetHandlerBlock ((HandlerBlock) $2);\r
1661                           }\r
1662                         ;\r
1663 \r
1664 filter_clause           : K_FILTER scope_block\r
1665                           {\r
1666                                 HandlerBlock block = (HandlerBlock) $2;\r
1667                                 FilterBlock fb = new FilterBlock (block.from_label);\r
1668                                 $$ = fb;\r
1669                           }\r
1670                         | K_FILTER id\r
1671                           {\r
1672                                 FilterBlock fb = new FilterBlock ((string) $2);\r
1673                                 $$ = fb;\r
1674                           }\r
1675                         | K_FILTER int32\r
1676                         ;\r
1677 \r
1678 handler_block           : scope_block\r
1679                           {\r
1680                                 \r
1681                           }\r
1682                         | K_HANDLER id K_TO id\r
1683                           {\r
1684                                 $$ = new HandlerBlock ((string) $2, (string) $4);\r
1685                           }\r
1686                         | K_HANDLER int32 K_TO int32\r
1687                         ;\r
1688 \r
1689 instr                   : INSTR_NONE\r
1690                           {\r
1691                                 codegen.CurrentMethodDef.AddInstr (\r
1692                                         new SimpInstr ((Op) $1));\r
1693                           }\r
1694                         | INSTR_LOCAL int32\r
1695                           {\r
1696                                 codegen.CurrentMethodDef.AddInstr (\r
1697                                         new IntInstr ((IntOp) $1, (int) $2));        \r
1698                           }\r
1699                         | INSTR_LOCAL id\r
1700                           {\r
1701                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
1702                                 codegen.CurrentMethodDef.AddInstr (\r
1703                                         new IntInstr ((IntOp) $1, slot));\r
1704                           }\r
1705                         | INSTR_PARAM int32\r
1706                           {\r
1707                                 codegen.CurrentMethodDef.AddInstr (\r
1708                                         new IntInstr ((IntOp) $1, (int) $2));\r
1709                           }\r
1710                         | INSTR_PARAM id\r
1711                           {\r
1712                                 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
1713                                 codegen.CurrentMethodDef.AddInstr (\r
1714                                         new IntInstr ((IntOp) $1, pos));\r
1715                           }\r
1716                         | INSTR_I int32\r
1717                           {\r
1718                                 codegen.CurrentMethodDef.AddInstr (new\r
1719                                         IntInstr ((IntOp) $1, (int) $2));\r
1720                           }\r
1721                         | INSTR_I id\r
1722                           {\r
1723                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
1724                                 codegen.CurrentMethodDef.AddInstr (new\r
1725                                         IntInstr ((IntOp) $1, slot));\r
1726                           }\r
1727                         | INSTR_I8 int64\r
1728                           {\r
1729                                 if ($1 is MiscInstr) {\r
1730                                         switch ((MiscInstr) $1) {\r
1731                                         case MiscInstr.ldc_i8:\r
1732                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,\r
1733                                                 (long) $2));\r
1734                                         break;\r
1735                                         }\r
1736                                 }\r
1737                           }\r
1738                         | INSTR_R float64\r
1739                           {\r
1740                                 switch ((MiscInstr) $1) {\r
1741                                 case MiscInstr.ldc_r4:\r
1742                                 case MiscInstr.ldc_r8:\r
1743                                          codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
1744                                          break;\r
1745                                 }\r
1746                           }\r
1747                         | INSTR_R int64\r
1748                           {\r
1749                                 long l = (long) $2;\r
1750                                 \r
1751                                 switch ((MiscInstr) $1) {\r
1752                                         case MiscInstr.ldc_r4:\r
1753                                         case MiscInstr.ldc_r8:\r
1754                                         codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l));\r
1755                                         break;\r
1756                                 }\r
1757                           }\r
1758                         | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
1759                         | INSTR_BRTARGET int32\r
1760                           {\r
1761                                 // Need to add this to PEAPI        \r
1762                           }\r
1763                         | INSTR_BRTARGET id\r
1764                           {\r
1765                                 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
1766                                         codegen.CurrentMethodDef, (string) $2));\r
1767                           }\r
1768                         | INSTR_METHOD method_ref\r
1769                           {\r
1770                                 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
1771                                         (IMethodRef) $2));\r
1772                           }\r
1773                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
1774                           {\r
1775                                 ITypeRef owner = (ITypeRef) $3;\r
1776                                 IFieldRef fieldref = owner.AsClassRef (codegen).GetFieldRef (\r
1777                                         (ITypeRef) $2, (string) $5);\r
1778 \r
1779                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
1780                           }\r
1781                         | INSTR_FIELD type id\r
1782                           {\r
1783                                 GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
1784 \r
1785                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
1786                           }\r
1787                         | INSTR_TYPE type_spec\r
1788                           {\r
1789                                 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
1790                                         (ITypeRef) $2));\r
1791                           }\r
1792                         | INSTR_STRING comp_qstring\r
1793                           {\r
1794                                 if ((MiscInstr) $1 == MiscInstr.ldstr)\r
1795                                         codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
1796                           }\r
1797                         | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1798                         | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS               // ****** ADDED\r
1799                         | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
1800                           {\r
1801                                 ArrayList arg_list = (ArrayList) $5;\r
1802                                 ITypeRef[] arg_array = null;\r
1803 \r
1804                                 if (arg_list != null)\r
1805                                         arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
1806 \r
1807                                 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $1,\r
1808                                         (ITypeRef) $3, arg_array));\r
1809                           }     \r
1810                         | INSTR_TOK owner_type\r
1811                           {\r
1812                                 if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
1813                                         if ($2 is IMethodRef)\r
1814                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2));\r
1815                                         else if ($2 is IFieldRef)\r
1816                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2));\r
1817                                         else\r
1818                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2));\r
1819                                                 \r
1820                                 }\r
1821                           }\r
1822                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
1823                           {\r
1824                                 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3,\r
1825                                         codegen.CurrentMethodDef));\r
1826                           }\r
1827                         ;\r
1828 \r
1829 method_ref              : call_conv type type_spec DOUBLE_COLON method_name \r
1830                           OPEN_PARENS type_list CLOSE_PARENS\r
1831                           {\r
1832                                 ITypeRef owner = (ITypeRef) $3;\r
1833                                 ArrayList arg_list = (ArrayList) $7;\r
1834                                 ITypeRef[] param_list;\r
1835   \r
1836                                 if (arg_list != null)\r
1837                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
1838                                 else\r
1839                                         param_list = new ITypeRef[0];\r
1840 \r
1841                                 $$ = owner.AsClassRef (codegen).GetMethodRef ((ITypeRef) $2,\r
1842                                         (CallConv) $1, (string) $5, param_list);\r
1843                           }\r
1844                         | call_conv type method_name \r
1845                           OPEN_PARENS type_list CLOSE_PARENS\r
1846                           {\r
1847                                 ArrayList arg_list = (ArrayList) $5;\r
1848                                 ITypeRef[] param_list;\r
1849   \r
1850                                 if (arg_list != null)\r
1851                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
1852                                 else\r
1853                                         param_list = new ITypeRef[0];\r
1854 \r
1855                                 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
1856                                         (string) $3, param_list);\r
1857                           }\r
1858                         ;\r
1859 \r
1860 labels                  : /* EMPTY */\r
1861                         | id\r
1862                           {\r
1863                                 ArrayList label_list = new ArrayList ();\r
1864                                 label_list.Add ($1);\r
1865                                 $$ = label_list;\r
1866                           }\r
1867                         | int32\r
1868                           {\r
1869                                 ArrayList label_list = new ArrayList ();\r
1870                                 label_list.Add ($1);\r
1871                                 $$ = label_list;\r
1872                           }\r
1873                         | labels COMMA id\r
1874                           {\r
1875                                 ArrayList label_list = (ArrayList) $1;\r
1876                                 label_list.Add ($3);\r
1877                           }\r
1878                         | labels COMMA int32\r
1879                           {\r
1880                                 ArrayList label_list = (ArrayList) $1;\r
1881                                 label_list.Add ($3);\r
1882                           }\r
1883                         ;\r
1884 \r
1885 owner_type              : type_spec\r
1886                         | member_ref\r
1887                         ;\r
1888 \r
1889 member_ref              : K_METHOD method_ref\r
1890                           {\r
1891                                 $$ = $2;\r
1892                           }\r
1893                         | K_FIELD type type_spec DOUBLE_COLON id\r
1894                           {\r
1895                                 ITypeRef owner = (ITypeRef) $3;\r
1896 \r
1897                                 $$ = owner.AsClassRef (codegen).GetFieldRef (\r
1898                                         (ITypeRef) $2, (string) $5);\r
1899                           }\r
1900                         | K_FIELD type id\r
1901                           {\r
1902                                 $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
1903                           }\r
1904                         ;\r
1905 \r
1906 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
1907                           {\r
1908                                 codegen.CurrentTypeDef.EndEventDef ();\r
1909                           }\r
1910                         ;\r
1911 \r
1912 event_head              : D_EVENT event_attr type_spec id\r
1913                           {\r
1914                                 EventDef event_def = new EventDef ((FeatureAttr) $2,\r
1915                                         (ITypeRef) $3, (string) $4);\r
1916                                 codegen.CurrentTypeDef.BeginEventDef (event_def);\r
1917                           }\r
1918                         | D_EVENT event_attr id\r
1919                         ;\r
1920 \r
1921 event_attr              : /* EMPTY */\r
1922                           {\r
1923                                 $$ = new FeatureAttr ();\r
1924                           }\r
1925                         | event_attr K_RTSPECIALNAME\r
1926                           {\r
1927                                 $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;\r
1928                           }\r
1929                         | event_attr K_SPECIALNAME\r
1930                           {\r
1931                                 $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;\r
1932                           }\r
1933                         ;\r
1934 \r
1935 event_decls             : /* EMPTY */\r
1936                         | event_decls event_decl\r
1937                         ;\r
1938 \r
1939 event_decl              : D_ADDON method_ref\r
1940                           {\r
1941                                 codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
1942                                         (MethodRef) $2);                                \r
1943                           }\r
1944                         | D_REMOVEON method_ref\r
1945                           {\r
1946                                 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
1947                                         (MethodRef) $2);\r
1948                           }\r
1949                         | D_FIRE method_ref\r
1950                           {\r
1951                                 codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
1952                                         (MethodRef) $2);\r
1953                           }\r
1954                         | D_OTHER method_ref\r
1955                           {\r
1956                                 codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
1957                                         (MethodRef) $2);\r
1958                           }\r
1959                         | customattr_decl\r
1960                         | extsource_spec\r
1961                         | language_decl\r
1962                         ;\r
1963 \r
1964 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
1965                           {\r
1966                                 codegen.CurrentTypeDef.EndPropertyDef ();\r
1967                           }\r
1968                         ;\r
1969 \r
1970 prop_head               : D_PROPERTY prop_attr type id OPEN_PARENS type_list CLOSE_PARENS init_opt\r
1971                           {\r
1972                                 PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,\r
1973                                         (string) $4, (ArrayList) $6);\r
1974                                 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
1975 \r
1976                                 if ($8 != null) {\r
1977                                         prop_def.AddInitValue ((Constant) $8);\r
1978                                 }\r
1979                           }\r
1980                         ;\r
1981 \r
1982 prop_attr               : /* EMPTY */\r
1983                           {\r
1984                                 $$ = new FeatureAttr ();\r
1985                           }\r
1986                         | prop_attr K_RTSPECIALNAME\r
1987                           {\r
1988                                 $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;\r
1989                           }\r
1990                         | prop_attr K_SPECIALNAME\r
1991                           {\r
1992                                 $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;\r
1993                           }\r
1994                         ;\r
1995 \r
1996 prop_decls              : /* EMPTY */\r
1997                         | prop_decls prop_decl\r
1998                         ;\r
1999 \r
2000 prop_decl               : D_SET method_ref\r
2001                           {\r
2002                                 codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);\r
2003                           }\r
2004                         | D_GET method_ref\r
2005                           {\r
2006                                 codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);\r
2007                           }\r
2008                         | D_OTHER method_ref\r
2009                           {\r
2010                                 codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);\r
2011                           }\r
2012                         | customattr_decl\r
2013                         | extsource_spec\r
2014                         | language_decl\r
2015                         ;\r
2016 \r
2017 customattr_decl         : D_CUSTOM custom_type\r
2018                           {\r
2019                                 $$ = new CustomAttr ((IMethodRef) $2, null);\r
2020                           }\r
2021                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
2022                         | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
2023                           {\r
2024                                 $$ = new CustomAttr ((IMethodRef) $2,\r
2025                                         (byte[]) $5);\r
2026                           }\r
2027                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
2028                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
2029                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
2030                           OPEN_PARENS bytes CLOSE_PARENS\r
2031                         ;\r
2032                         \r
2033 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
2034                           {\r
2035                                 ITypeRef owner = (ITypeRef) $3;\r
2036                                 ArrayList arg_list = (ArrayList) $7;\r
2037                                 ITypeRef[] param_list;\r
2038   \r
2039                                 if (arg_list != null)\r
2040                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2041                                 else\r
2042                                         param_list = new ITypeRef[0];\r
2043 \r
2044                                 $$ = owner.AsClassRef (codegen).GetMethodRef ((ITypeRef) $2,\r
2045                                         (CallConv) $1, (string) $5, param_list);\r
2046                           }\r
2047                         | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
2048                           {\r
2049                                 ArrayList arg_list = (ArrayList) $5;\r
2050                                 ITypeRef[] param_list;\r
2051   \r
2052                                 if (arg_list != null)\r
2053                                         param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
2054                                 else\r
2055                                         param_list = new ITypeRef[0];\r
2056 \r
2057                                 $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
2058                                         (string) $3, param_list);\r
2059                           }\r
2060                         ;\r
2061 \r
2062 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
2063                         | D_PERMISSION sec_action type_spec\r
2064                         | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
2065                         ;\r
2066 \r
2067 nameval_pairs           : nameval_pair \r
2068                         | nameval_pairs COMMA nameval_pair\r
2069                         ;\r
2070 \r
2071 nameval_pair            : comp_qstring ASSIGN cavalue\r
2072                         ;\r
2073 \r
2074 cavalue                 : truefalse\r
2075                         | int32\r
2076                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
2077                         | comp_qstring \r
2078                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
2079                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
2080                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
2081                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
2082                         ;\r
2083 \r
2084 sec_action              : K_REQUEST\r
2085                         | K_DEMAND\r
2086                         | K_ASSERT\r
2087                         | K_DENY\r
2088                         | K_PERMITONLY\r
2089                         | K_LINKCHECK\r
2090                         | K_INHERITCHECK\r
2091                         | K_REQMIN\r
2092                         | K_REQOPT\r
2093                         | K_REQREFUSE\r
2094                         | K_PREJITGRANT\r
2095                         | K_PREJITDENY\r
2096                         | K_NONCASDEMAND\r
2097                         | K_NONCASLINKDEMAND\r
2098                         | K_NONCASINHERITANCE\r
2099                         ;\r
2100 \r
2101 module_head             : D_MODULE\r
2102                         | D_MODULE comp_name\r
2103                         | D_MODULE K_EXTERN comp_name\r
2104                         ;\r
2105 \r
2106 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
2107                           OPEN_PARENS bytes CLOSE_PARENS file_entry\r
2108                         | D_FILE file_attr comp_name file_entry\r
2109                         ;\r
2110 \r
2111 file_attr               : /* EMPTY */\r
2112                         | file_attr K_NOMETADATA\r
2113                         ;\r
2114 \r
2115 file_entry              : /* EMPTY */\r
2116                         | D_ENTRYPOINT\r
2117                         ;\r
2118 \r
2119 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
2120                         ;\r
2121 \r
2122 assembly_head           : D_ASSEMBLY asm_attr file_name\r
2123                           {\r
2124                                 codegen.SetAssemblyName ((string) $3);\r
2125                           }\r
2126                         ;\r
2127 \r
2128 asm_attr                : /* EMPTY */\r
2129                         | asm_attr K_NOAPPDOMAIN\r
2130                         | asm_attr K_NOPROCESS\r
2131                         | asm_attr K_NOMACHINE\r
2132                         ;\r
2133 \r
2134 assembly_decls          : /* EMPTY */\r
2135                         | assembly_decls assembly_decl\r
2136                         ;\r
2137 \r
2138 assembly_decl           : D_HASH K_ALGORITHM int32\r
2139                         | sec_decl\r
2140                         | asm_or_ref_decl\r
2141                         ;\r
2142 \r
2143 asm_or_ref_decl         : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
2144                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
2145                         | D_LOCALE comp_qstring\r
2146                         | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
2147                         | customattr_decl\r
2148                         ;\r
2149 \r
2150 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
2151                         ;\r
2152 \r
2153 assemblyref_head        : D_ASSEMBLY K_EXTERN file_name\r
2154                           {\r
2155                                 System.Reflection.AssemblyName asmb_name = \r
2156                                         new System.Reflection.AssemblyName ();\r
2157                                 asmb_name.Name = (string) $3;\r
2158                                 codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
2159                           }\r
2160                         | D_ASSEMBLY K_EXTERN file_name K_AS file_name\r
2161                           {\r
2162                                 System.Reflection.AssemblyName asmb_name = \r
2163                                         new System.Reflection.AssemblyName ();\r
2164                                 asmb_name.Name = (string) $3;\r
2165                                 codegen.ExternTable.AddAssembly ((string) $5, asmb_name);\r
2166                           }\r
2167                         ;\r
2168 \r
2169 assemblyref_decls       : /* EMPTY */\r
2170                         | assemblyref_decls assemblyref_decl\r
2171                         ;\r
2172 \r
2173 assemblyref_decl        : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
2174                         | asm_or_ref_decl\r
2175                         | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
2176                         ;\r
2177 \r
2178 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
2179                         ;\r
2180 \r
2181 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
2182                         ;\r
2183 \r
2184 expt_attr               : /* EMPTY */\r
2185                         | expt_attr K_PRIVATE\r
2186                         | expt_attr K_PUBLIC \r
2187                         | expt_attr K_NESTED K_PUBLIC\r
2188                         | expt_attr K_NESTED K_PRIVATE\r
2189                         | expt_attr K_NESTED K_FAMILY\r
2190                         | expt_attr K_NESTED K_ASSEMBLY\r
2191                         | expt_attr K_NESTED K_FAMANDASSEM\r
2192                         | expt_attr K_NESTED K_FAMORASSEM\r
2193                         ;\r
2194 \r
2195 exptype_decls           : /* EMPTY */\r
2196                         | exptype_decls exptype_decl\r
2197                         ;\r
2198 \r
2199 exptype_decl            : D_FILE comp_name\r
2200                         | D_CLASS K_EXTERN comp_name\r
2201                         | D_CLASS int32\r
2202                         | customattr_decl\r
2203                         ;\r
2204 \r
2205 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
2206                         ;\r
2207 \r
2208 manifestres_head        : D_MRESOURCE manres_attr comp_name     \r
2209                         ;\r
2210 \r
2211 manres_attr             : /* EMPTY */\r
2212                         | manres_attr K_PUBLIC\r
2213                         | manres_attr K_PRIVATE\r
2214                         ;\r
2215 \r
2216 manifestres_decls       : /* EMPTY */\r
2217                         | manifestres_decls manifestres_decl\r
2218                         ;\r
2219 \r
2220 manifestres_decl        : D_FILE comp_name K_AT int32\r
2221                         | D_ASSEMBLY K_EXTERN file_name\r
2222                         | customattr_decl\r
2223                         ;\r
2224 \r
2225 comp_qstring            : QSTRING\r
2226                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
2227                         ;\r
2228 \r
2229 int32                   : INT32\r
2230                         | INT64\r
2231                           {\r
2232                                 long l = (long) $1;\r
2233                                 byte[] intb = BitConverter.GetBytes (l);\r
2234                                 $$ = BitConverter.ToInt32 (intb, 0);\r
2235                           }\r
2236                         ;\r
2237 \r
2238 int64                   : INT64\r
2239                         | INT32\r
2240                           {\r
2241                                 $$ = Convert.ToInt64 ($1);\r
2242                           }\r
2243                         ;\r
2244 \r
2245 float64                 : FLOAT64\r
2246                         | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS\r
2247                           {\r
2248                                 int i = (int) $3;\r
2249                                 byte[] intb = BitConverter.GetBytes (i);\r
2250                                 $$ = (double) BitConverter.ToSingle (intb, 0);\r
2251                           }\r
2252                         | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
2253                           {\r
2254                                 long l = (long) $3;\r
2255                                 byte[] intb = BitConverter.GetBytes (l);\r
2256                                 $$ = (double) BitConverter.ToSingle (intb, 0);\r
2257                           }\r
2258                         | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
2259                           {\r
2260                                 byte[] intb = BitConverter.GetBytes ((long) $3);\r
2261                                 $$ = BitConverter.ToDouble (intb, 0);\r
2262                           }\r
2263                         | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
2264                           {\r
2265                                 byte[] intb = BitConverter.GetBytes ((int) $3);\r
2266                                 $$ = (double) BitConverter.ToSingle (intb, 0);\r
2267                           }\r
2268                         ;\r
2269 \r
2270 hexbyte                 : HEXBYTE\r
2271                         | INT32         { $$ = Convert.ToByte ($1); }\r
2272                         | ID\r
2273                           {\r
2274                                 $$ = Byte.Parse ((string) $1, NumberStyles.HexNumber);\r
2275                           }\r
2276                         ;\r
2277 \r
2278 bytes                   : /* EMPTY */   { $$ = new byte[0]; }\r
2279                         | hexbytes\r
2280                           {\r
2281                                 ArrayList byte_list = (ArrayList) $1;\r
2282                                 $$ = byte_list.ToArray (typeof (byte));\r
2283                           }\r
2284                         ;\r
2285 \r
2286 hexbytes                : hexbyte\r
2287                           {\r
2288                                 ArrayList byte_list = new ArrayList ();\r
2289                                 byte_list.Add (Convert.ToByte ($1));\r
2290                                 $$ = byte_list;\r
2291                           }\r
2292                         | hexbytes hexbyte\r
2293                           {\r
2294                                 ArrayList byte_list = (ArrayList) $1;\r
2295                                 byte_list.Add (Convert.ToByte ($2));\r
2296                           }\r
2297                         ;\r
2298 \r
2299 truefalse               : K_TRUE\r
2300                         | K_FALSE\r
2301                         ;\r
2302 \r
2303 id                      : ID\r
2304                         | SQSTRING\r
2305                         ;\r
2306 \r
2307 comp_name               : id\r
2308                         | comp_name DOT id\r
2309                           {\r
2310                                 $$ = (string) $1 + '.' + (string) $3;\r
2311                           }\r
2312                         ;\r
2313 \r
2314 file_name               : comp_name\r
2315                         | file_name DASH comp_name\r
2316                           {\r
2317                                 $$ = (string) $1 + '-' + (string) $3;\r
2318                           }\r
2319                         ;\r
2320 \r
2321 \r
2322 %%\r
2323 \r
2324 }\r
2325 \r