* ILParser.jay: Create external method references
[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 \r
47 \r
48 /* Punctuation */\r
49 %token DOT           "."\r
50 %token OPEN_BRACE    "{"\r
51 %token CLOSE_BRACE   "}"\r
52 %token OPEN_BRACKET  "["\r
53 %token CLOSE_BRACKET "]"\r
54 %token OPEN_PARENS   "("\r
55 %token CLOSE_PARENS  ")"\r
56 %token COMMA         ","\r
57 %token COLON         ":"\r
58 %token DOUBLE_COLON  "::"\r
59 %token SEMICOLON     ";"\r
60 %token ASSIGN        "="\r
61 %token STAR          "*"\r
62 %token AMPERSAND     "&"\r
63 %token PLUS          "+"\r
64 %token SLASH         "/"\r
65 %token BANG          "!"\r
66 %token ELLIPSIS      "..."\r
67 %token DASH          "-"\r
68 \r
69 \r
70 \r
71 \r
72 %token UNKNOWN\r
73 \r
74 \r
75 /* INSTR_* instruction types */\r
76 %token INSTR_NONE\r
77 %token INSTR_VAR\r
78 %token INSTR_I\r
79 %token INSTR_I8\r
80 %token INSTR_R\r
81 %token INSTR_BRTARGET\r
82 %token INSTR_METHOD\r
83 %token INSTR_NEWOBJ\r
84 %token INSTR_FIELD\r
85 %token INSTR_TYPE\r
86 %token INSTR_STRING\r
87 %token INSTR_SIG\r
88 %token INSTR_RVA\r
89 %token INSTR_TOK\r
90 %token INSTR_SWITCH\r
91 %token INSTR_PHI\r
92 \r
93 \r
94 \r
95 \r
96 \r
97 \r
98 \r
99 /* Mechanically generated  - DO NOT EDIT! */\r
100 \r
101 \r
102 /* Directives */\r
103 %token D_ADDON\r
104 %token D_ALGORITHM\r
105 %token D_ASSEMBLY\r
106 %token D_BACKING\r
107 %token D_BLOB\r
108 %token D_CAPABILITY\r
109 %token D_CCTOR\r
110 %token D_CLASS\r
111 %token D_COMTYPE\r
112 %token D_CONFIG\r
113 %token D_CORFLAGS\r
114 %token D_CTOR\r
115 %token D_CUSTOM\r
116 %token D_DATA\r
117 %token D_EMITBYTE\r
118 %token D_ENTRYPOINT\r
119 %token D_EVENT\r
120 %token D_EXELOC\r
121 %token D_EXPORT\r
122 %token D_FIELD\r
123 %token D_FILE\r
124 %token D_FIRE\r
125 %token D_GET\r
126 %token D_HASH\r
127 %token D_IMPLICITCOM\r
128 %token D_LANGUAGE\r
129 %token D_LINE\r
130 %token D_XLINE\r
131 %token D_LOCALE\r
132 %token D_LOCALS\r
133 %token D_MANIFESTRES\r
134 %token D_MAXSTACK\r
135 %token D_METHOD\r
136 %token D_MIME\r
137 %token D_MODULE\r
138 %token D_MRESOURCE\r
139 %token D_NAMESPACE\r
140 %token D_ORIGINATOR\r
141 %token D_OS\r
142 %token D_OTHER\r
143 %token D_OVERRIDE\r
144 %token D_PACK\r
145 %token D_PARAM\r
146 %token D_PERMISSION\r
147 %token D_PERMISSIONSET\r
148 %token D_PROCESSOR\r
149 %token D_PROPERTY\r
150 %token D_PUBLICKEY\r
151 %token D_PUBLICKEYTOKEN\r
152 %token D_REMOVEON\r
153 %token D_SET\r
154 %token D_SIZE\r
155 %token D_SUBSYSTEM\r
156 %token D_TITLE\r
157 %token D_TRY\r
158 %token D_VER\r
159 %token D_VTABLE\r
160 %token D_VTENTRY\r
161 %token D_VTFIXUP\r
162 %token D_ZEROINIT\r
163 \r
164 \r
165 /* Keywords */\r
166 %token K_AT\r
167 %token K_AS\r
168 %token K_IMPLICITCOM\r
169 %token K_IMPLICITRES\r
170 %token K_NOAPPDOMAIN\r
171 %token K_NOPROCESS\r
172 %token K_NOMACHINE\r
173 %token K_EXTERN\r
174 %token K_INSTANCE\r
175 %token K_EXPLICIT\r
176 %token K_DEFAULT\r
177 %token K_VARARG\r
178 %token K_UNMANAGED\r
179 %token K_CDECL\r
180 %token K_STDCALL\r
181 %token K_THISCALL\r
182 %token K_FASTCALL\r
183 %token K_MARSHAL\r
184 %token K_IN\r
185 %token K_OUT\r
186 %token K_OPT\r
187 %token K_LCID\r
188 %token K_RETVAL\r
189 %token K_STATIC\r
190 %token K_PUBLIC\r
191 %token K_PRIVATE\r
192 %token K_FAMILY\r
193 %token K_INITONLY\r
194 %token K_RTSPECIALNAME\r
195 %token K_SPECIALNAME\r
196 %token K_ASSEMBLY\r
197 %token K_FAMANDASSEM\r
198 %token K_FAMORASSEM\r
199 %token K_PRIVATESCOPE\r
200 %token K_LITERAL\r
201 %token K_NOTSERIALIZED\r
202 %token K_VALUE\r
203 %token K_NOT_IN_GC_HEAP\r
204 %token K_INTERFACE\r
205 %token K_SEALED\r
206 %token K_ABSTRACT\r
207 %token K_AUTO\r
208 %token K_SEQUENTIAL\r
209 %token K_ANSI\r
210 %token K_UNICODE\r
211 %token K_AUTOCHAR\r
212 %token K_IMPORT\r
213 %token K_SERIALIZABLE\r
214 %token K_NESTED\r
215 %token K_LATEINIT\r
216 %token K_EXTENDS\r
217 %token K_IMPLEMENTS\r
218 %token K_FINAL\r
219 %token K_VIRTUAL\r
220 %token K_HIDEBYSIG\r
221 %token K_NEWSLOT\r
222 %token K_UNMANAGEDEXP\r
223 %token K_PINVOKEIMPL\r
224 %token K_NOMANGLE\r
225 %token K_OLE\r
226 %token K_LASTERR\r
227 %token K_WINAPI\r
228 %token K_NATIVE\r
229 %token K_IL\r
230 %token K_CIL\r
231 %token K_OPTIL\r
232 %token K_MANAGED\r
233 %token K_FORWARDREF\r
234 %token K_RUNTIME\r
235 %token K_INTERNALCALL\r
236 %token K_SYNCHRONIZED\r
237 %token K_NOINLINING\r
238 %token K_CUSTOM\r
239 %token K_FIXED\r
240 %token K_SYSSTRING\r
241 %token K_ARRAY\r
242 %token K_VARIANT\r
243 %token K_CURRENCY\r
244 %token K_SYSCHAR\r
245 %token K_VOID\r
246 %token K_BOOL\r
247 %token K_INT8\r
248 %token K_INT16\r
249 %token K_INT32\r
250 %token K_INT64\r
251 %token K_FLOAT32\r
252 %token K_FLOAT64\r
253 %token K_ERROR\r
254 %token K_UNSIGNED\r
255 %token K_DECIMAL\r
256 %token K_DATE\r
257 %token K_BSTR\r
258 %token K_LPSTR\r
259 %token K_LPWSTR\r
260 %token K_LPTSTR\r
261 %token K_OBJECTREF\r
262 %token K_IUNKNOWN\r
263 %token K_IDISPATCH\r
264 %token K_STRUCT\r
265 %token K_SAFEARRAY\r
266 %token K_INT\r
267 %token K_BYVALSTR\r
268 %token K_TBSTR\r
269 %token K_LPVOID\r
270 %token K_ANY\r
271 %token K_FLOAT\r
272 %token K_LPSTRUCT\r
273 %token K_NULL\r
274 %token K_PTR\r
275 %token K_VECTOR\r
276 %token K_HRESULT\r
277 %token K_CARRAY\r
278 %token K_USERDEFINED\r
279 %token K_RECORD\r
280 %token K_FILETIME\r
281 %token K_BLOB\r
282 %token K_STREAM\r
283 %token K_STORAGE\r
284 %token K_STREAMED_OBJECT\r
285 %token K_STORED_OBJECT\r
286 %token K_BLOB_OBJECT\r
287 %token K_CF\r
288 %token K_CLSID\r
289 %token K_METHOD\r
290 %token K_CLASS\r
291 %token K_PINNED\r
292 %token K_MODREQ\r
293 %token K_MODOPT\r
294 %token K_TYPEDREF\r
295 %token K_WCHAR\r
296 %token K_CHAR\r
297 %token K_FROMUNMANAGED\r
298 %token K_CALLMOSTDERIVED\r
299 %token K_BYTEARRAY\r
300 %token K_WITH\r
301 %token K_INIT\r
302 %token K_TO\r
303 %token K_CATCH\r
304 %token K_FILTER\r
305 %token K_FINALLY\r
306 %token K_FAULT\r
307 %token K_HANDLER\r
308 %token K_TLS\r
309 %token K_FIELD\r
310 %token K_REQUEST\r
311 %token K_DEMAND\r
312 %token K_ASSERT\r
313 %token K_DENY\r
314 %token K_PERMITONLY\r
315 %token K_LINKCHECK\r
316 %token K_INHERITCHECK\r
317 %token K_REQMIN\r
318 %token K_REQOPT\r
319 %token K_REQREFUSE\r
320 %token K_PREJITGRANT\r
321 %token K_PREJITDENY\r
322 %token K_NONCASDEMAND\r
323 %token K_NONCASLINKDEMAND\r
324 %token K_NONCASINHERITANCE\r
325 %token K_READONLY\r
326 %token K_NOMETADATA\r
327 %token K_ALGORITHM\r
328 %token K_FULLORIGIN\r
329 %token K_NAN\r
330 %token K_INF\r
331 %token K_PUBLICKEY\r
332 %token K_ENABLEJITTRACKING\r
333 %token K_DISABLEJITOPTIMIZER\r
334 %token K_PRESERVESIG\r
335 %token K_BEFOREFIELDINIT\r
336 %token K_ALIGNMENT\r
337 %token K_NULLREF\r
338 %token K_VALUETYPE\r
339 %token K_COMPILERCONTROLLED\r
340 %token K_REQSECOBJ\r
341 %token K_ENUM\r
342 %token K_OBJECT\r
343 %token K_STRING\r
344 %token K_TRUE\r
345 %token K_FALSE\r
346 \r
347 /* end generated */\r
348 \r
349 \r
350 \r
351 \r
352 \r
353 %start il_file\r
354 \r
355 %%\r
356 \r
357 il_file                 : decls\r
358                         ;      \r
359 \r
360 decls                   : /* EMPTY */\r
361                         | decls decl                                            \r
362                         ;\r
363 \r
364 decl                    : classAll\r
365                         | nameSpaceHead OPEN_BRACE decls CLOSE_BRACE { codegen.CurrentNameSpace = String.Empty; }\r
366                         | methodAll\r
367                         | fieldDecl\r
368                         | dataDecl\r
369                         | vtableDecl\r
370                         | vtfixupDecl\r
371                         | extSourceSpec\r
372                         | fileDecl\r
373                         | assemblyHead OPEN_BRACE assemblyDecls CLOSE_BRACE \r
374                         | assemblyRefHead OPEN_BRACE assemblyRefDecls CLOSE_BRACE \r
375                         | comtypeHead OPEN_BRACE comtypeDecls CLOSE_BRACE \r
376                         | manifestResHead OPEN_BRACE manifestResDecls CLOSE_BRACE \r
377                         | moduleHead\r
378                         | secDecl\r
379                         | customAttrDecl\r
380                         | D_SUBSYSTEM int32     \r
381                         | D_CORFLAGS int32      \r
382                         | D_FILE K_ALIGNMENT int32      \r
383                         | languageDecl\r
384                         ;\r
385 \r
386 compQstring             : QSTRING \r
387                         | compQstring PLUS QSTRING {$$ = ($1 as string) + ($3 as string);}\r
388                         ;\r
389 \r
390 languageDecl            : D_LANGUAGE SQSTRING   \r
391                         | D_LANGUAGE SQSTRING COMMA SQSTRING    \r
392                         | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING     \r
393                         ;\r
394 \r
395 customAttrDecl          : D_CUSTOM customType \r
396                         | D_CUSTOM customType ASSIGN compQstring \r
397                         | customHead bytes CLOSE_PARENS \r
398                         | D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType \r
399                         | D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN compQstring \r
400                         | customHeadWithOwner bytes CLOSE_PARENS \r
401                         ;\r
402 \r
403 moduleHead              : D_MODULE \r
404                         | D_MODULE name1 \r
405                         | D_MODULE K_EXTERN name1       \r
406                         ;\r
407 \r
408 vtfixupDecl             : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET vtfixupAttr K_AT id \r
409                         ;\r
410 \r
411 vtfixupAttr             : /* EMPTY */ \r
412                         | vtfixupAttr K_INT32 \r
413                         | vtfixupAttr K_INT64 \r
414                         | vtfixupAttr K_FROMUNMANAGED \r
415                         | vtfixupAttr K_CALLMOSTDERIVED \r
416                         ;\r
417 \r
418 vtableDecl              : vtableHead bytes CLOSE_PARENS \r
419                         ;\r
420 \r
421 vtableHead              : D_VTABLE ASSIGN OPEN_PARENS \r
422                         ;\r
423 \r
424 nameSpaceHead           : D_NAMESPACE name1 \r
425                         {\r
426                                 codegen.CurrentNameSpace = (string) $2;\r
427                         }\r
428                         ;\r
429 \r
430 classHead               : D_CLASS type_attr id extendsClause implClause\r
431                         {\r
432                                 if ($4 != null) {\r
433                                         codegen.AddClass ((TypeAttr) $2, (string) $3, \r
434                                                 ((TypeRef)$4).Type as Class, null);\r
435                                 } else {\r
436                                         codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
437                                 }\r
438                                 \r
439                                 ArrayList impl_list = (ArrayList) $5;\r
440                                 if (impl_list != null) {\r
441                                         foreach (TypeRef type_ref in impl_list)\r
442                                                 codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
443                                 }\r
444                         }\r
445                         ;\r
446 \r
447 type_attr               : /* EMPTY */                           { $$ = new TypeAttr (); }\r
448                         | type_attr K_PUBLIC                    { $$ = (TypeAttr)$1 | TypeAttr.Public; }\r
449                         | type_attr K_PRIVATE                   { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
450                         | type_attr K_INTERFACE                 { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
451                         | type_attr K_SEALED                    { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
452                         | type_attr K_ABSTRACT                  { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
453                         | type_attr K_AUTO                      { /* */ }\r
454                         | type_attr K_SEQUENTIAL                { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
455                         | type_attr K_EXPLICIT                  { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
456                         | type_attr K_ANSI                      { /*  */ }\r
457                         | type_attr K_UNICODE                   { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
458                         | type_attr K_AUTOCHAR                  { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
459                         | type_attr K_IMPORT                    { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
460                         | type_attr K_SERIALIZABLE              { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
461                         | type_attr K_NESTED K_PUBLIC           { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
462                         | type_attr K_NESTED K_PRIVATE          { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
463                         | type_attr K_NESTED K_FAMILY           { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
464                         | type_attr K_NESTED K_ASSEMBLY         { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly; }\r
465                         | type_attr K_NESTED K_FAMANDASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
466                         | type_attr K_NESTED K_FAMORASSEM       { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
467                         | type_attr K_BEFOREFIELDINIT           { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
468                         | type_attr K_SPECIALNAME               { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
469                         | type_attr K_RTSPECIALNAME             { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
470                         ;\r
471 \r
472 classAttr               : /* EMPTY */ \r
473                         | classAttr K_PUBLIC                    { /* currentTypeAttrs |= TypeAttributes.Public; */}\r
474                         | classAttr K_PRIVATE                   { /* currentTypeAttrs &= ~TypeAttributes.Public; */}\r
475                         | classAttr K_VALUE                     { /* FIXME */ }\r
476                         | classAttr K_ENUM                      { /* FIXME */ }\r
477                         | classAttr K_INTERFACE                 { /* currentTypeAttrs |= TypeAttributes.Interface; */ }\r
478                         | classAttr K_SEALED                    { /* currentTypeAttrs |= TypeAttributes.Sealed; */ }\r
479                         | classAttr K_ABSTRACT                  { /* currentTypeAttrs |= TypeAttributes.Abstract; */ }\r
480                         | classAttr K_AUTO                      { /* currentTypeAttrs |= TypeAttributes.AutoLayout; */ }\r
481                         | classAttr K_SEQUENTIAL                { /* currentTypeAttrs |= TypeAttributes.SequentialLayout; */ }\r
482                         | classAttr K_EXPLICIT                  { /* currentTypeAttrs |= TypeAttributes.ExplicitLayout; */ }\r
483                         | classAttr K_ANSI                      { /* currentTypeAttrs |= TypeAttributes.AnsiClass; */ }\r
484                         | classAttr K_UNICODE                   { /* currentTypeAttrs |= TypeAttributes.UnicodeClass; */ }\r
485                         | classAttr K_AUTOCHAR                  { /* currentTypeAttrs |= TypeAttributes.AutoClass; */ }\r
486                         | classAttr K_IMPORT                    { /* currentTypeAttrs |= TypeAttributes.Import; */ }\r
487                         | classAttr K_SERIALIZABLE              { /* currentTypeAttrs |= TypeAttributes.Serializable; */ }\r
488                         | classAttr K_NESTED K_PUBLIC           { /* currentTypeAttrs |= TypeAttributes.NestedPublic; */ }\r
489                         | classAttr K_NESTED K_PRIVATE          { /* currentTypeAttrs |= TypeAttributes.NestedPrivate; */ }\r
490                         | classAttr K_NESTED K_FAMILY           { /* currentTypeAttrs |= TypeAttributes.NestedFamily; */ }\r
491                         | classAttr K_NESTED K_ASSEMBLY         { /* currentTypeAttrs |= TypeAttributes.NestedAssembly; */ }\r
492                         | classAttr K_NESTED K_FAMANDASSEM      { /* currentTypeAttrs |= TypeAttributes.NestedFamANDAssem; */ }\r
493                         | classAttr K_NESTED K_FAMORASSEM       { /* currentTypeAttrs |= TypeAttributes.NestedFamORAssem; */ }\r
494                         | classAttr K_BEFOREFIELDINIT           { /* currentTypeAttrs |= TypeAttributes.BeforeFieldInit; */ }\r
495                         | classAttr K_SPECIALNAME               { /* currentTypeAttrs |= TypeAttributes.SpecialName; */ }\r
496                         | classAttr K_RTSPECIALNAME             { /* currentTypeAttrs |= TypeAttributes.RTSpecialName; */ }\r
497                         ;\r
498 \r
499 extendsClause           : /* EMPTY */                                           \r
500                         | K_EXTENDS class_ref   {$$ = $2;}\r
501                         ;\r
502 \r
503 implClause              : /* EMPTY */\r
504                         | K_IMPLEMENTS classNames       {$$ = $2; }\r
505                         ;\r
506 \r
507 classNames              : classNames COMMA class_ref\r
508                           {\r
509                                 ArrayList class_list = (ArrayList) $1;\r
510                                 class_list.Add ($3);\r
511                           }\r
512                         | class_ref\r
513                           {\r
514                                 ArrayList class_list = new ArrayList ();\r
515                                 class_list.Add ($1);\r
516                                 $$ = class_list;\r
517                           }\r
518                         ;\r
519 \r
520 classDecls              : /* EMPTY */\r
521                         | classDecls classDecl\r
522                         ;\r
523 \r
524 \r
525 classAll                : classHead OPEN_BRACE classDecls CLOSE_BRACE\r
526                         {\r
527                                 /*\r
528                                 codegen.AddClass (currentClass);\r
529                                 currentClass = null;\r
530                                 */\r
531                         }\r
532                         ;\r
533 \r
534 \r
535 classDecl               : methodAll\r
536                         | classAll\r
537                         | eventHead OPEN_BRACE eventDecls CLOSE_BRACE \r
538                         | propHead OPEN_BRACE propDecls CLOSE_BRACE \r
539                         | fieldDecl\r
540                         | dataDecl\r
541                         | secDecl\r
542                         | extSourceSpec\r
543                         | customAttrDecl\r
544                         | D_SIZE int32 \r
545                         | D_PACK int32 \r
546                         | exportHead OPEN_BRACE comtypeDecls CLOSE_BRACE \r
547                         | D_OVERRIDE typeSpec DOUBLE_COLON methodName K_WITH callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
548                         | languageDecl\r
549                         ;\r
550 \r
551 fieldDecl               : D_FIELD repeatOpt fieldAttr type_ref id atOpt initOpt \r
552                           {\r
553                                 codegen.CurrentClass.AddField ((FieldAttr) $3, \r
554                                         (string) $5, ((TypeRef) $4).Type);\r
555                           }\r
556                         ;\r
557 \r
558 type_ref                : primative_type_ref\r
559                         | internal_type_ref\r
560                         | external_type_ref\r
561                         ;\r
562 \r
563 class_ref               : internal_type_ref\r
564                         | external_type_ref\r
565                         ;\r
566 \r
567 primative_type_ref      : K_CHAR                \r
568                           {$$ = new TypeRef (PrimitiveType.Char, "System.Char"); }\r
569                         | K_VOID                \r
570                           {$$ = new TypeRef (PrimitiveType.Void, "System.Void"); }\r
571                         | K_BOOL                \r
572                           {$$ = new TypeRef (PrimitiveType.Boolean, "System.Bool"); }\r
573                         | K_INT8                \r
574                           {$$ = new TypeRef (PrimitiveType.Int8, "System.Int8"); }\r
575                         | K_INT16               \r
576                           {$$ = new TypeRef (PrimitiveType.Int16, "System.Int16"); }\r
577                         | K_INT32               \r
578                           {$$ = new TypeRef (PrimitiveType.Int32, "System.Int32"); }\r
579                         | K_INT64               \r
580                           {$$ = new TypeRef (PrimitiveType.Int64, "System.Int64"); }\r
581                         | K_FLOAT32             \r
582                           {$$ = new TypeRef (PrimitiveType.Float32, "System.Float32"); }\r
583                         | K_FLOAT64             \r
584                           {$$ = new TypeRef (PrimitiveType.Float64, "System.Float64"); }\r
585                         | K_UNSIGNED K_INT8     \r
586                           {$$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8"); }\r
587                         | K_UNSIGNED K_INT16    \r
588                           {$$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16"); }\r
589                         | K_UNSIGNED K_INT32    \r
590                           {$$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32"); }\r
591                         | K_UNSIGNED K_INT64    \r
592                           {$$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64"); }\r
593                         | K_STRING              \r
594                           {$$ = new TypeRef (PrimitiveType.String, "System.String"); }\r
595                         ;\r
596 \r
597 internal_type_ref       : name1\r
598                           {\r
599                                 $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),\r
600                                         (string) $1);\r
601                           }\r
602                         ;\r
603 \r
604 external_type_ref       : assembly_name namespace_name DOT id\r
605                           {\r
606                                 $$ = new TypeRef (codegen.ExternTable.GetClass ($1 as string, \r
607                                         $2 as string, $4 as string), String.Format ("{0}.{1}", $2, $4));\r
608                           }\r
609                         ;\r
610 \r
611 namespace_name          : /* EMPTY */\r
612                         | id\r
613                         | namespace_name DOT id {$$ = String.Format ("{0}.{1}", $1, $3); }\r
614                         ;\r
615 \r
616 atOpt                   : /* EMPTY */  \r
617                         | K_AT id \r
618                         ;\r
619 \r
620 initOpt                 : /* EMPTY */ \r
621                         | ASSIGN fieldInit \r
622                         ;\r
623 \r
624 repeatOpt               : /* EMPTY */ \r
625                         | OPEN_BRACKET int32 CLOSE_BRACKET \r
626                         ;\r
627 \r
628 customHead              : D_CUSTOM customType ASSIGN OPEN_PARENS \r
629                         ;\r
630 \r
631 customHeadWithOwner     : D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN OPEN_PARENS \r
632                         ;\r
633 \r
634 customType              : typeSpec \r
635                         | callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
636                         | callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
637                         ;\r
638 \r
639 eventHead               : D_EVENT eventAttr typeSpec id \r
640                         | D_EVENT eventAttr id \r
641                         ;\r
642 \r
643 \r
644 eventAttr               : /* EMPTY */ \r
645                         | eventAttr K_RTSPECIALNAME /**/\r
646                         | eventAttr K_SPECIALNAME \r
647                         ;\r
648 \r
649 eventDecls              : /* EMPTY */\r
650                         | eventDecls eventDecl\r
651                         ;\r
652 \r
653 eventDecl               : D_ADDON callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
654                         | D_ADDON callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
655                         | D_REMOVEON callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
656                         | D_REMOVEON callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
657                         | D_FIRE callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
658                         | D_FIRE callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
659                         | D_OTHER callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
660                         | D_OTHER callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
661                         | extSourceSpec\r
662                         | customAttrDecl\r
663                         | languageDecl\r
664                         ;\r
665 \r
666 propHead                : D_PROPERTY propAttr callConv type id OPEN_PARENS sigArgs0 CLOSE_PARENS initOpt \r
667                         ;\r
668 \r
669 propAttr                : /* EMPTY */ \r
670                         | propAttr K_RTSPECIALNAME /**/\r
671                         | propAttr K_SPECIALNAME \r
672                         ;\r
673 \r
674 propDecls               : /* EMPTY */\r
675                         | propDecls propDecl\r
676                         ;\r
677 \r
678 \r
679 propDecl                : D_SET callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
680                         | D_SET callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
681                         | D_GET callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
682                         | D_GET callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
683                         | D_OTHER callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
684                         | D_OTHER callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
685                         | customAttrDecl\r
686                         | extSourceSpec\r
687                         | languageDecl\r
688                         ;\r
689 \r
690 method_ref              : internal_method_ref\r
691                         | external_method_ref\r
692                         ;\r
693 \r
694 external_method_ref     : type_ref external_type_ref DOUBLE_COLON name1 OPEN_PARENS arg_list CLOSE_PARENS\r
695                           {\r
696                                 TypeRef parent = (TypeRef) $1;\r
697                                 TypeRef extern_type = (TypeRef) $2;\r
698                                 ClassRef class_ref = (ClassRef) extern_type.Type;\r
699                                 PEAPI.Type[] type_array;\r
700                                 if ($6 != null) {\r
701                                         ArrayList param_list = $6 as ArrayList;\r
702                                         int index = 0;\r
703                                         type_array = new PEAPI.Type[param_list.Count];\r
704                                         foreach (DictionaryEntry entry in param_list) {\r
705                                                 type_array[index] = ((TypeRef)entry.Value).Type;\r
706                                                 index++;\r
707                                         }\r
708                                 } else {\r
709                                         type_array = new PEAPI.Type[0];\r
710                                 }       \r
711                                 $$ = class_ref.AddMethod ((string) $4, parent.Type, type_array);\r
712                           }\r
713                         ;  \r
714 \r
715 internal_method_ref     : type_ref internal_type_ref DOUBLE_COLON name1 OPEN_PARENS arg_list CLOSE_PARENS\r
716                           {     \r
717                                 TypeRef parent, return_type;\r
718                                 parent = (TypeRef) $2;\r
719                                 return_type = (TypeRef) $1;\r
720 \r
721                                 Param[] param_array;\r
722                                 TypeRef[] typeref_array;\r
723                                 if ($6 != null) {\r
724                                         ArrayList param_list = $6 as ArrayList;\r
725                                         int index = 0;\r
726                                         param_array = new Param[param_list.Count];\r
727                                         typeref_array = new TypeRef[param_list.Count];\r
728                                         foreach (DictionaryEntry entry in param_list) {\r
729                                                 param_array[index] = entry.Key as Param;\r
730                                                 typeref_array[index] = entry.Value as TypeRef;\r
731                                                 index++;\r
732                                         }\r
733                                 } else {\r
734                                         param_array = new Param[0];\r
735                                         typeref_array = new TypeRef[0];\r
736                                 }\r
737                         \r
738                                 $$ = codegen.GetMethodRef (parent, (string) $4, return_type, param_array, \r
739                                         typeref_array, null);\r
740                           }\r
741                         ;                       \r
742 \r
743 \r
744 methodHead              : D_METHOD methAttr callConv type_ref methodName \r
745                                 OPEN_PARENS arg_list CLOSE_PARENS implAttr OPEN_BRACE \r
746                         {\r
747                                 Param[] param_array;\r
748                                 TypeRef[] typeref_array;\r
749                                 if ($7 != null) {\r
750                                         ArrayList param_list = $7 as ArrayList;\r
751                                         int index = 0;\r
752                                         param_array = new Param[param_list.Count];\r
753                                         typeref_array = new TypeRef[param_list.Count];\r
754                                         foreach (DictionaryEntry entry in param_list) {\r
755                                                 param_array[index] = entry.Key as Param;\r
756                                                 typeref_array[index] = entry.Value as TypeRef;\r
757                                                 index++;\r
758                                         }\r
759                                 } else {\r
760                                         param_array = new Param[0];\r
761                                         typeref_array = new TypeRef[0];\r
762                                 }\r
763                                 \r
764                                 codegen.AddMethod ((MethAttr) $2, (ImplAttr) $9, (CallConv) $3, (string) $5, \r
765                                         (TypeRef) $4, param_array, typeref_array, null);\r
766                         }\r
767                         | D_METHOD methAttr callConv paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS methodName OPEN_PARENS sigArgs0 CLOSE_PARENS implAttr OPEN_BRACE\r
768                         ;\r
769 \r
770 \r
771 methodAll               : methodHead methodDecls CLOSE_BRACE\r
772                         {\r
773                                 /*\r
774                                 // Console.WriteLine (method);\r
775                                 currentClass.AddMethod (method);\r
776                                 */\r
777                         }\r
778                         ;\r
779 \r
780 \r
781 methAttr                : /* EMPTY */                   { $$ = MethAttr.Default; }\r
782                         | methAttr K_STATIC             { $$ = (MethAttr) $1 | MethAttr.Static; }\r
783                         | methAttr K_PUBLIC             { $$ = (MethAttr) $1 | MethAttr.Public; }\r
784                         | methAttr K_PRIVATE            { $$ = (MethAttr) $1 | MethAttr.Private; }\r
785                         | methAttr K_FAMILY             { $$ = (MethAttr) $1 | MethAttr.Family; }\r
786                         | methAttr K_FINAL              { $$ = (MethAttr) $1 | MethAttr.Final; }\r
787                         | methAttr K_SPECIALNAME        { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
788                         | methAttr K_VIRTUAL            { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
789                         | methAttr K_ABSTRACT           { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
790                         | methAttr K_ASSEMBLY           { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
791                         | methAttr K_FAMANDASSEM        { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; }\r
792                         | methAttr K_FAMORASSEM         { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; }\r
793                         | methAttr K_COMPILERCONTROLLED {/* FIXME */}\r
794                         | methAttr K_HIDEBYSIG          { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
795                         | methAttr K_NEWSLOT            { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
796                         | methAttr K_RTSPECIALNAME      { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
797                         | methAttr K_UNMANAGEDEXP       {/* FIXME */}\r
798                         | methAttr K_REQSECOBJ          { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
799                         /*\r
800                         | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS { }\r
801                         | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring  pinvAttr CLOSE_PARENS                 { }\r
802                         | methAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS                              { }\r
803                         */\r
804                         ;\r
805 \r
806 pinvAttr                : /* EMPTY */ \r
807                         | pinvAttr K_NOMANGLE \r
808                         | pinvAttr K_ANSI \r
809                         | pinvAttr K_UNICODE \r
810                         | pinvAttr K_AUTOCHAR \r
811                         | pinvAttr K_LASTERR \r
812                         | pinvAttr K_WINAPI \r
813                         | pinvAttr K_CDECL \r
814                         | pinvAttr K_STDCALL \r
815                         | pinvAttr K_THISCALL \r
816                         | pinvAttr K_FASTCALL \r
817                         ;\r
818 \r
819 methodName              : D_CTOR\r
820                         | D_CCTOR\r
821                         | name1\r
822                         ;\r
823 \r
824 paramAttr               : /* EMPTY */                                   {$$ = ParamAttr.Default; }\r
825                         | paramAttr OPEN_BRACKET K_IN CLOSE_BRACKET     {$$ = (ParamAttr) $1 | ParamAttr.In; }\r
826                         | paramAttr OPEN_BRACKET K_OUT CLOSE_BRACKET    {$$ = (ParamAttr) $1 | ParamAttr.Out; }\r
827                         | paramAttr OPEN_BRACKET K_OPT CLOSE_BRACKET    {$$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
828                         /* | paramAttr OPEN_BRACKET int32 CLOSE_BRACKET  */\r
829                         ;\r
830         \r
831 fieldAttr               : /* EMPTY */                   {$$ = FieldAttr.Default; }\r
832                         | fieldAttr K_STATIC            {$$ = FieldAttr.Static; }\r
833                         | fieldAttr K_PUBLIC            {$$ = FieldAttr.Public; }\r
834                         | fieldAttr K_PRIVATE           {$$ = FieldAttr.Private; }\r
835                         | fieldAttr K_FAMILY            {$$ = FieldAttr.Family; }\r
836                         | fieldAttr K_INITONLY          {$$ = FieldAttr.Initonly; }\r
837                         | fieldAttr K_RTSPECIALNAME     {$$ = FieldAttr.RTSpecialName; }\r
838                         | fieldAttr K_SPECIALNAME       {$$ = FieldAttr.SpecialName; }\r
839                                 /* commented out because PInvoke for fields is not supported by EE\r
840                         | fieldAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS \r
841                         | fieldAttr K_PINVOKEIMPL OPEN_PARENS compQstring  pinvAttr CLOSE_PARENS \r
842                         | fieldAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS \r
843                                 \r
844                         | fieldAttr K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
845                                 */\r
846                         | fieldAttr K_ASSEMBLY          {$$ = FieldAttr.Assembly; }\r
847                         | fieldAttr K_FAMANDASSEM       {$$ = FieldAttr.FamAndAssem; }\r
848                         | fieldAttr K_FAMORASSEM        {$$ = FieldAttr.FamOrAssem; }\r
849                 /*      | fieldAttr K_COMPILERCONTROLLED {$$ = FieldAttr. */\r
850                         | fieldAttr K_LITERAL           {$$ = FieldAttr.Literal; }\r
851                         | fieldAttr K_NOTSERIALIZED     {$$ = FieldAttr.Notserialized; }\r
852                         ;\r
853 \r
854 \r
855 implAttr                : /* empty */           {$$ = new ImplAttr (); }\r
856                         | implAttr K_NATIVE     {$$ = (ImplAttr) $1 | ImplAttr.Native; }\r
857                         | implAttr K_IL         {$$ = (ImplAttr) $1 | ImplAttr.IL; }\r
858                         | implAttr K_CIL        { /* Do nothing */ }\r
859                         | implAttr K_OPTIL      {$$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
860                         | implAttr K_MANAGED    { /* Do nothing */ }\r
861                         | implAttr K_UNMANAGED  {$$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
862                         | implAttr K_FORWARDREF {$$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
863                         | implAttr K_PRESERVESIG {$$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
864                         | implAttr K_RUNTIME    {$$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
865                         | implAttr K_INTERNALCALL {$$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
866                         | implAttr K_SYNCHRONIZED {$$ = (ImplAttr) $1 | ImplAttr.Synchronized; }\r
867                         | implAttr K_NOINLINING {$$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
868                         ;\r
869 \r
870 localsHead              : D_LOCALS\r
871                         ;\r
872 \r
873                                         \r
874 methodDecl              : D_EMITBYTE int32 \r
875                         | sehBlock \r
876                         | D_MAXSTACK int32 \r
877                           {\r
878                                 codegen.CurrentMethod.SetMaxStack ((int) $2);\r
879                           }\r
880                         | localsHead OPEN_PARENS sigArgs0 CLOSE_PARENS \r
881                         | localsHead K_INIT OPEN_PARENS named_arg_list CLOSE_PARENS  \r
882                                 {\r
883                                         /*\r
884                                         ArrayList arg_list = $4 as ArrayList;\r
885                                         \r
886                                         if (arg_list != null) {\r
887                                                 foreach (DictionaryEntry local in arg_list) {\r
888                                                         method.AddLocal (local);\r
889                                                 }\r
890                                         }\r
891                                         */\r
892                                 }\r
893                         | D_ENTRYPOINT          \r
894                           { \r
895                                 codegen.CurrentMethod.DeclareEntryPoint ();\r
896                           }\r
897                         | D_ZEROINIT \r
898                         | dataDecl\r
899                         | instr {\r
900                                 /*      method.AddInstruction (currentInstr); */\r
901                                 }\r
902                         | id COLON \r
903                         | secDecl\r
904                         | extSourceSpec\r
905                         | languageDecl\r
906                         | customAttrDecl\r
907                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET     \r
908                         | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET     K_AS id \r
909                         | D_VTENTRY int32 COLON int32 \r
910                         | D_OVERRIDE typeSpec DOUBLE_COLON methodName \r
911                         | scopeBlock\r
912                         | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET initOpt \r
913                         ;\r
914 \r
915 scopeBlock              : scopeOpen methodDecls CLOSE_BRACE \r
916                         ;\r
917 \r
918 scopeOpen               : OPEN_BRACE \r
919                         ;\r
920 \r
921 sehBlock                : tryBlock sehClauses\r
922                         ;\r
923 \r
924 sehClauses              : sehClause sehClauses\r
925                         | sehClause\r
926                         ;\r
927 \r
928 tryBlock                : tryHead scopeBlock \r
929                         | tryHead id K_TO id \r
930                         | tryHead int32 K_TO int32 \r
931                         ;\r
932 \r
933 tryHead                 : D_TRY \r
934                         ;\r
935 \r
936 \r
937 sehClause               : catchClause handlerBlock \r
938                         | filterClause handlerBlock \r
939                         | finallyClause handlerBlock \r
940                         | faultClause handlerBlock \r
941                         ;\r
942 \r
943          \r
944 filterClause            : filterHead scopeBlock \r
945                         | filterHead id \r
946                         | filterHead int32 \r
947                         ;\r
948 \r
949 filterHead              : K_FILTER  \r
950                         ;\r
951 \r
952 catchClause             : K_CATCH className \r
953                         ;\r
954 \r
955 finallyClause           : K_FINALLY \r
956                         ;\r
957 \r
958 faultClause             : K_FAULT \r
959                         ;\r
960 \r
961 handlerBlock            : scopeBlock                  \r
962                         | K_HANDLER id K_TO id \r
963                         | K_HANDLER int32 K_TO int32 \r
964                         ;\r
965 \r
966 \r
967 methodDecls             : /* EMPTY */\r
968                         | methodDecls methodDecl\r
969                         ;\r
970 \r
971 dataDecl                : ddHead ddBody\r
972                         ;\r
973 \r
974 ddHead                  : D_DATA tls id ASSIGN \r
975                         | D_DATA tls  \r
976                         ;\r
977 \r
978 tls                     : /* EMPTY */ \r
979                         | K_TLS \r
980                         ;\r
981 \r
982 ddBody                  : OPEN_BRACE ddItemList CLOSE_BRACE\r
983                         | ddItem\r
984                         ;\r
985 \r
986 ddItemList              : ddItem COMMA ddItemList\r
987                         | ddItem\r
988                         ;\r
989 \r
990 ddItemCount             : /* EMPTY */ \r
991                         | OPEN_BRACKET int32 CLOSE_BRACKET \r
992                         ;\r
993 \r
994 ddItem                  : K_CHAR STAR OPEN_PARENS compQstring CLOSE_PARENS \r
995                         | AMPERSAND OPEN_PARENS id CLOSE_PARENS \r
996                         | bytearrayhead bytes CLOSE_PARENS \r
997                         | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS ddItemCount \r
998                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS ddItemCount \r
999                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS ddItemCount  \r
1000                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS ddItemCount  \r
1001                         | K_INT16 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
1002                         | K_INT8 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
1003                         | K_FLOAT32 ddItemCount \r
1004                         | K_FLOAT64 ddItemCount \r
1005                         | K_INT64 ddItemCount  \r
1006                         | K_INT32 ddItemCount  \r
1007                         | K_INT16 ddItemCount \r
1008                         | K_INT8 ddItemCount \r
1009                         ;\r
1010 \r
1011 fieldInit               : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS \r
1012                         | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS \r
1013                         | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS \r
1014                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS \r
1015                         | K_INT64 OPEN_PARENS int64 CLOSE_PARENS  \r
1016                         | K_INT32 OPEN_PARENS int64 CLOSE_PARENS \r
1017                         | K_INT16 OPEN_PARENS int64 CLOSE_PARENS \r
1018                         | K_CHAR OPEN_PARENS int64 CLOSE_PARENS \r
1019                         | K_INT8 OPEN_PARENS int64 CLOSE_PARENS \r
1020                         | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS \r
1021                         | compQstring \r
1022                         | bytearrayhead bytes CLOSE_PARENS \r
1023                         | K_NULLREF \r
1024                         ;\r
1025 \r
1026 bytearrayhead           : K_BYTEARRAY OPEN_PARENS \r
1027                         ;\r
1028 \r
1029 \r
1030 hexbyte                 : INT32\r
1031                         | id\r
1032                         ;\r
1033 \r
1034 bytes                   : /* EMPTY */ \r
1035                         | hexbytes \r
1036                         ;\r
1037 \r
1038 hexbytes                : hexbyte \r
1039                         | hexbytes hexbyte \r
1040                         ;\r
1041 \r
1042 instr_r_head            : INSTR_R OPEN_PARENS \r
1043                         ;\r
1044 \r
1045 methodSpec              : K_METHOD \r
1046                         ;\r
1047 \r
1048 instr                   : INSTR_NONE            \r
1049                           { \r
1050                                 codegen.CodeBuffer.Inst ((Op) $1); \r
1051                           }\r
1052                         | INSTR_VAR int32       {/* currentInstr = new InstrVar ((OpCode) $1, $2);*/}\r
1053                         | INSTR_VAR id          {/* currentInstr = new InstrVar ((OpCode) $1, $2); */}\r
1054                         | INSTR_I int32         \r
1055                           {\r
1056                                 codegen.CodeBuffer.IntInst ((IntOp) $1, (int) $2); \r
1057                           }\r
1058                         | INSTR_I8 int64        {/* currentInstr = new InstrI8 ((OpCode) $1, (Int64) $2);*/}\r
1059                         | INSTR_R float64       {/* currentInstr = new InstrR ((OpCode) $1, (Double) $2);*/}\r
1060                         | INSTR_R int64         {/* currentInstr = new InstrR ((OpCode) $1, (Int64) $2);*/}\r
1061                         | instr_r_head bytes CLOSE_PARENS \r
1062                         | INSTR_BRTARGET int32  \r
1063                         | INSTR_BRTARGET id \r
1064                         | INSTR_METHOD method_ref \r
1065                           {\r
1066                                 codegen.CodeBuffer.MethInst ((MethodOp) $1, (Method) $2);               \r
1067                           }\r
1068 \r
1069                                         \r
1070                         | INSTR_METHOD callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
1071                                                 {\r
1072                 \r
1073                                                 }\r
1074                         | INSTR_NEWOBJ callConv type assembly_name name1 DOUBLE_COLON call_name OPEN_PARENS signature_args CLOSE_PARENS\r
1075                                                 { \r
1076                                                         \r
1077                                                 }\r
1078                         | INSTR_FIELD type typeSpec DOUBLE_COLON id \r
1079                         | INSTR_FIELD type id \r
1080                         | INSTR_TYPE type_ref\r
1081                           {\r
1082                                 TypeRef type_ref = (TypeRef) $2;\r
1083                                 codegen.CodeBuffer.TypeInst ((TypeOp) $1, type_ref.Type); \r
1084                           }\r
1085                         | INSTR_STRING compQstring \r
1086                                 {\r
1087                                 /*      currentInstr = new InstrString ((OpCode) $1, $2 as string); */\r
1088                                 }\r
1089                         | INSTR_STRING bytearrayhead bytes CLOSE_PARENS \r
1090                         | INSTR_SIG callConv type OPEN_PARENS sigArgs0 CLOSE_PARENS \r
1091                         | INSTR_RVA id \r
1092                         | INSTR_RVA int32 \r
1093                         | INSTR_TOK methodSpec callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
1094                         | INSTR_TOK methodSpec callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
1095                         | INSTR_TOK K_FIELD type typeSpec DOUBLE_COLON id \r
1096                         | INSTR_TOK K_FIELD type id \r
1097                         | INSTR_TOK typeSpec \r
1098                         | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS \r
1099                         | INSTR_PHI int16s \r
1100                         ;\r
1101 \r
1102 param_name              : /* EMPTY */\r
1103                         | name1\r
1104                         ;\r
1105 \r
1106 arg_list \r
1107         : /* EMPTY */\r
1108         | paramAttr type_ref param_name\r
1109           {\r
1110                 ArrayList arg_list = new ArrayList ();\r
1111                 Param param = new Param ((ParamAttr) $1, $3 as string, ((TypeRef) $2).Type);\r
1112                 DictionaryEntry entry = new DictionaryEntry (param, $2);\r
1113 \r
1114                 arg_list.Add (entry);           \r
1115                 $$ = arg_list;\r
1116           }\r
1117         | arg_list COMMA paramAttr type_ref param_name\r
1118           {\r
1119                 ArrayList arg_list = (ArrayList) $1;\r
1120                 Param param = new Param ((ParamAttr) $3, $5 as string, ((TypeRef) $4).Type);\r
1121                 DictionaryEntry entry = new DictionaryEntry (param, $4);\r
1122 \r
1123                 arg_list.Add (entry);\r
1124                 $$ = arg_list;\r
1125           }\r
1126         ;\r
1127 \r
1128 param_name              : /* EMPTY */\r
1129                         | name1\r
1130                         ;\r
1131 \r
1132 named_arg\r
1133         : type_ref ID\r
1134           {\r
1135                 $$ = new DictionaryEntry ((string) $1, (string) $2);\r
1136           }\r
1137         ;\r
1138 \r
1139 named_arg_list          \r
1140         : /* EMPTY */\r
1141         | named_arg\r
1142           {\r
1143                 ArrayList arg_list = new ArrayList ();\r
1144                 arg_list.Add ($1);\r
1145 \r
1146                 $$ = arg_list;                                  \r
1147           }\r
1148         | named_arg_list COMMA named_arg \r
1149           {\r
1150                 ArrayList arg_list = (ArrayList) $1;\r
1151                 arg_list.Add ($3);\r
1152                                 \r
1153                 $$ = arg_list;\r
1154           }\r
1155         ;           \r
1156 \r
1157         \r
1158 signature_args          : /* EMPTY */\r
1159                         | type\r
1160                         | type COMMA signature_args\r
1161                         ;\r
1162 \r
1163 binding_flags           : /* EMPTY */\r
1164                         | K_INSTANCE\r
1165                         ;\r
1166 \r
1167 sigArgs0                : /* EMPTY */ \r
1168                         | sigArgs1 \r
1169                         ;\r
1170 \r
1171 sigArgs1                : sigArg \r
1172                         | sigArgs1 COMMA sigArg { $$ = String.Format ("{0},{1}", $1, $2); }\r
1173                         ;\r
1174 \r
1175 sigArg                  : ELLIPSIS              \r
1176                         | paramAttr type_ref \r
1177                         | paramAttr type id { $$ = String.Format ("{0} {1}", $2, $3); }\r
1178                         | paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
1179                         | paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS id \r
1180                         ;\r
1181                         \r
1182 \r
1183 dottedName              : id DOT id     {$$ = ($1 as string) + "." + ($3 as string);}\r
1184                         ;\r
1185 \r
1186 \r
1187 name1                   : id\r
1188                         | dottedName\r
1189                         | name1 DOT name1       {$$ = String.Format ("{0}.{1}", $1, $3); }\r
1190                         ;\r
1191 \r
1192 call_name               : \r
1193                         | id\r
1194                         | D_CTOR\r
1195                         | D_CCTOR\r
1196                         ;\r
1197                         \r
1198 assembly_ref            : id\r
1199                         | id DASH id {$$ = String.Format ("{0}-{1}", $1, $3);}\r
1200                         | id DASH assembly_ref {$$ = String.Format ("{0}-{1}", $1, $3);}\r
1201                         ;\r
1202 \r
1203 assembly_name           : OPEN_BRACKET assembly_ref CLOSE_BRACKET {$$ = ($2 as string);}\r
1204                         ;\r
1205 \r
1206 className               : OPEN_BRACKET name1 CLOSE_BRACKET slashedName \r
1207                         | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET slashedName \r
1208                         | slashedName \r
1209                         ;\r
1210 \r
1211 slashedName             : name1\r
1212                         | slashedName SLASH name1       {$$ = ($1 as string) + "/" + ($3 as string);}\r
1213                         ;\r
1214 \r
1215 typeSpec                : className \r
1216                         | OPEN_BRACKET name1 CLOSE_BRACKET \r
1217                         | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET \r
1218                         | type \r
1219                         ;\r
1220 \r
1221 callConv                : K_INSTANCE callConv   { $$ = (CallConv) $1 | CallConv.Instance; }\r
1222                         | K_EXPLICIT callConv   { $$ = (CallConv) $1 | CallConv.InstanceExplicit; }\r
1223                         | callKind \r
1224                         ;\r
1225 \r
1226 callKind                : /* EMPTY */           { $$ = CallConv.Default; }\r
1227                         | K_DEFAULT             { $$ = (CallConv) $1 | CallConv.Default; }\r
1228                         | K_VARARG              { $$ = (CallConv) $1 | CallConv.Vararg; }\r
1229                         | K_UNMANAGED K_CDECL   { $$ = (CallConv) $1 | CallConv.Cdecl; }\r
1230                         | K_UNMANAGED K_STDCALL { $$ = (CallConv) $1 | CallConv.Stdcall; }\r
1231                         | K_UNMANAGED K_THISCALL { $$ = (CallConv) $1 | CallConv.Thiscall; }\r
1232                         | K_UNMANAGED K_FASTCALL { $$ = (CallConv) $1 | CallConv.Fastcall; }\r
1233                         ;\r
1234 \r
1235 nativeType              : /* EMPTY */  \r
1236                         | K_CUSTOM OPEN_PARENS compQstring COMMA compQstring COMMA compQstring COMMA compQstring CLOSE_PARENS \r
1237                         | K_CUSTOM OPEN_PARENS compQstring COMMA compQstring CLOSE_PARENS \r
1238                         | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET \r
1239                         | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET \r
1240                         | K_VARIANT \r
1241                         | K_CURRENCY \r
1242                         | K_SYSCHAR \r
1243                         | K_VOID \r
1244                         | K_BOOL \r
1245                         | K_INT8 \r
1246                         | K_INT16 \r
1247                         | K_INT32 \r
1248                         | K_INT64 \r
1249                         | K_FLOAT32 \r
1250                         | K_FLOAT64 \r
1251                         | K_ERROR \r
1252                         | K_UNSIGNED K_INT8 \r
1253                         | K_UNSIGNED K_INT16 \r
1254                         | K_UNSIGNED K_INT32 \r
1255                         | K_UNSIGNED K_INT64 \r
1256                         | nativeType STAR \r
1257                         | nativeType OPEN_BRACKET CLOSE_BRACKET \r
1258                         | nativeType OPEN_BRACKET int32 CLOSE_BRACKET \r
1259                         | nativeType OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET \r
1260                         | nativeType OPEN_BRACKET PLUS int32 CLOSE_BRACKET \r
1261                         | K_DECIMAL \r
1262                         | K_DATE \r
1263                         | K_BSTR \r
1264                         | K_LPSTR \r
1265                         | K_LPWSTR \r
1266                         | K_LPTSTR \r
1267                         | K_OBJECTREF \r
1268                         | K_IUNKNOWN \r
1269                         | K_IDISPATCH \r
1270                         | K_STRUCT \r
1271                         | K_INTERFACE \r
1272                         | K_SAFEARRAY variantType \r
1273                         | K_INT \r
1274                         | K_UNSIGNED K_INT \r
1275                         | K_NESTED K_STRUCT \r
1276                         | K_BYVALSTR \r
1277                         | K_ANSI K_BSTR \r
1278                         | K_TBSTR \r
1279                         | K_VARIANT K_BOOL \r
1280                         | methodSpec \r
1281                         | K_AS K_ANY \r
1282                         | K_LPSTRUCT \r
1283                         ;\r
1284 \r
1285 variantType             : /* EMPTY */ \r
1286                         | K_NULL \r
1287                         | K_VARIANT \r
1288                         | K_CURRENCY \r
1289                         | K_VOID \r
1290                         | K_BOOL \r
1291                         | K_INT8 \r
1292                         | K_INT16 \r
1293                         | K_INT32 \r
1294                         | K_INT64 \r
1295                         | K_FLOAT32 \r
1296                         | K_FLOAT64 \r
1297                         | K_UNSIGNED K_INT8 \r
1298                         | K_UNSIGNED K_INT16 \r
1299                         | K_UNSIGNED K_INT32 \r
1300                         | K_UNSIGNED K_INT64 \r
1301                         | STAR \r
1302                         | variantType OPEN_BRACKET CLOSE_BRACKET \r
1303                         | variantType K_VECTOR \r
1304                         | variantType AMPERSAND \r
1305                         | K_DECIMAL \r
1306                         | K_DATE \r
1307                         | K_BSTR \r
1308                         | K_LPSTR \r
1309                         | K_LPWSTR \r
1310                         | K_IUNKNOWN \r
1311                         | K_IDISPATCH \r
1312                         | K_SAFEARRAY \r
1313                         | K_INT \r
1314                         | K_UNSIGNED K_INT \r
1315                         | K_ERROR \r
1316                         | K_HRESULT \r
1317                         | K_CARRAY \r
1318                         | K_USERDEFINED \r
1319                         | K_RECORD \r
1320                         | K_FILETIME \r
1321                         | K_BLOB \r
1322                         | K_STREAM \r
1323                         | K_STORAGE \r
1324                         | K_STREAMED_OBJECT \r
1325                         | K_STORED_OBJECT \r
1326                         | K_BLOB_OBJECT \r
1327                         | K_CF \r
1328                         | K_CLSID \r
1329                         ;\r
1330 \r
1331 type                    : K_CLASS className \r
1332                         | K_OBJECT  \r
1333                         | K_STRING  \r
1334                         | K_VALUE K_CLASS className  \r
1335                         | K_VALUETYPE className  \r
1336                         | type OPEN_BRACKET CLOSE_BRACKET  \r
1337                         | type OPEN_BRACKET bounds1 CLOSE_BRACKET  \r
1338                         /* uncomment when and if this type is supported by the Runtime\r
1339                         | type K_VALUE OPEN_BRACKET int32 CLOSE_BRACKET \r
1340                         */\r
1341                         | type AMPERSAND \r
1342                         | type STAR \r
1343                         | type K_PINNED \r
1344                         | type K_MODREQ OPEN_PARENS className CLOSE_PARENS \r
1345                         | type K_MODOPT OPEN_PARENS className CLOSE_PARENS \r
1346                         | BANG int32 \r
1347                         | methodSpec callConv type STAR OPEN_PARENS sigArgs0 CLOSE_PARENS \r
1348                         | K_TYPEDREF \r
1349                         | K_CHAR \r
1350                         | K_VOID \r
1351                         | K_BOOL \r
1352                         | K_INT8 \r
1353                         | K_INT16 \r
1354                         | K_INT32 \r
1355                         | K_INT64 \r
1356                         | K_FLOAT32 \r
1357                         | K_FLOAT64 \r
1358                         | K_UNSIGNED K_INT8     {$$ = "uint8";}\r
1359                         | K_UNSIGNED K_INT16    {$$ = "uint16";}\r
1360                         | K_UNSIGNED K_INT32    {$$ = "uint32";}\r
1361                         | K_UNSIGNED K_INT64    {$$ = "uint64";}\r
1362                         | K_NATIVE K_INT \r
1363                         | K_NATIVE K_UNSIGNED K_INT \r
1364                         | K_NATIVE K_FLOAT \r
1365                         ;\r
1366 \r
1367 bounds1                 : bound \r
1368                         | bounds1 COMMA bound \r
1369                         ;\r
1370 \r
1371 bound                   : /* EMPTY */ \r
1372                         | ELLIPSIS \r
1373                         | int32  \r
1374                         | int32 ELLIPSIS int32    \r
1375                         | int32 ELLIPSIS  \r
1376                         ;\r
1377 \r
1378 labels                  : /* empty */ \r
1379                         | id COMMA labels \r
1380                         | int32 COMMA labels \r
1381                         | id \r
1382                         | int32 \r
1383                         ;\r
1384 \r
1385 \r
1386 id                      : ID \r
1387                         | SQSTRING \r
1388                         ;\r
1389 \r
1390 int16s                  : /* EMPTY */ \r
1391                         | int16s int32 \r
1392                         ;\r
1393                                 \r
1394 int32                   : INT32 /* NOTE: it's INT64 in docs */\r
1395                         ;\r
1396 \r
1397 int64                   : INT64 \r
1398                         ;\r
1399 \r
1400 float64                 : FLOAT64 \r
1401                         | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS \r
1402                         | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS \r
1403                         ;\r
1404 \r
1405 secDecl                 : D_PERMISSION secAction typeSpec OPEN_PARENS nameValPairs CLOSE_PARENS \r
1406                         | D_PERMISSION secAction typeSpec \r
1407                         | psetHead bytes CLOSE_PARENS \r
1408                         ;\r
1409 \r
1410 psetHead                : D_PERMISSIONSET secAction ASSIGN OPEN_PARENS \r
1411                         ;\r
1412 \r
1413 nameValPairs            : nameValPair \r
1414                         | nameValPair COMMA nameValPairs \r
1415                         ;\r
1416 \r
1417 nameValPair             : compQstring ASSIGN caValue \r
1418                         ;\r
1419 \r
1420 truefalse               : K_TRUE \r
1421                         | K_FALSE \r
1422                         ;\r
1423 \r
1424 caValue                 : truefalse \r
1425                         | int32 \r
1426                         | K_INT32 OPEN_PARENS int32 CLOSE_PARENS \r
1427                         | compQstring \r
1428                         | className OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS \r
1429                         | className OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS \r
1430                         | className OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS \r
1431                         | className OPEN_PARENS int32 CLOSE_PARENS \r
1432                         ;\r
1433 \r
1434 secAction               : K_REQUEST \r
1435                         | K_DEMAND \r
1436                         | K_ASSERT \r
1437                         | K_DENY \r
1438                         | K_PERMITONLY \r
1439                         | K_LINKCHECK \r
1440                         | K_INHERITCHECK \r
1441                         | K_REQMIN \r
1442                         | K_REQOPT \r
1443                         | K_REQREFUSE \r
1444                         | K_PREJITGRANT \r
1445                         | K_PREJITDENY \r
1446                         | K_NONCASDEMAND \r
1447                         | K_NONCASLINKDEMAND \r
1448                         | K_NONCASINHERITANCE \r
1449                         ;\r
1450 \r
1451 extSourceSpec           : D_LINE int32 SQSTRING \r
1452                         | D_LINE int32 \r
1453                         | D_XLINE int32 QSTRING \r
1454                         ;\r
1455 \r
1456 fileDecl                : D_FILE fileAttr name1 fileEntry hashHead bytes CLOSE_PARENS fileEntry \r
1457                         | D_FILE fileAttr name1 fileEntry \r
1458                         ;\r
1459 \r
1460 fileAttr                : /* EMPTY */ \r
1461                         | fileAttr K_NOMETADATA \r
1462                         ;\r
1463 \r
1464 fileEntry               : /* EMPTY */ \r
1465                         | D_ENTRYPOINT \r
1466                         ;\r
1467 \r
1468 hashHead                : D_HASH ASSIGN OPEN_PARENS \r
1469                         ;\r
1470 \r
1471 assemblyHead            : D_ASSEMBLY asmAttr name1\r
1472                         {\r
1473                                 /*\r
1474                                 // TODO: set assembly attrs\r
1475                                 codegen.SetName ($3 as string);\r
1476                                 */\r
1477                         }\r
1478                         ;\r
1479 \r
1480 asmAttr                 : /* EMPTY */ \r
1481                         | asmAttr K_NOAPPDOMAIN \r
1482                         | asmAttr K_NOPROCESS \r
1483                         | asmAttr K_NOMACHINE \r
1484                         ;\r
1485 \r
1486 assemblyDecls           : /* EMPTY */\r
1487                         | assemblyDecls assemblyDecl\r
1488                         ;\r
1489 \r
1490 assemblyDecl            : D_HASH K_ALGORITHM int32 \r
1491                         | secDecl\r
1492                         | asmOrRefDecl\r
1493                         ;\r
1494 \r
1495 asmOrRefDecl            : publicKeyHead bytes CLOSE_PARENS \r
1496                         | D_VER int32 COLON int32 COLON int32 COLON int32 \r
1497                         | D_LOCALE compQstring \r
1498                         | localeHead bytes CLOSE_PARENS \r
1499                         | D_PROCESSOR int32 \r
1500                         | D_OS int32 D_VER int32 COLON int32 \r
1501                         | customAttrDecl\r
1502                         ;\r
1503 \r
1504 publicKeyHead           : D_PUBLICKEY ASSIGN OPEN_PARENS \r
1505                         ;\r
1506 \r
1507 publicKeyTokenHead      : D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS \r
1508                         ;\r
1509 \r
1510 localeHead              : D_LOCALE ASSIGN OPEN_PARENS \r
1511                         ;\r
1512 \r
1513 assemblyRefHead         : D_ASSEMBLY K_EXTERN name1 \r
1514                           {\r
1515                                 System.Reflection.AssemblyName asmb_name = \r
1516                                         new System.Reflection.AssemblyName ();\r
1517                                 asmb_name.Name = (string) $3;\r
1518                                 codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
1519                           }\r
1520                         ;\r
1521 \r
1522 assemblyRefDecls        : /* EMPTY */\r
1523                         | assemblyRefDecls assemblyRefDecl\r
1524                         ;\r
1525 \r
1526 assemblyRefDecl         : hashHead bytes CLOSE_PARENS \r
1527                         | asmOrRefDecl\r
1528                         | publicKeyTokenHead bytes CLOSE_PARENS \r
1529                         ;\r
1530 \r
1531 comtypeHead             : D_CLASS K_EXTERN comtAttr name1  \r
1532                         ;\r
1533 \r
1534 exportHead              : D_EXPORT comtAttr name1 \r
1535                         ;\r
1536 \r
1537 comtAttr                : /* EMPTY */ \r
1538                         | comtAttr K_PRIVATE \r
1539                         | comtAttr K_PUBLIC \r
1540                         | comtAttr K_NESTED K_PUBLIC \r
1541                         | comtAttr K_NESTED K_PRIVATE \r
1542                         | comtAttr K_NESTED K_FAMILY \r
1543                         | comtAttr K_NESTED K_ASSEMBLY \r
1544                         | comtAttr K_NESTED K_FAMANDASSEM \r
1545                         | comtAttr K_NESTED K_FAMORASSEM \r
1546                         ;\r
1547 \r
1548 comtypeDecls            : /* EMPTY */\r
1549                         | comtypeDecls comtypeDecl\r
1550                         ;\r
1551 \r
1552 comtypeDecl             : D_FILE name1 \r
1553                         | D_CLASS K_EXTERN name1 \r
1554                         | D_CLASS  int32 \r
1555                         | customAttrDecl\r
1556                         ;\r
1557 \r
1558 manifestResHead         : D_MRESOURCE manresAttr name1 \r
1559                         ;\r
1560 \r
1561 manresAttr              : /* EMPTY */ \r
1562                         | manresAttr K_PUBLIC \r
1563                         | manresAttr K_PRIVATE \r
1564                         ;\r
1565 \r
1566 manifestResDecls        : /* EMPTY */\r
1567                         | manifestResDecls manifestResDecl\r
1568                         ;\r
1569 \r
1570 manifestResDecl         : D_FILE name1 K_AT int32 \r
1571                         | D_ASSEMBLY K_EXTERN name1 \r
1572                         | customAttrDecl\r
1573                         ;\r
1574 \r
1575 \r
1576 \r
1577 %%\r
1578 \r
1579 } // namespace Mono.ILASM\r