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