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