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