* ILParser.jay: Add external types to the extern type table.
[mono.git] / mcs / ilasm / parser / ILParser.jay
1 %{\r
2 // Mono::ILASM::ILParser\r
3 //\r
4 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
5 \r
6 using PEAPI;\r
7 using System;\r
8 using System.Collections;\r
9 \r
10 namespace Mono.ILASM {\r
11 \r
12         public class ILParser {\r
13 \r
14                 private CodeGen codegen;\r
15 \r
16                 public ILParser (CodeGen codegen) {\r
17                         this.codegen = codegen;\r
18                 }\r
19 \r
20                 public CodeGen CodeGen {\r
21                         get { return codegen; }\r
22                 }\r
23                 \r
24 %}\r
25 \r
26 %token EOF\r
27 \r
28 /* ID - alpha-numeric identifier */\r
29 %token ID\r
30 \r
31 /* QSTRING - quoted string */\r
32 %token QSTRING\r
33 \r
34 /* SQSTRING - single quoted string */\r
35 %token SQSTRING\r
36 \r
37 /* INT32 - 32 bit integer */\r
38 %token INT32\r
39 \r
40 /* INT64 - 64 bit integer */\r
41 %token INT64\r
42 \r
43 /* FLOAT64 - floating point number */\r
44 %token FLOAT64\r
45 \r
46 /* HEXBYTE - two digit hex number */\r
47 %token HEXBYTE\r
48 \r
49 \r
50 /* Punctuation */\r
51 %token DOT           "."\r
52 %token OPEN_BRACE    "{"\r
53 %token CLOSE_BRACE   "}"\r
54 %token OPEN_BRACKET  "["\r
55 %token CLOSE_BRACKET "]"\r
56 %token OPEN_PARENS   "("\r
57 %token CLOSE_PARENS  ")"\r
58 %token COMMA         ","\r
59 %token COLON         ":"\r
60 %token DOUBLE_COLON  "::"\r
61 %token SEMICOLON     ";"\r
62 %token ASSIGN        "="\r
63 %token STAR          "*"\r
64 %token AMPERSAND     "&"\r
65 %token PLUS          "+"\r
66 %token SLASH         "/"\r
67 %token BANG          "!"\r
68 %token ELLIPSIS      "..."\r
69 %token DASH          "-"\r
70 %token OPEN_ANGLE_BRACKET   "<"\r
71 %token CLOSE_ANGLE_BRACKET  ">"\r
72 \r
73 \r
74 \r
75 %token UNKNOWN\r
76 \r
77 \r
78 /* INSTR_* instruction types */\r
79 %token INSTR_NONE\r
80 %token INSTR_VAR\r
81 %token INSTR_I\r
82 %token INSTR_I8\r
83 %token INSTR_R\r
84 %token INSTR_BRTARGET\r
85 %token INSTR_METHOD\r
86 %token INSTR_NEWOBJ\r
87 %token INSTR_FIELD\r
88 %token INSTR_TYPE\r
89 %token INSTR_STRING\r
90 %token INSTR_SIG\r
91 %token INSTR_RVA\r
92 %token INSTR_TOK\r
93 %token INSTR_SWITCH\r
94 %token INSTR_PHI\r
95 \r
96 \r
97 \r
98 \r
99 \r
100 \r
101 \r
102 /* Mechanically generated  - DO NOT EDIT! */\r
103 \r
104 \r
105 /* Directives */\r
106 %token D_ADDON\r
107 %token D_ALGORITHM\r
108 %token D_ASSEMBLY\r
109 %token D_BACKING\r
110 %token D_BLOB\r
111 %token D_CAPABILITY\r
112 %token D_CCTOR\r
113 %token D_CLASS\r
114 %token D_COMTYPE\r
115 %token D_CONFIG\r
116 %token D_CORFLAGS\r
117 %token D_CTOR\r
118 %token D_CUSTOM\r
119 %token D_DATA\r
120 %token D_EMITBYTE\r
121 %token D_ENTRYPOINT\r
122 %token D_EVENT\r
123 %token D_EXELOC\r
124 %token D_EXPORT\r
125 %token D_FIELD\r
126 %token D_FILE\r
127 %token D_FIRE\r
128 %token D_GET\r
129 %token D_HASH\r
130 %token D_IMPLICITCOM\r
131 %token D_LANGUAGE\r
132 %token D_LINE\r
133 %token D_XLINE\r
134 %token D_LOCALE\r
135 %token D_LOCALS\r
136 %token D_MANIFESTRES\r
137 %token D_MAXSTACK\r
138 %token D_METHOD\r
139 %token D_MIME\r
140 %token D_MODULE\r
141 %token D_MRESOURCE\r
142 %token D_NAMESPACE\r
143 %token D_ORIGINATOR\r
144 %token D_OS\r
145 %token D_OTHER\r
146 %token D_OVERRIDE\r
147 %token D_PACK\r
148 %token D_PARAM\r
149 %token D_PERMISSION\r
150 %token D_PERMISSIONSET\r
151 %token D_PROCESSOR\r
152 %token D_PROPERTY\r
153 %token D_PUBLICKEY\r
154 %token D_PUBLICKEYTOKEN\r
155 %token D_REMOVEON\r
156 %token D_SET\r
157 %token D_SIZE\r
158 %token D_SUBSYSTEM\r
159 %token D_TITLE\r
160 %token D_TRY\r
161 %token D_VER\r
162 %token D_VTABLE\r
163 %token D_VTENTRY\r
164 %token D_VTFIXUP\r
165 %token D_ZEROINIT\r
166 \r
167 \r
168 /* Keywords */\r
169 %token K_AT\r
170 %token K_AS\r
171 %token K_IMPLICITCOM\r
172 %token K_IMPLICITRES\r
173 %token K_NOAPPDOMAIN\r
174 %token K_NOPROCESS\r
175 %token K_NOMACHINE\r
176 %token K_EXTERN\r
177 %token K_INSTANCE\r
178 %token K_EXPLICIT\r
179 %token K_DEFAULT\r
180 %token K_VARARG\r
181 %token K_UNMANAGED\r
182 %token K_CDECL\r
183 %token K_STDCALL\r
184 %token K_THISCALL\r
185 %token K_FASTCALL\r
186 %token K_MARSHAL\r
187 %token K_IN\r
188 %token K_OUT\r
189 %token K_OPT\r
190 %token K_LCID\r
191 %token K_RETVAL\r
192 %token K_STATIC\r
193 %token K_PUBLIC\r
194 %token K_PRIVATE\r
195 %token K_FAMILY\r
196 %token K_INITONLY\r
197 %token K_RTSPECIALNAME\r
198 %token K_SPECIALNAME\r
199 %token K_ASSEMBLY\r
200 %token K_FAMANDASSEM\r
201 %token K_FAMORASSEM\r
202 %token K_PRIVATESCOPE\r
203 %token K_LITERAL\r
204 %token K_NOTSERIALIZED\r
205 %token K_VALUE\r
206 %token K_NOT_IN_GC_HEAP\r
207 %token K_INTERFACE\r
208 %token K_SEALED\r
209 %token K_ABSTRACT\r
210 %token K_AUTO\r
211 %token K_SEQUENTIAL\r
212 %token K_ANSI\r
213 %token K_UNICODE\r
214 %token K_AUTOCHAR\r
215 %token K_IMPORT\r
216 %token K_SERIALIZABLE\r
217 %token K_NESTED\r
218 %token K_LATEINIT\r
219 %token K_EXTENDS\r
220 %token K_IMPLEMENTS\r
221 %token K_FINAL\r
222 %token K_VIRTUAL\r
223 %token K_HIDEBYSIG\r
224 %token K_NEWSLOT\r
225 %token K_UNMANAGEDEXP\r
226 %token K_PINVOKEIMPL\r
227 %token K_NOMANGLE\r
228 %token K_OLE\r
229 %token K_LASTERR\r
230 %token K_WINAPI\r
231 %token K_NATIVE\r
232 %token K_IL\r
233 %token K_CIL\r
234 %token K_OPTIL\r
235 %token K_MANAGED\r
236 %token K_FORWARDREF\r
237 %token K_RUNTIME\r
238 %token K_INTERNALCALL\r
239 %token K_SYNCHRONIZED\r
240 %token K_NOINLINING\r
241 %token K_CUSTOM\r
242 %token K_FIXED\r
243 %token K_SYSSTRING\r
244 %token K_ARRAY\r
245 %token K_VARIANT\r
246 %token K_CURRENCY\r
247 %token K_SYSCHAR\r
248 %token K_VOID\r
249 %token K_BOOL\r
250 %token K_INT8\r
251 %token K_INT16\r
252 %token K_INT32\r
253 %token K_INT64\r
254 %token K_FLOAT32\r
255 %token K_FLOAT64\r
256 %token K_ERROR\r
257 %token K_UNSIGNED\r
258 %token K_DECIMAL\r
259 %token K_DATE\r
260 %token K_BSTR\r
261 %token K_LPSTR\r
262 %token K_LPWSTR\r
263 %token K_LPTSTR\r
264 %token K_OBJECTREF\r
265 %token K_IUNKNOWN\r
266 %token K_IDISPATCH\r
267 %token K_STRUCT\r
268 %token K_SAFEARRAY\r
269 %token K_INT\r
270 %token K_BYVALSTR\r
271 %token K_TBSTR\r
272 %token K_LPVOID\r
273 %token K_ANY\r
274 %token K_FLOAT\r
275 %token K_LPSTRUCT\r
276 %token K_NULL\r
277 %token K_PTR\r
278 %token K_VECTOR\r
279 %token K_HRESULT\r
280 %token K_CARRAY\r
281 %token K_USERDEFINED\r
282 %token K_RECORD\r
283 %token K_FILETIME\r
284 %token K_BLOB\r
285 %token K_STREAM\r
286 %token K_STORAGE\r
287 %token K_STREAMED_OBJECT\r
288 %token K_STORED_OBJECT\r
289 %token K_BLOB_OBJECT\r
290 %token K_CF\r
291 %token K_CLSID\r
292 %token K_METHOD\r
293 %token K_CLASS\r
294 %token K_PINNED\r
295 %token K_MODREQ\r
296 %token K_MODOPT\r
297 %token K_TYPEDREF\r
298 %token K_WCHAR\r
299 %token K_CHAR\r
300 %token K_FROMUNMANAGED\r
301 %token K_CALLMOSTDERIVED\r
302 %token K_BYTEARRAY\r
303 %token K_WITH\r
304 %token K_INIT\r
305 %token K_TO\r
306 %token K_CATCH\r
307 %token K_FILTER\r
308 %token K_FINALLY\r
309 %token K_FAULT\r
310 %token K_HANDLER\r
311 %token K_TLS\r
312 %token K_FIELD\r
313 %token K_REQUEST\r
314 %token K_DEMAND\r
315 %token K_ASSERT\r
316 %token K_DENY\r
317 %token K_PERMITONLY\r
318 %token K_LINKCHECK\r
319 %token K_INHERITCHECK\r
320 %token K_REQMIN\r
321 %token K_REQOPT\r
322 %token K_REQREFUSE\r
323 %token K_PREJITGRANT\r
324 %token K_PREJITDENY\r
325 %token K_NONCASDEMAND\r
326 %token K_NONCASLINKDEMAND\r
327 %token K_NONCASINHERITANCE\r
328 %token K_READONLY\r
329 %token K_NOMETADATA\r
330 %token K_ALGORITHM\r
331 %token K_FULLORIGIN\r
332 %token K_NAN\r
333 %token K_INF\r
334 %token K_PUBLICKEY\r
335 %token K_ENABLEJITTRACKING\r
336 %token K_DISABLEJITOPTIMIZER\r
337 %token K_PRESERVESIG\r
338 %token K_BEFOREFIELDINIT\r
339 %token K_ALIGNMENT\r
340 %token K_NULLREF\r
341 %token K_VALUETYPE\r
342 %token K_COMPILERCONTROLLED\r
343 %token K_REQSECOBJ\r
344 %token K_ENUM\r
345 %token K_OBJECT\r
346 %token K_STRING\r
347 %token K_TRUE\r
348 %token K_FALSE\r
349 \r
350 /* end generated */\r
351 \r
352 \r
353 \r
354 \r
355 \r
356 %start il_file\r
357 \r
358 %%\r
359 \r
360 il_file                 : decls\r
361                         ;\r
362 \r
363 decls                   : /* EMPTY */\r
364                         | decls decl\r
365                         ;\r
366 \r
367 decl                    : class_all\r
368                         | namespace_all\r
369                         | method_all\r
370                         | field_decl\r
371                         | data_decl\r
372                         | vtfixup_decl\r
373                         | file_decl\r
374                         | assembly_all\r
375                         | assemblyref_all\r
376                         | exptype_all\r
377                         | manifestres_all\r
378                         | module_head\r
379                         | sec_decl\r
380                         | customattr_decl\r
381                         | D_SUBSYSTEM int32\r
382                         | D_CORFLAGS int32\r
383                         | D_FILE K_ALIGNMENT int32\r
384                 /*      | D_IMAGEBASE int64     */\r
385                         | extsource_spec\r
386                         | language_decl\r
387                         ;\r
388 \r
389 extsource_spec          : D_LINE int32 SQSTRING\r
390                         | D_LINE int32\r
391                         | D_LINE int32 COLON int32 SQSTRING\r
392                         | D_LINE int32 COLON int32\r
393                         ;\r
394 \r
395 language_decl           : D_LANGUAGE SQSTRING\r
396                         | D_LANGUAGE SQSTRING COMMA SQSTRING\r
397                         | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
398                         ;\r
399 \r
400 vtfixup_decl            : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
401                           vtfixup_attr K_AT id\r
402                         ;\r
403 \r
404 vtfixup_attr            : /* EMPTY */\r
405                         | vtfixup_attr int32\r
406                         | vtfixup_attr int64\r
407                         | vtfixup_attr K_FROMUNMANAGED\r
408                         | vtfixup_attr K_CALLMOSTDERIVED\r
409                         ;\r
410 \r
411 namespace_all           : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
412                           {\r
413                                 codegen.CurrentNameSpace = null;\r
414                           }\r
415                         ;\r
416 \r
417 namespace_head          : D_NAMESPACE comp_name\r
418                           {\r
419                                 codegen.CurrentNameSpace = (string) $2;\r
420                           }\r
421                         ;\r
422 \r
423 class_all               : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
424                           {\r
425                                 codegen.EndTypeDef ();\r
426                           }\r
427                         ;\r
428 \r
429 class_head              : D_CLASS class_attr id typars_clause extends_clause\r
430                           impl_clause\r
431                           {\r
432                                 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
433                                                 $5 as IClassRef, $6 as ArrayList, null);\r
434 \r
435                                 /*\r
436                                 // Lets not worry about generics for now :p\r
437                                 if ($4 != null) {\r
438                                         ArrayList typars_list = (ArrayList) $4;\r
439                                         int index = 0;\r
440                                         foreach (DictionaryEntry entry in typars_list) {\r
441                                                 TypeRef type = (TypeRef) entry.Key;\r
442                                                 string name = (string) entry.Value;\r
443                                                 codegen.CurrentClass.AddGenericParameter ((short) index++, type.Type, name);\r
444                                         }\r
445                                 }\r
446                                 */\r
447                           }\r
448                         ;\r
449 \r
450 class_attrs             : class_attrs class_attr\r
451                         ;\r
452 \r
453 class_attr              : /* EMPTY */                           { $$ = new TypeAttr (); }\r
454                         | class_attr K_PUBLIC                   { $$ = (TypeAttr)$1 | TypeAttr.Public; }        \r
455                         | class_attr K_PRIVATE                  { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
456                         | class_attr K_NESTED K_PRIVATE         { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
457                         | class_attr K_NESTED K_PUBLIC          { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
458                         | class_attr K_NESTED K_FAMILY          { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
459                         | class_attr K_NESTED K_ASSEMBLY        { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
460                         | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
461                         | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
462                         | class_attr K_VALUE                    {  }\r
463                         | class_attr K_ENUM                     {  }\r
464                         | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
465                         | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
466                         | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
467                         | class_attr K_AUTO                     {  }\r
468                         | class_attr K_SEQUENTIAL               { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
469                         | class_attr K_EXPLICIT                 { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
470                         | class_attr K_ANSI                     {  }\r
471                         | class_attr K_UNICODE                  { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
472                         | class_attr K_AUTOCHAR                 { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
473                         | class_attr K_IMPORT                   { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
474                         | class_attr K_SERIALIZABLE             { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
475                         | class_attr K_BEFOREFIELDINIT          { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
476                         | class_attr K_SPECIALNAME              { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
477                         | class_attr K_RTSPECIALNAME            { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
478                         ;\r
479 \r
480 extends_clause          : /* EMPTY */\r
481                         | K_EXTENDS class_ref\r
482                           {\r
483                                 $$ = $2;\r
484                           }\r
485                         ;\r
486 \r
487 impl_clause             : /* EMPTY */\r
488                         | K_IMPLEMENTS class_refs\r
489                           {\r
490                                 $$ = $2;\r
491                           }\r
492                         ;\r
493 \r
494 typars_clause           : /* EMPTY */\r
495                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
496                           {\r
497                                 $$ = $2;\r
498                           }\r
499                         ;\r
500 \r
501 typars                  : type\r
502                           {\r
503                                 ArrayList typars_list = new ArrayList ();\r
504                                 typars_list.Add ($1);\r
505                                 $$ = typars_list;\r
506                           }\r
507                         | typars COMMA type\r
508                           {\r
509                                 ArrayList typars_list = (ArrayList) $1;\r
510                                 typars_list.Add ($3);\r
511                                 $$ = typars_list;\r
512                           }\r
513                         ;\r
514 \r
515 formal_typars           : formal_typar\r
516                           {\r
517                                 ArrayList formal_list = new ArrayList ();\r
518                                 formal_list.Add ($1);\r
519                                 $$ = formal_list;\r
520                           }\r
521                         | formal_typars COMMA formal_typar\r
522                           {\r
523                                 ArrayList formal_list = (ArrayList) $1;\r
524                                 formal_list.Add ($3);\r
525                                 $$ = formal_list;\r
526                           }\r
527                         ;\r
528 \r
529 \r
530 formal_typar            : type          { $$ = new DictionaryEntry ($1, null); }\r
531                         | type id       { $$ = new DictionaryEntry ($1, $2); }\r
532                         ;\r
533                         \r
534 class_refs              : class_ref\r
535                           {\r
536                                 ArrayList class_list = new ArrayList ();\r
537                                 class_list.Add ($1);\r
538                                 $$ = class_list; \r
539                           }\r
540                         | class_refs COMMA class_ref\r
541                           {\r
542                                 ArrayList class_list = (ArrayList) $1;\r
543                                 class_list.Add ($3);\r
544                           }\r
545                         ;\r
546 \r
547 slashed_name            : comp_name\r
548                         | slashed_name SLASH comp_name\r
549                           {\r
550                                 $$ = String.Format ("{0}/{1}", $1, $3);\r
551                           }\r
552                         ;\r
553 \r
554 class_ref               : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name\r
555                           {\r
556                                 ClassRef klass = codegen.ExternTable.GetClass ((string) $2, (string)$4);\r
557                                 $$ = new ExternTypeRef (klass, (string) $4);\r
558                           }\r
559                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name\r
560                         | slashed_name\r
561                           {\r
562                                 $$ = new TypeRef ((string) $1, null);\r
563                           }\r
564                         ;\r
565 \r
566 class_decls             : /* EMPTY */\r
567                         | class_decls class_decl\r
568                         ;\r
569 \r
570 class_decl              : method_all\r
571                         | class_all\r
572                         | event_all\r
573                         | prop_all\r
574                         | field_decl\r
575                         | data_decl\r
576                         | sec_decl\r
577                         | extsource_spec\r
578                         | customattr_decl\r
579                         | D_SIZE int32\r
580                           {\r
581                                 \r
582                           }\r
583                         | D_PACK int32\r
584                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
585                           K_WITH call_conv type type_spec DOUBLE_COLON method_name\r
586                           OPEN_PARENS sig_args CLOSE_PARENS\r
587                         | language_decl\r
588                         ;\r
589 \r
590 type                    : K_CLASS class_ref\r
591                           {\r
592                                 $$ = $2;\r
593                           }\r
594                         | K_OBJECT\r
595                           {\r
596                                 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
597                           }\r
598                         | K_STRING\r
599                           {\r
600                                 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
601                           }\r
602                         | K_VALUE K_CLASS class_ref\r
603                           {\r
604                                 $$ = $3;\r
605                           }\r
606                         | K_VALUETYPE class_ref\r
607                           {\r
608                                 $$ = $2;\r
609                           }\r
610                         | type OPEN_BRACKET CLOSE_BRACKET\r
611                           {\r
612                                 ITypeRef base_type = (ITypeRef) $1;\r
613                                 base_type.MakeArray ();\r
614                           }\r
615                         | type OPEN_BRACKET bounds CLOSE_BRACKET\r
616                           {\r
617                                 ITypeRef base_type = (ITypeRef) $1;\r
618                                 ArrayList bound_list = (ArrayList) $3;\r
619                                 base_type.MakeBoundArray (bound_list);\r
620                           }\r
621                         | type AMPERSAND\r
622                           {\r
623                                 ITypeRef base_type = (ITypeRef) $1;\r
624                                 base_type.MakeManagedPointer ();\r
625                           }\r
626                         | type STAR\r
627                           {\r
628                                 ITypeRef base_type = (ITypeRef) $1;\r
629                                 base_type.MakeUnmanagedPointer ();\r
630                           }\r
631                         | type K_PINNED\r
632                           {\r
633                                 ITypeRef base_type = (ITypeRef) $1;\r
634                                 base_type.MakePinned ();\r
635                           }\r
636                         | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
637                           {\r
638                                 /*\r
639                                 ITypeRef base_type = (ITypeRef) $1;\r
640                                 ITypeRef class_ref = (ITypeRef) $4;\r
641 \r
642                                 $$ = new CustomModifiedType (base_type.Type,\r
643                                         CustomModifier.modreq, (Class) class_ref.Type);\r
644                                 */\r
645                           }\r
646                         | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
647                           {\r
648                                 /*\r
649                                 TypeRef base_type = (TypeRef) $1;\r
650                                 TypeRef class_ref = (TypeRef) $4;\r
651 \r
652                                 $$ = new CustomModifiedType (base_type.Type,\r
653                                         CustomModifier.modopt, (Class) class_ref.Type);\r
654                                 */\r
655                           }\r
656                         | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
657                         | K_TYPEDREF\r
658                           {\r
659                                 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
660                                         "System.TypedReference");\r
661                           }\r
662                         | K_CHAR\r
663                           {\r
664                                 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
665                           }\r
666                         | K_VOID\r
667                           {\r
668                                 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
669                           }\r
670                         | K_BOOL\r
671                           {\r
672                                 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
673                           }\r
674                         | K_INT8\r
675                           {\r
676                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
677                           }\r
678                         | K_INT16\r
679                           {\r
680                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
681                           }\r
682                         | K_INT32\r
683                           {\r
684                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
685                           }\r
686                         | K_INT64\r
687                           {\r
688                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
689                           }\r
690                         | K_FLOAT32\r
691                           {\r
692                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
693                           }\r
694                         | K_FLOAT64\r
695                           {\r
696                                 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
697                           }\r
698                         | K_UNSIGNED K_INT8\r
699                           {\r
700                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
701                           }\r
702                         | K_UNSIGNED K_INT16\r
703                           {\r
704                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
705                           }\r
706                         | K_UNSIGNED K_INT32\r
707                           {\r
708                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
709                           }\r
710                         | K_UNSIGNED K_INT64\r
711                           {\r
712                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
713                           }\r
714                         | K_NATIVE K_INT\r
715                           {\r
716                                 // TODO: Is this the proper full name\r
717                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
718                           }\r
719                         \r
720                         | K_NATIVE K_UNSIGNED K_INT\r
721                           {\r
722                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
723                           }\r
724                         | BANG int32\r
725                           {\r
726                                 // access class type parameter by number\r
727                           }\r
728                         | BANG BANG int32\r
729                           {\r
730                                 // access method type parameter by number\r
731                           }\r
732                         ;\r
733 \r
734 bounds                  : bound\r
735                           {\r
736                                 ArrayList bound_list = new ArrayList ();\r
737                                 bound_list.Add ($1);\r
738                                 $$ = bound_list;\r
739                           }\r
740                         | bounds COMMA bound\r
741                           {\r
742                                 ArrayList bound_list = (ArrayList) $1;\r
743                                 bound_list.Add ($3);\r
744                           }\r
745                         ;\r
746 \r
747 bound                   : /* EMPTY */\r
748                         | ELLIPSIS\r
749                           {\r
750                                 // No lower bound or size\r
751                                 $$ = new DictionaryEntry (null,null);\r
752                           }\r
753                         | int32\r
754                           {\r
755                                 // ******** Not sure what this is?\r
756                                 // For now I will say it is size because there\r
757                                 // is allready a way to set lower\r
758                                 $$ = new DictionaryEntry (null, $1);\r
759                           }\r
760                         | int32 ELLIPSIS int32\r
761                           {\r
762                                 // lower bound and size\r
763                                 $$ = new DictionaryEntry ($1, $3);\r
764                           }\r
765                         | int32 ELLIPSIS\r
766                           {\r
767                                 // Just lower bound\r
768                                 $$ = new DictionaryEntry ($1, null);\r
769                           }\r
770                         ;\r
771 \r
772 call_conv               : K_INSTANCE call_conv\r
773                           {\r
774                                 $$ = (CallConv) $2 | CallConv.Instance;\r
775                           }\r
776                         | K_EXPLICIT call_conv\r
777                           {\r
778                                 $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
779                           }\r
780                         | call_kind\r
781                         ;\r
782 \r
783 call_kind               : /* EMPTY */\r
784                           {\r
785                                 $$ = new CallConv ();\r
786                           }\r
787                         | K_DEFAULT\r
788                           {\r
789                                 $$ = CallConv.Default;\r
790                           }\r
791                         | K_VARARG\r
792                           {\r
793                                 $$ = CallConv.Vararg;\r
794                           }\r
795                         | K_UNMANAGED K_CDECL\r
796                           {\r
797                                 $$ = CallConv.Cdecl;\r
798                           }\r
799                         | K_UNMANAGED K_STDCALL\r
800                           {\r
801                                 $$ = CallConv.Stdcall;\r
802                           }\r
803                         | K_UNMANAGED K_THISCALL\r
804                           {\r
805                                 $$ = CallConv.Thiscall;\r
806                           }\r
807                         | K_UNMANAGED K_FASTCALL\r
808                           {\r
809                                 $$ = CallConv.Fastcall;\r
810                           }\r
811                         ;\r
812 \r
813 native_type             : /* EMPTY */\r
814                         | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
815                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
816                           {\r
817                                 $$ = NativeType.FixedSysString;\r
818                           }\r
819                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
820                         | K_VARIANT\r
821                         | K_CURRENCY\r
822                           {\r
823                                 $$ = NativeType.Currency;\r
824                           }\r
825                         | K_SYSCHAR\r
826                         | K_VOID\r
827                           {\r
828                                 $$ = NativeType.Void;\r
829                           }\r
830                         | K_BOOL\r
831                           {\r
832                                 $$ = NativeType.Boolean;\r
833                           }\r
834                         | K_INT8\r
835                           {\r
836                                 $$ = NativeType.Int8;\r
837                           }\r
838                         | K_INT16\r
839                           {\r
840                                 $$ = NativeType.Int16;\r
841                           }\r
842                         | K_INT32\r
843                           {\r
844                                 $$ = NativeType.Int32;\r
845                           }\r
846                         | K_INT64\r
847                           {\r
848                                 $$ = NativeType.Int64;\r
849                           }\r
850                         | K_FLOAT32\r
851                           {\r
852                                 $$ = NativeType.Float32;\r
853                           }\r
854                         | K_FLOAT64\r
855                           {\r
856                                 $$ = NativeType.Float64;\r
857                           }\r
858                         | K_ERROR\r
859                         | K_UNSIGNED K_INT8\r
860                           {\r
861                                 $$ = NativeType.UInt8;\r
862                           }\r
863                         | K_UNSIGNED K_INT16\r
864                           {\r
865                                 $$ = NativeType.UInt16;\r
866                           }\r
867                         | K_UNSIGNED K_INT32\r
868                           {\r
869                                 $$ = NativeType.UInt32;\r
870                           }\r
871                         | K_UNSIGNED K_INT64\r
872                           {\r
873                                 $$ = NativeType.UInt64;\r
874                           }\r
875                         | native_type STAR\r
876                         | native_type OPEN_BRACKET CLOSE_BRACKET\r
877                         | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
878                         | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
879                         | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
880                         | K_DECIMAL\r
881                         | K_DATE\r
882                         | K_BSTR\r
883                           {\r
884                                 $$ = NativeType.BStr;\r
885                           }\r
886                         | K_LPSTR\r
887                           {\r
888                                 $$ = NativeType.LPStr;\r
889                           }\r
890                         | K_LPWSTR\r
891                           {\r
892                                 $$ = NativeType.LPWStr;\r
893                           }\r
894                         | K_LPTSTR\r
895                           {\r
896                                 $$ = NativeType.LPTStr;\r
897                           }\r
898                         | K_OBJECTREF\r
899                         | K_IUNKNOWN\r
900                           {\r
901                                 $$ = NativeType.IUnknown;\r
902                           }\r
903                         | K_IDISPATCH\r
904                           {\r
905                                 $$ = NativeType.IDispatch;\r
906                           }\r
907                         | K_STRUCT\r
908                           {\r
909                                 $$ = NativeType.Struct;\r
910                           }\r
911                         | K_INTERFACE\r
912                           {\r
913                                 $$ = NativeType.Interface;\r
914                           }\r
915                         | K_SAFEARRAY variant_type\r
916                         | K_SAFEARRAY variant_type COMMA comp_qstring\r
917                         | K_INT\r
918                           {\r
919                                 $$ = NativeType.Int;\r
920                           }\r
921                         | K_UNSIGNED K_INT\r
922                           {\r
923                                 $$ = NativeType.UInt;\r
924                           }\r
925                         | K_NESTED K_STRUCT\r
926                         | K_BYVALSTR\r
927                           {\r
928                                 $$ = NativeType.ByValStr;\r
929                           }\r
930                         | K_ANSI K_BSTR\r
931                           {\r
932                                 $$ = NativeType.AnsiBStr;\r
933                           }\r
934                         | K_TBSTR\r
935                           {\r
936                                 $$ = NativeType.TBstr;\r
937                           }\r
938                         | K_VARIANT K_BOOL\r
939                           {\r
940                                 $$ = NativeType.VariantBool;\r
941                           }\r
942                         | K_METHOD\r
943                         | K_AS K_ANY\r
944                           {\r
945                                 $$ = NativeType.AsAny;\r
946                           }\r
947                         | K_LPSTRUCT\r
948                         ;\r
949 \r
950 variant_type            : /* EMPTY */\r
951                         | K_NULL\r
952                         | K_VARIANT\r
953                         | K_CURRENCY\r
954                         | K_VOID\r
955                         | K_BOOL\r
956                         | K_INT8\r
957                         | K_INT16\r
958                         | K_INT32\r
959                         | K_INT64\r
960                         | K_FLOAT32\r
961                         | K_FLOAT64\r
962                         | K_UNSIGNED K_INT8\r
963                         | K_UNSIGNED K_INT16\r
964                         | K_UNSIGNED K_INT32\r
965                         | K_UNSIGNED K_INT64\r
966                         | STAR\r
967                         | variant_type OPEN_BRACKET CLOSE_BRACKET\r
968                         | variant_type K_VECTOR\r
969                         | variant_type AMPERSAND\r
970                         | K_DECIMAL\r
971                         | K_DATE\r
972                         | K_BSTR\r
973                         | K_LPSTR\r
974                         | K_LPWSTR\r
975                         | K_IUNKNOWN\r
976                         | K_IDISPATCH\r
977                         | K_SAFEARRAY\r
978                         | K_INT\r
979                         | K_UNSIGNED K_INT\r
980                         | K_ERROR\r
981                         | K_HRESULT\r
982                         | K_CARRAY\r
983                         | K_USERDEFINED\r
984                         | K_RECORD\r
985                         | K_FILETIME\r
986                         | K_BLOB\r
987                         | K_STREAM\r
988                         | K_STORAGE\r
989                         | K_STREAMED_OBJECT\r
990                         | K_STORED_OBJECT\r
991                         | K_BLOB_OBJECT\r
992                         | K_CF\r
993                         | K_CLSID\r
994                         ;\r
995 \r
996 field_decl              : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
997                           {\r
998                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
999                                         (string) $5, (ITypeRef) $4);\r
1000                                 codegen.AddFieldDef (field_def);\r
1001                                 \r
1002                                 if ($2 != null) {\r
1003                                         field_def.SetOffset ((uint) $2);\r
1004                                 }\r
1005                                 /*\r
1006                                 if ($6 != null) {\r
1007                                         field_def.AddDataValue ((DataConstant) $6);\r
1008                                 }\r
1009                                 if ($7 != null) {\r
1010                                         field_def.AddValue ((Constant) $7);\r
1011                                 }\r
1012                                 */\r
1013                           }\r
1014                         ;\r
1015 \r
1016 repeat_opt              : /* EMPTY */\r
1017                         | OPEN_BRACKET int32 CLOSE_BRACKET\r
1018                           {\r
1019                                 $$ = $2;\r
1020                           }\r
1021                         ;\r
1022 \r
1023 field_attr              : /* EMPTY */\r
1024                           {\r
1025                                 $$ = new FieldAttr ();\r
1026                           }\r
1027                         | field_attr K_PUBLIC\r
1028                           {\r
1029                                 $$ = (FieldAttr) $1 | FieldAttr.Public;\r
1030                           }\r
1031                         | field_attr K_PRIVATE\r
1032                           {\r
1033                                 $$ = (FieldAttr) $1 | FieldAttr.Private;\r
1034                           }\r
1035                         | field_attr K_FAMILY\r
1036                           {\r
1037                                 $$ = (FieldAttr) $1 | FieldAttr.Family;\r
1038                           }\r
1039                         | field_attr K_ASSEMBLY\r
1040                           {\r
1041                                 $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
1042                           }\r
1043                         | field_attr K_FAMANDASSEM\r
1044                           {\r
1045                                 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
1046                           }\r
1047                         | field_attr K_FAMORASSEM\r
1048                           {\r
1049                                 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
1050                           }\r
1051                         | field_attr K_PRIVATESCOPE\r
1052                           {\r
1053                                 // This is just 0x0000\r
1054                           }\r
1055                         | field_attr K_STATIC\r
1056                           {\r
1057                                 $$ = (FieldAttr) $1 | FieldAttr.Static;\r
1058                           }\r
1059                         | field_attr K_INITONLY\r
1060                           {\r
1061                                 $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
1062                           }\r
1063                         | field_attr K_RTSPECIALNAME\r
1064                           {\r
1065                                 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
1066                           }\r
1067                         | field_attr K_SPECIALNAME\r
1068                           {\r
1069                                 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
1070                           }\r
1071                         | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1072                           {\r
1073                                 \r
1074                           }\r
1075                         | field_attr K_LITERAL\r
1076                           {\r
1077                                 $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
1078                           }\r
1079                         | field_attr K_NOTSERIALIZED\r
1080                           {\r
1081                                 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
1082                           }\r
1083                         ;\r
1084 \r
1085 at_opt                  : /* EMPTY */\r
1086                         | K_AT id\r
1087                           {\r
1088                                 // TODO: Implement DataTable\r
1089                                 // $$ = new DataConstant (DataTable.GetOffset ((string) $2));\r
1090                           }\r
1091                         ;\r
1092 \r
1093 init_opt                : /* EMPTY */\r
1094                         | ASSIGN field_init\r
1095                           {\r
1096                                 $$ = $2;\r
1097                           }\r
1098                         ;\r
1099 \r
1100 field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
1101                           {\r
1102                                 $$ = new FloatConst ((float) $3);\r
1103                           }\r
1104                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
1105                           {\r
1106                                 $$ = new DoubleConst ((double) $3);\r
1107                           }\r
1108                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
1109                           {\r
1110                                 $$ = new FloatConst ((float) $3);\r
1111                           }\r
1112                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1113                           {\r
1114                                 $$ = new DoubleConst ((float) $3);\r
1115                           }\r
1116                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
1117                           {\r
1118                                 $$ = new IntConst ((long) $3);\r
1119                           }\r
1120                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
1121                           {\r
1122                                 $$ = new IntConst ((int) $3);\r
1123                           }\r
1124                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
1125                           {\r
1126                                 $$ = new IntConst ((short) $3);\r
1127                           }\r
1128                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
1129                           {\r
1130                                 $$ = new CharConst ((char) $3);\r
1131                           }\r
1132                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
1133                           {\r
1134                                 $$ = new IntConst ((sbyte) $3);\r
1135                           }\r
1136                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
1137                           {\r
1138                                 $$ = new BoolConst ((bool) $3);\r
1139                           }\r
1140                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1141                           {\r
1142                                 $$ = new ByteArrConst ((byte[]) $3);\r
1143                           }\r
1144                         | comp_qstring\r
1145                           {\r
1146                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
1147                                 $$ = new StringConst ((string) $1);\r
1148                           }\r
1149                         | K_NULLREF\r
1150                           {\r
1151                                 $$ = new NullConst ();\r
1152                           }\r
1153                         ;\r
1154 \r
1155 data_decl               : data_head data_body\r
1156                         ;\r
1157 \r
1158 data_head               : D_DATA tls id ASSIGN \r
1159                         | D_DATA tls\r
1160                         ;\r
1161 \r
1162 tls                     : /* EMPTY */\r
1163                         | K_TLS\r
1164                         ;\r
1165 \r
1166 data_body               : OPEN_BRACE dataitem_list CLOSE_BRACE\r
1167                         | dataitem\r
1168                         ;\r
1169 \r
1170 dataitem_list           : dataitem\r
1171                         | dataitem_list COMMA dataitem\r
1172                         ;\r
1173 \r
1174 dataitem                : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
1175                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
1176                         | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1177                           {\r
1178                                 $$ = new ByteArrConst ((byte[]) $4);\r
1179                           }\r
1180                         | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS\r
1181                           {\r
1182                                 // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
1183                                 $$ = new ByteArrConst ((byte[]) $4);\r
1184                           }\r
1185                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1186                           {\r
1187                                 FloatConst float_const = new FloatConst ((float) $3);\r
1188                                 $$ = new RepeatedConstant (float_const, (int) $5);\r
1189                           }\r
1190                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
1191                           {\r
1192                                 DoubleConst double_const = new DoubleConst ((double) $3);\r
1193                                 $$ = new RepeatedConstant (double_const, (int) $5);\r
1194                           }\r
1195                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
1196                           {\r
1197                                 IntConst int_const = new IntConst ((long) $3);\r
1198                                 $$ = new RepeatedConstant (int_const, (int) $5);\r
1199                           }\r
1200                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1201                           {\r
1202                                 IntConst int_const = new IntConst ((int) $3);\r
1203                                 $$ = new RepeatedConstant (int_const, (int) $5);\r
1204                           }\r
1205                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1206                           {\r
1207                                 IntConst int_const = new IntConst ((short) $3);\r
1208                                 $$ = new RepeatedConstant (int_const, (int) $5);\r
1209                           }\r
1210                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
1211                           {\r
1212                                 IntConst int_const = new IntConst ((sbyte) $3);\r
1213                                 $$ = new RepeatedConstant (int_const, (int) $5);\r
1214                           }\r
1215                         | K_FLOAT32 repeat_opt\r
1216                           {\r
1217                                 FloatConst float_const = new FloatConst (0F);\r
1218                                 $$ = new RepeatedConstant (float_const, (int) $2);\r
1219                           }\r
1220                         | K_FLOAT64 repeat_opt\r
1221                           {\r
1222                                 DoubleConst double_const = new DoubleConst (0);\r
1223                                 $$ = new RepeatedConstant (double_const, (int) $2);\r
1224                           }\r
1225                         | K_INT64 repeat_opt\r
1226                           {\r
1227                                 IntConst int_const = new IntConst ((long) 0);\r
1228                                 $$ = new RepeatedConstant (int_const, (int) $2);\r
1229                           }\r
1230                         | K_INT32 repeat_opt\r
1231                           {\r
1232                                 IntConst int_const = new IntConst ((int) 0);\r
1233                                 $$ = new RepeatedConstant (int_const, (int) $2);\r
1234                           }\r
1235                         | K_INT16 repeat_opt\r
1236                           {\r
1237                                 IntConst int_const = new IntConst ((short) 0);\r
1238                                 $$ = new RepeatedConstant (int_const, (int) $2);\r
1239                           }\r
1240                         | K_INT8 repeat_opt\r
1241                           {\r
1242                                 IntConst int_const = new IntConst ((sbyte) 0);\r
1243                                 $$ = new RepeatedConstant (int_const, (int) $2);\r
1244                           }\r
1245                         ;\r
1246 \r
1247 method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
1248                         ;\r
1249 \r
1250 method_head             : D_METHOD meth_attr call_conv param_attr type method_name\r
1251                           typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1252                         | D_METHOD meth_attr call_conv param_attr type \r
1253                           K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
1254                           OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
1255                         ;\r
1256 \r
1257 meth_attr               : /* EMPTY */\r
1258                         | meth_attr K_STATIC\r
1259                         | meth_attr K_PUBLIC\r
1260                         | meth_attr K_PRIVATE\r
1261                         | meth_attr K_FAMILY\r
1262                         | meth_attr K_ASSEMBLY\r
1263                         | meth_attr K_FAMANDASSEM\r
1264                         | meth_attr K_FAMORASSEM\r
1265                         | meth_attr K_PRIVATESCOPE\r
1266                         | meth_attr K_FINAL\r
1267                         | meth_attr K_VIRTUAL\r
1268                         | meth_attr K_ABSTRACT\r
1269                         | meth_attr K_HIDEBYSIG\r
1270                         | meth_attr K_NEWSLOT\r
1271                         | meth_attr K_REQSECOBJ\r
1272                         | meth_attr K_SPECIALNAME\r
1273                         | meth_attr K_RTSPECIALNAME\r
1274                         | meth_attr K_UNMANAGEDEXP\r
1275                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
1276                                 comp_qstring pinv_attr CLOSE_PARENS\r
1277                         | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
1278                         | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
1279                         ;\r
1280 \r
1281 pinv_attr               : /* EMPTY */\r
1282                         | pinv_attr K_NOMANGLE\r
1283                         | pinv_attr K_ANSI\r
1284                         | pinv_attr K_UNICODE\r
1285                         | pinv_attr K_AUTOCHAR\r
1286                         | pinv_attr K_LASTERR\r
1287                         | pinv_attr K_WINAPI\r
1288                         | pinv_attr K_CDECL\r
1289                         | pinv_attr K_STDCALL\r
1290                         | pinv_attr K_THISCALL\r
1291                         | pinv_attr K_FASTCALL\r
1292                         ;\r
1293 \r
1294 method_name             : D_CTOR\r
1295                         | D_CCTOR\r
1296                         | comp_name\r
1297                         ;\r
1298 \r
1299 param_attr              : /* EMPTY */\r
1300                         | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET\r
1301                         | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET\r
1302                         | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET\r
1303                         ;\r
1304 \r
1305 impl_attr               : /* EMPTY */\r
1306                         | impl_attr K_NATIVE\r
1307                         | impl_attr K_CIL\r
1308                         | impl_attr K_OPTIL\r
1309                         | impl_attr K_MANAGED\r
1310                         | impl_attr K_UNMANAGED\r
1311                         | impl_attr K_FORWARDREF\r
1312                         | impl_attr K_PRESERVESIG\r
1313                         | impl_attr K_RUNTIME\r
1314                         | impl_attr K_INTERNALCALL\r
1315                         | impl_attr K_SYNCHRONIZED\r
1316                         | impl_attr K_NOINLINING\r
1317                         ;\r
1318 \r
1319 sig_args                : /* EMPTY */\r
1320                         | sig_arg_list\r
1321                         ;\r
1322 \r
1323 sig_arg_list            : sig_arg\r
1324                         | sig_arg_list COMMA sig_arg\r
1325                         ;\r
1326 \r
1327 sig_arg                 : param_attr type\r
1328                         | param_attr type id\r
1329                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
1330                         | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
1331                         ;\r
1332 \r
1333 method_decls            : /* EMPTY */\r
1334                         | method_decls method_decl\r
1335                         ;\r
1336 \r
1337 method_decl             : D_EMITBYTE int32\r
1338                         | D_MAXSTACK int32\r
1339                         | D_LOCALS OPEN_PARENS sig_args CLOSE_PARENS\r
1340                         | D_LOCALS K_INIT OPEN_PARENS sig_args CLOSE_PARENS\r
1341                         | D_ENTRYPOINT\r
1342                         | D_ZEROINIT\r
1343                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
1344                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
1345                         | D_VTENTRY int32 COLON int32 \r
1346                         | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
1347                         | scope_block\r
1348                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
1349                         | id COLON\r
1350                         | seh_block\r
1351                         | instr\r
1352                         | sec_decl\r
1353                         | extsource_spec\r
1354                         | language_decl\r
1355                         | customattr_decl\r
1356                         | data_decl\r
1357                         ;\r
1358 \r
1359 type_spec               : class_ref\r
1360                         | OPEN_BRACKET comp_name CLOSE_BRACKET\r
1361                         | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET\r
1362                         | type\r
1363                         ;\r
1364 \r
1365 scope_block             : OPEN_BRACE method_decls CLOSE_BRACE\r
1366                         ;\r
1367 \r
1368 seh_block               : try_block seh_clauses\r
1369                         ;\r
1370 \r
1371 try_block               : D_TRY scope_block\r
1372                         | D_TRY id K_TO id\r
1373                         | D_TRY int32 K_TO int32\r
1374                         ;\r
1375 \r
1376 seh_clauses             : seh_clause\r
1377                         | seh_clauses seh_clause\r
1378                         ;\r
1379 \r
1380 seh_clause              : K_CATCH class_ref handler_block\r
1381                         | K_FINALLY handler_block\r
1382                         | K_FAULT handler_block\r
1383                         | filter_clause handler_block\r
1384                         ;\r
1385 \r
1386 filter_clause           : K_FILTER scope_block\r
1387                         | K_FILTER id\r
1388                         | K_FILTER int32\r
1389                         ;\r
1390 \r
1391 handler_block           : scope_block\r
1392                         | K_HANDLER id K_TO id\r
1393                         | K_HANDLER int32 K_TO int32\r
1394                         ;\r
1395 \r
1396 instr                   : INSTR_NONE\r
1397                         | INSTR_VAR int32\r
1398                         | INSTR_I int32\r
1399                         | INSTR_I id /* Allow variable names :p */\r
1400                         | INSTR_I8 int64\r
1401                         | INSTR_R float64\r
1402                         | INSTR_R int64\r
1403                         | INSTR_R OPEN_PARENS bytes CLOSE_PARENS\r
1404                         | INSTR_BRTARGET int32\r
1405                         | INSTR_BRTARGET id\r
1406                         | INSTR_METHOD method_ref\r
1407                         | INSTR_FIELD type type_spec DOUBLE_COLON id\r
1408                         | INSTR_FIELD type id\r
1409                         | INSTR_TYPE K_FIELD type type_spec DOUBLE_COLON id                     // ****** ADDED\r
1410                         | INSTR_TYPE K_FIELD type id                                            // ****** ADDED\r
1411                         | INSTR_TYPE type_spec\r
1412                         | INSTR_STRING comp_qstring\r
1413                         | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1414                         | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS               // ****** ADDED\r
1415                         | INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS\r
1416                         | INSTR_TOK owner_type\r
1417                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
1418                         ;\r
1419 \r
1420 method_ref              : call_conv type type_spec DOUBLE_COLON method_name \r
1421                           OPEN_PARENS sig_args CLOSE_PARENS\r
1422                         | call_conv type method_name \r
1423                           OPEN_PARENS sig_args CLOSE_PARENS\r
1424                         ;\r
1425 \r
1426 labels                  : /* EMPTY */\r
1427                         | id\r
1428                         | int32\r
1429                         | labels COMMA id\r
1430                         | labels COMMA int32\r
1431                         ;\r
1432 \r
1433 owner_type              : type_spec\r
1434                         | member_ref\r
1435                         ;\r
1436 \r
1437 member_ref              : K_METHOD member_ref\r
1438                         | K_FIELD type type_spec DOUBLE_COLON id\r
1439                         | K_FIELD type id\r
1440                         ;\r
1441 \r
1442 event_all               : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
1443                         ;\r
1444 \r
1445 event_head              : D_EVENT event_attr type_spec id\r
1446                         | D_EVENT event_attr id\r
1447                         ;\r
1448 \r
1449 event_attr              : /* EMPTY */\r
1450                         | event_attr K_RTSPECIALNAME\r
1451                         | event_attr K_SPECIALNAME\r
1452                         ;\r
1453 \r
1454 event_decls             : /* EMPTY */\r
1455                         | event_decls event_decl\r
1456                         ;\r
1457 \r
1458 event_decl              : D_ADDON method_ref\r
1459                         | D_REMOVEON method_ref\r
1460                         | D_FIRE method_ref\r
1461                         | D_OTHER method_ref\r
1462                         | customattr_decl\r
1463                         | extsource_spec\r
1464                         | language_decl\r
1465                         ;\r
1466 \r
1467 prop_all                : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
1468                         ;\r
1469 \r
1470 prop_head               : D_PROPERTY prop_attr type id OPEN_PARENS sig_args CLOSE_PARENS init_opt\r
1471                         ;\r
1472 \r
1473 prop_attr               : /* EMPTY */\r
1474                         | prop_attr K_RTSPECIALNAME\r
1475                         | prop_attr K_SPECIALNAME\r
1476                         ;\r
1477 \r
1478 prop_decls              : /* EMPTY */\r
1479                         | prop_decls prop_decl\r
1480                         ;\r
1481 \r
1482 prop_decl               : D_SET method_ref\r
1483                         | D_GET method_ref\r
1484                         | D_OTHER method_ref\r
1485                         | customattr_decl\r
1486                         | extsource_spec\r
1487                         | language_decl\r
1488                         ;\r
1489 \r
1490 customattr_decl         : D_CUSTOM custom_type\r
1491                         | D_CUSTOM custom_type ASSIGN comp_qstring\r
1492                         | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1493                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
1494                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
1495                         | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
1496                           OPEN_PARENS bytes CLOSE_PARENS\r
1497                         ;\r
1498                         \r
1499 custom_type             : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1500                         | call_conv type D_CTOR OPEN_PARENS sig_args CLOSE_PARENS\r
1501                         ;\r
1502 \r
1503 sec_decl                : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
1504                         | D_PERMISSION sec_action type_spec\r
1505                         | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1506                         ;\r
1507 \r
1508 nameval_pairs           : nameval_pair \r
1509                         | nameval_pairs COMMA nameval_pair\r
1510                         ;\r
1511 \r
1512 nameval_pair            : comp_qstring ASSIGN cavalue\r
1513                         ;\r
1514 \r
1515 cavalue                 : truefalse\r
1516                         | int32\r
1517                         | int32 OPEN_PARENS int32 CLOSE_PARENS\r
1518                         | comp_qstring \r
1519                         | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
1520                         | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
1521                         | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
1522                         | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
1523                         ;\r
1524 \r
1525 sec_action              : K_REQUEST\r
1526                         | K_DEMAND\r
1527                         | K_ASSERT\r
1528                         | K_DENY\r
1529                         | K_PERMITONLY\r
1530                         | K_LINKCHECK\r
1531                         | K_INHERITCHECK\r
1532                         | K_REQMIN\r
1533                         | K_REQOPT\r
1534                         | K_REQREFUSE\r
1535                         | K_PREJITGRANT\r
1536                         | K_PREJITDENY\r
1537                         | K_NONCASDEMAND\r
1538                         | K_NONCASLINKDEMAND\r
1539                         | K_NONCASINHERITANCE\r
1540                         ;\r
1541 \r
1542 module_head             : D_MODULE\r
1543                         | D_MODULE comp_name\r
1544                         | D_MODULE K_EXTERN comp_name\r
1545                         ;\r
1546 \r
1547 file_decl               : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
1548                           OPEN_PARENS bytes CLOSE_PARENS file_entry\r
1549                         | D_FILE file_attr comp_name file_entry\r
1550                         ;\r
1551 \r
1552 file_attr               : /* EMPTY */\r
1553                         | file_attr K_NOMETADATA\r
1554                         ;\r
1555 \r
1556 file_entry              : /* EMPTY */\r
1557                         | D_ENTRYPOINT\r
1558                         ;\r
1559 \r
1560 assembly_all            : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
1561                         ;\r
1562 \r
1563 assembly_head           : D_ASSEMBLY asm_attr comp_name\r
1564                         ;\r
1565 \r
1566 asm_attr                : /* EMPTY */\r
1567                         | asm_attr K_NOAPPDOMAIN\r
1568                         | asm_attr K_NOPROCESS\r
1569                         | asm_attr K_NOMACHINE\r
1570                         ;\r
1571 \r
1572 assembly_decls          : /* EMPTY */\r
1573                         | assembly_decls assembly_decl\r
1574                         ;\r
1575 \r
1576 assembly_decl           : D_HASH K_ALGORITHM int32\r
1577                         | sec_decl\r
1578                         | asm_or_ref_decl\r
1579                         ;\r
1580 \r
1581 asm_or_ref_decl         : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1582                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
1583                         | D_LOCALE comp_qstring\r
1584                         | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1585                         | customattr_decl\r
1586                         ;\r
1587 \r
1588 assemblyref_all         : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
1589                         ;\r
1590 \r
1591 assemblyref_head        : D_ASSEMBLY K_EXTERN comp_name\r
1592                           {\r
1593                                 System.Reflection.AssemblyName asmb_name = \r
1594                                         new System.Reflection.AssemblyName ();\r
1595                                 asmb_name.Name = (string) $3;\r
1596                                 codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
1597                           }\r
1598                         | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name\r
1599                           {\r
1600                                 System.Reflection.AssemblyName asmb_name = \r
1601                                         new System.Reflection.AssemblyName ();\r
1602                                 asmb_name.Name = (string) $3;\r
1603                                 codegen.ExternTable.AddAssembly ((string) $5, asmb_name);\r
1604                           }\r
1605                         ;\r
1606 \r
1607 assemblyref_decls       : /* EMPTY */\r
1608                         | assemblyref_decls assemblyref_decl\r
1609                         ;\r
1610 \r
1611 assemblyref_decl        : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1612                         | asm_or_ref_decl\r
1613                         | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS\r
1614                         ;\r
1615 \r
1616 exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
1617                         ;\r
1618 \r
1619 exptype_head            : D_CLASS K_EXTERN expt_attr comp_name\r
1620                         ;\r
1621 \r
1622 expt_attr               : /* EMPTY */\r
1623                         | expt_attr K_PRIVATE\r
1624                         | expt_attr K_PUBLIC \r
1625                         | expt_attr K_NESTED K_PUBLIC\r
1626                         | expt_attr K_NESTED K_PRIVATE\r
1627                         | expt_attr K_NESTED K_FAMILY\r
1628                         | expt_attr K_NESTED K_ASSEMBLY\r
1629                         | expt_attr K_NESTED K_FAMANDASSEM\r
1630                         | expt_attr K_NESTED K_FAMORASSEM\r
1631                         ;\r
1632 \r
1633 exptype_decls           : /* EMPTY */\r
1634                         | exptype_decls exptype_decl\r
1635                         ;\r
1636 \r
1637 exptype_decl            : D_FILE comp_name\r
1638                         | D_CLASS K_EXTERN comp_name\r
1639                         | D_CLASS int32\r
1640                         | customattr_decl\r
1641                         ;\r
1642 \r
1643 manifestres_all         : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
1644                         ;\r
1645 \r
1646 manifestres_head        : D_MRESOURCE manres_attr comp_name     \r
1647                         ;\r
1648 \r
1649 manres_attr             : /* EMPTY */\r
1650                         | manres_attr K_PUBLIC\r
1651                         | manres_attr K_PRIVATE\r
1652                         ;\r
1653 \r
1654 manifestres_decls       : /* EMPTY */\r
1655                         | manifestres_decls manifestres_decl\r
1656                         ;\r
1657 \r
1658 manifestres_decl        : D_FILE comp_name K_AT int32\r
1659                         | D_ASSEMBLY K_EXTERN comp_name\r
1660                         | customattr_decl\r
1661                         ;\r
1662 \r
1663 dotted_name             : id\r
1664                         | dotted_name DOT id    { $$ = String.Format ("{0}.{1}", $1, $3); }\r
1665                         ;\r
1666 \r
1667 comp_qstring            : QSTRING\r
1668                         | comp_qstring PLUS QSTRING     { $$ = String.Format ("{0}{1}", $1, $3); }\r
1669                         ;\r
1670 \r
1671 int32                   : INT32\r
1672                         | INT64\r
1673                         ;\r
1674 \r
1675 int64                   : INT32\r
1676                         | INT64\r
1677                         ;\r
1678 \r
1679 float64                 : FLOAT64\r
1680                         | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS\r
1681                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
1682                         ;\r
1683 \r
1684 hexbyte                 : HEXBYTE\r
1685                         | INT32                                 // ******** ADDED\r
1686                         | ID                                    // ******** ADDED\r
1687                         ;\r
1688 \r
1689 bytes                   : /* EMPTY */\r
1690                         | hexbytes\r
1691                         ;\r
1692 \r
1693 hexbytes                : hexbyte\r
1694                         | hexbytes hexbyte\r
1695                         ;\r
1696 \r
1697 truefalse               : K_TRUE\r
1698                         | K_FALSE\r
1699                         ;\r
1700 \r
1701 id                      : ID\r
1702                         | SQSTRING\r
1703                         ;\r
1704 \r
1705 comp_name               : id\r
1706                         | dotted_name\r
1707                         ;\r
1708 \r
1709 dotted_name             : id\r
1710                         | dotted_name DOT id\r
1711                         ;\r
1712 \r
1713 \r
1714 %%\r
1715 \r
1716 }\r
1717 \r