2 // Mono::ILASM::ILParser
\r
4 // (C) Sergey Chaban (serge@wildwestsoftware.com)
\r
8 using System.Collections;
\r
10 namespace Mono.ILASM {
\r
12 public class ILParser {
\r
14 // private Method method;
\r
16 // private InstrBase currentInstr;
\r
18 // private CallingConventions currentCallConv;
\r
20 // private TypeAttributes currentTypeAttrs;
\r
22 // private Class currentClass;
\r
24 private CodeGen codegen;
\r
26 private string defaultAsmName = "output";
\r
29 public ILParser (CodeGen codegen) {
\r
30 this.codegen = codegen;
\r
33 public CodeGen CodeGen {
\r
43 /* ID - alpha-numeric identifier */
\r
46 /* QSTRING - quoted string */
\r
49 /* SQSTRING - single quoted string */
\r
52 /* INT32 - 32 bit integer */
\r
55 /* INT64 - 64 bit integer */
\r
58 /* FLOAT64 - floating point number */
\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
73 %token DOUBLE_COLON "::"
\r
74 %token SEMICOLON ";"
\r
77 %token AMPERSAND "&"
\r
81 %token ELLIPSIS "..."
\r
90 /* INSTR_* instruction types */
\r
96 %token INSTR_BRTARGET
\r
101 %token INSTR_STRING
\r
105 %token INSTR_SWITCH
\r
114 /* Mechanically generated - DO NOT EDIT! */
\r
123 %token D_CAPABILITY
\r
133 %token D_ENTRYPOINT
\r
142 %token D_IMPLICITCOM
\r
148 %token D_MANIFESTRES
\r
155 %token D_ORIGINATOR
\r
161 %token D_PERMISSION
\r
162 %token D_PERMISSIONSET
\r
166 %token D_PUBLICKEYTOKEN
\r
183 %token K_IMPLICITCOM
\r
184 %token K_IMPLICITRES
\r
185 %token K_NOAPPDOMAIN
\r
209 %token K_RTSPECIALNAME
\r
210 %token K_SPECIALNAME
\r
212 %token K_FAMANDASSEM
\r
213 %token K_FAMORASSEM
\r
214 %token K_PRIVATESCOPE
\r
216 %token K_NOTSERIALIZED
\r
218 %token K_NOT_IN_GC_HEAP
\r
223 %token K_SEQUENTIAL
\r
228 %token K_SERIALIZABLE
\r
232 %token K_IMPLEMENTS
\r
237 %token K_UNMANAGEDEXP
\r
238 %token K_PINVOKEIMPL
\r
248 %token K_FORWARDREF
\r
250 %token K_INTERNALCALL
\r
251 %token K_SYNCHRONIZED
\r
252 %token K_NOINLINING
\r
293 %token K_USERDEFINED
\r
299 %token K_STREAMED_OBJECT
\r
300 %token K_STORED_OBJECT
\r
301 %token K_BLOB_OBJECT
\r
312 %token K_FROMUNMANAGED
\r
313 %token K_CALLMOSTDERIVED
\r
329 %token K_PERMITONLY
\r
331 %token K_INHERITCHECK
\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
341 %token K_NOMETADATA
\r
343 %token K_FULLORIGIN
\r
347 %token K_ENABLEJITTRACKING
\r
348 %token K_DISABLEJITOPTIMIZER
\r
349 %token K_PRESERVESIG
\r
350 %token K_BEFOREFIELDINIT
\r
354 %token K_COMPILERCONTROLLED
\r
362 /* end generated */
\r
375 decls : /* EMPTY */
\r
380 | nameSpaceHead OPEN_BRACE decls CLOSE_BRACE { codegen.CurrentNameSpace = String.Empty; }
\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
395 | D_SUBSYSTEM int32
\r
396 | D_CORFLAGS int32
\r
397 | D_FILE K_ALIGNMENT int32
\r
401 compQstring : QSTRING
\r
402 | compQstring PLUS QSTRING {$$ = ($1 as string) + ($3 as string);}
\r
405 languageDecl : D_LANGUAGE SQSTRING
\r
406 | D_LANGUAGE SQSTRING COMMA SQSTRING
\r
407 | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING
\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
418 moduleHead : D_MODULE
\r
420 | D_MODULE K_EXTERN name1
\r
423 vtfixupDecl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET vtfixupAttr K_AT id
\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
433 vtableDecl : vtableHead bytes CLOSE_PARENS
\r
436 vtableHead : D_VTABLE ASSIGN OPEN_PARENS
\r
439 nameSpaceHead : D_NAMESPACE name1
\r
441 codegen.CurrentNameSpace = (string) $2;
\r
445 classHead : D_CLASS type_attr id extendsClause implClause
\r
448 codegen.AddClass ((TypeAttr) $2, (string) $3, $4 as Class, null);
\r
450 codegen.AddClass ((TypeAttr)$2, (string) $3, null);
\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
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
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
513 extendsClause : /* EMPTY */
\r
514 | K_EXTENDS type_ref {$$ = $2;}
\r
517 implClause : /* EMPTY */
\r
518 | K_IMPLEMENTS classNames {$$ = $2; }
\r
521 classNames : classNames COMMA type_ref
\r
523 ArrayList class_list = (ArrayList) $1;
\r
524 class_list.Add ($3);
\r
528 ArrayList class_list = new ArrayList ();
\r
529 class_list.Add ($1);
\r
534 classDecls : /* EMPTY */
\r
535 | classDecls classDecl
\r
539 classAll : classHead OPEN_BRACE classDecls CLOSE_BRACE
\r
542 codegen.AddClass (currentClass);
\r
543 currentClass = null;
\r
549 classDecl : methodAll
\r
551 | eventHead OPEN_BRACE eventDecls CLOSE_BRACE
\r
552 | propHead OPEN_BRACE propDecls CLOSE_BRACE
\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
565 fieldDecl : D_FIELD repeatOpt fieldAttr type_ref id atOpt initOpt
\r
567 codegen.CurrentClass.AddField ((FieldAttr) $3,
\r
568 (string) $5, (PEAPI.Type) $4);
\r
572 type_ref : primative_type_ref
\r
573 | internal_type_ref
\r
574 | external_type_ref
\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
593 internal_type_ref : name1
\r
595 $$ = codegen.ClassTable.GetReference ((string) $1, null);
\r
599 external_type_ref : assembly_name namespace_name DOT id
\r
601 $$ = codegen.ExternTable.GetClass ($1 as string, $2 as string, $4 as string);
\r
605 namespace_name : /* EMPTY */
\r
607 | namespace_name DOT id {$$ = String.Format ("{0}.{1}", $1, $3); }
\r
610 atOpt : /* EMPTY */
\r
614 initOpt : /* EMPTY */
\r
615 | ASSIGN fieldInit
\r
618 repeatOpt : /* EMPTY */
\r
619 | OPEN_BRACKET int32 CLOSE_BRACKET
\r
622 customHead : D_CUSTOM customType ASSIGN OPEN_PARENS
\r
625 customHeadWithOwner : D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN OPEN_PARENS
\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
633 eventHead : D_EVENT eventAttr typeSpec id
\r
634 | D_EVENT eventAttr id
\r
638 eventAttr : /* EMPTY */
\r
639 | eventAttr K_RTSPECIALNAME /**/
\r
640 | eventAttr K_SPECIALNAME
\r
643 eventDecls : /* EMPTY */
\r
644 | eventDecls eventDecl
\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
660 propHead : D_PROPERTY propAttr callConv type id OPEN_PARENS sigArgs0 CLOSE_PARENS initOpt
\r
663 propAttr : /* EMPTY */
\r
664 | propAttr K_RTSPECIALNAME /**/
\r
665 | propAttr K_SPECIALNAME
\r
668 propDecls : /* EMPTY */
\r
669 | propDecls propDecl
\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
685 methodHeadPart1 : D_METHOD
\r
688 method = new Method ();
\r
689 currentCallConv = 0;
\r
694 methodHead : methodHeadPart1 methAttr callConv paramAttr type methodName OPEN_PARENS arg_list CLOSE_PARENS implAttr OPEN_BRACE
\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
704 | methodHeadPart1 methAttr callConv paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS methodName OPEN_PARENS sigArgs0 CLOSE_PARENS implAttr OPEN_BRACE
\r
708 methodAll : methodHead methodDecls CLOSE_BRACE
\r
711 // Console.WriteLine (method);
\r
712 currentClass.AddMethod (method);
\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
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
743 pinvAttr : /* EMPTY */
\r
744 | pinvAttr K_NOMANGLE
\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
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
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
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
781 | fieldAttr K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS
\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
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
807 localsHead : D_LOCALS
\r
811 methodDecl : D_EMITBYTE int32
\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
818 ArrayList arg_list = $4 as ArrayList;
\r
820 if (arg_list != null) {
\r
821 foreach (DictionaryEntry local in arg_list) {
\r
822 method.AddLocal (local);
\r
827 | D_ENTRYPOINT {/* method.IsEntryPoint = true; */}
\r
831 /* method.AddInstruction (currentInstr); */
\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
843 | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET initOpt
\r
846 scopeBlock : scopeOpen methodDecls CLOSE_BRACE
\r
849 scopeOpen : OPEN_BRACE
\r
852 sehBlock : tryBlock sehClauses
\r
855 sehClauses : sehClause sehClauses
\r
859 tryBlock : tryHead scopeBlock
\r
860 | tryHead id K_TO id
\r
861 | tryHead int32 K_TO int32
\r
868 sehClause : catchClause handlerBlock
\r
869 | filterClause handlerBlock
\r
870 | finallyClause handlerBlock
\r
871 | faultClause handlerBlock
\r
875 filterClause : filterHead scopeBlock
\r
877 | filterHead int32
\r
880 filterHead : K_FILTER
\r
883 catchClause : K_CATCH className
\r
886 finallyClause : K_FINALLY
\r
889 faultClause : K_FAULT
\r
892 handlerBlock : scopeBlock
\r
893 | K_HANDLER id K_TO id
\r
894 | K_HANDLER int32 K_TO int32
\r
898 methodDecls : /* EMPTY */
\r
899 | methodDecls methodDecl
\r
902 dataDecl : ddHead ddBody
\r
905 ddHead : D_DATA tls id ASSIGN
\r
913 ddBody : OPEN_BRACE ddItemList CLOSE_BRACE
\r
917 ddItemList : ddItem COMMA ddItemList
\r
921 ddItemCount : /* EMPTY */
\r
922 | OPEN_BRACKET int32 CLOSE_BRACKET
\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
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
953 | bytearrayhead bytes CLOSE_PARENS
\r
957 bytearrayhead : K_BYTEARRAY OPEN_PARENS
\r
965 bytes : /* EMPTY */
\r
969 hexbytes : hexbyte
\r
970 | hexbytes hexbyte
\r
973 instr_r_head : INSTR_R OPEN_PARENS
\r
976 methodSpec : K_METHOD
\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
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
1003 | INSTR_METHOD callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS
\r
1007 | INSTR_NEWOBJ callConv type assembly_name name1 DOUBLE_COLON call_name OPEN_PARENS signature_args CLOSE_PARENS
\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
1016 /* currentInstr = new InstrString ((OpCode) $1, $2 as string); */
\r
1018 | INSTR_STRING bytearrayhead bytes CLOSE_PARENS
\r
1019 | INSTR_SIG callConv type OPEN_PARENS sigArgs0 CLOSE_PARENS
\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
1034 | assembly_name name1 { $$ = String.Format ("[{0}]{1}", $1, $2); }
\r
1041 ArrayList arg_list = new ArrayList ();
\r
1042 arg_list.Add ($1);
\r
1046 | arg_list COMMA type
\r
1048 ArrayList arg_list = (ArrayList) $1;
\r
1049 arg_list.Add ($3);
\r
1058 $$ = new DictionaryEntry ((string) $1, (string) $2);
\r
1066 ArrayList arg_list = new ArrayList ();
\r
1067 arg_list.Add ($1);
\r
1071 | named_arg_list COMMA named_arg
\r
1073 ArrayList arg_list = (ArrayList) $1;
\r
1074 arg_list.Add ($3);
\r
1081 signature_args : /* EMPTY */
\r
1083 | type COMMA signature_args
\r
1086 binding_flags : /* EMPTY */
\r
1090 sigArgs0 : /* EMPTY */
\r
1094 sigArgs1 : sigArg
\r
1095 | sigArgs1 COMMA sigArg { $$ = String.Format ("{0},{1}", $1, $2); }
\r
1098 sigArg : ELLIPSIS
\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
1106 dottedName : id DOT id {$$ = ($1 as string) + "." + ($3 as string);}
\r
1112 | name1 DOT name1 {$$ = String.Format ("{0}.{1}", $1, $3); }
\r
1122 | id DASH id {$$ = String.Format ("{0}-{1}", $1, $3);}
\r
1123 | id DASH assembly_ref {$$ = String.Format ("{0}-{1}", $1, $3);}
\r
1126 assembly_name : OPEN_BRACKET assembly_ref CLOSE_BRACKET {$$ = ($2 as string);}
\r
1129 className : OPEN_BRACKET name1 CLOSE_BRACKET slashedName
\r
1130 | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET slashedName
\r
1134 slashedName : name1
\r
1135 | slashedName SLASH name1 {$$ = ($1 as string) + "/" + ($3 as string);}
\r
1138 typeSpec : className
\r
1139 | OPEN_BRACKET name1 CLOSE_BRACKET
\r
1140 | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET
\r
1144 callConv : K_INSTANCE callConv { /* currentCallConv |= CallingConventions.HasThis; */}
\r
1145 | K_EXPLICIT callConv { /* currentCallConv |= CallingConventions.ExplicitThis; */}
\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
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
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
1195 | K_SAFEARRAY variantType
\r
1197 | K_UNSIGNED K_INT
\r
1198 | K_NESTED K_STRUCT
\r
1202 | K_VARIANT K_BOOL
\r
1208 variantType : /* EMPTY */
\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
1225 | variantType OPEN_BRACKET CLOSE_BRACKET
\r
1226 | variantType K_VECTOR
\r
1227 | variantType AMPERSAND
\r
1237 | K_UNSIGNED K_INT
\r
1247 | K_STREAMED_OBJECT
\r
1248 | K_STORED_OBJECT
\r
1254 type : K_CLASS className
\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
1267 | type K_MODREQ OPEN_PARENS className CLOSE_PARENS
\r
1268 | type K_MODOPT OPEN_PARENS className CLOSE_PARENS
\r
1270 | methodSpec callConv type STAR OPEN_PARENS sigArgs0 CLOSE_PARENS
\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
1286 | K_NATIVE K_UNSIGNED K_INT
\r
1287 | K_NATIVE K_FLOAT
\r
1291 | bounds1 COMMA bound
\r
1294 bound : /* EMPTY */
\r
1297 | int32 ELLIPSIS int32
\r
1301 labels : /* empty */
\r
1302 | id COMMA labels
\r
1303 | int32 COMMA labels
\r
1313 int16s : /* EMPTY */
\r
1317 int32 : INT32 /* NOTE: it's INT64 in docs */
\r
1323 float64 : FLOAT64
\r
1324 | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS
\r
1325 | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS
\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
1333 psetHead : D_PERMISSIONSET secAction ASSIGN OPEN_PARENS
\r
1336 nameValPairs : nameValPair
\r
1337 | nameValPair COMMA nameValPairs
\r
1340 nameValPair : compQstring ASSIGN caValue
\r
1343 truefalse : K_TRUE
\r
1347 caValue : truefalse
\r
1349 | K_INT32 OPEN_PARENS int32 CLOSE_PARENS
\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
1357 secAction : K_REQUEST
\r
1370 | K_NONCASLINKDEMAND
\r
1371 | K_NONCASINHERITANCE
\r
1374 extSourceSpec : D_LINE int32 SQSTRING
\r
1376 | D_XLINE int32 QSTRING
\r
1379 fileDecl : D_FILE fileAttr name1 fileEntry hashHead bytes CLOSE_PARENS fileEntry
\r
1380 | D_FILE fileAttr name1 fileEntry
\r
1383 fileAttr : /* EMPTY */
\r
1384 | fileAttr K_NOMETADATA
\r
1387 fileEntry : /* EMPTY */
\r
1391 hashHead : D_HASH ASSIGN OPEN_PARENS
\r
1394 assemblyHead : D_ASSEMBLY asmAttr name1
\r
1397 // TODO: set assembly attrs
\r
1398 codegen.SetName ($3 as string);
\r
1403 asmAttr : /* EMPTY */
\r
1404 | asmAttr K_NOAPPDOMAIN
\r
1405 | asmAttr K_NOPROCESS
\r
1406 | asmAttr K_NOMACHINE
\r
1409 assemblyDecls : /* EMPTY */
\r
1410 | assemblyDecls assemblyDecl
\r
1413 assemblyDecl : D_HASH K_ALGORITHM int32
\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
1427 publicKeyHead : D_PUBLICKEY ASSIGN OPEN_PARENS
\r
1430 publicKeyTokenHead : D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS
\r
1433 localeHead : D_LOCALE ASSIGN OPEN_PARENS
\r
1436 assemblyRefHead : D_ASSEMBLY K_EXTERN name1
\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
1445 assemblyRefDecls : /* EMPTY */
\r
1446 | assemblyRefDecls assemblyRefDecl
\r
1449 assemblyRefDecl : hashHead bytes CLOSE_PARENS
\r
1451 | publicKeyTokenHead bytes CLOSE_PARENS
\r
1454 comtypeHead : D_CLASS K_EXTERN comtAttr name1
\r
1457 exportHead : D_EXPORT comtAttr name1
\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
1471 comtypeDecls : /* EMPTY */
\r
1472 | comtypeDecls comtypeDecl
\r
1475 comtypeDecl : D_FILE name1
\r
1476 | D_CLASS K_EXTERN name1
\r
1481 manifestResHead : D_MRESOURCE manresAttr name1
\r
1484 manresAttr : /* EMPTY */
\r
1485 | manresAttr K_PUBLIC
\r
1486 | manresAttr K_PRIVATE
\r
1489 manifestResDecls : /* EMPTY */
\r
1490 | manifestResDecls manifestResDecl
\r
1493 manifestResDecl : D_FILE name1 K_AT int32
\r
1494 | D_ASSEMBLY K_EXTERN name1
\r
1502 } // namespace Mono.ILASM
\r