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 CodeGen codegen;
\r
16 public ILParser (CodeGen codegen) {
\r
17 this.codegen = codegen;
\r
20 public CodeGen CodeGen {
\r
21 get { return codegen; }
\r
28 /* ID - alpha-numeric identifier */
\r
31 /* QSTRING - quoted string */
\r
34 /* SQSTRING - single quoted string */
\r
37 /* INT32 - 32 bit integer */
\r
40 /* INT64 - 64 bit integer */
\r
43 /* FLOAT64 - floating point number */
\r
46 /* HEXBYTE - two digit hex number */
\r
52 %token OPEN_BRACE "{"
\r
53 %token CLOSE_BRACE "}"
\r
54 %token OPEN_BRACKET "["
\r
55 %token CLOSE_BRACKET "]"
\r
56 %token OPEN_PARENS "("
\r
57 %token CLOSE_PARENS ")"
\r
60 %token DOUBLE_COLON "::"
\r
61 %token SEMICOLON ";"
\r
64 %token AMPERSAND "&"
\r
68 %token ELLIPSIS "..."
\r
77 /* INSTR_* instruction types */
\r
83 %token INSTR_BRTARGET
\r
101 /* Mechanically generated - DO NOT EDIT! */
\r
110 %token D_CAPABILITY
\r
120 %token D_ENTRYPOINT
\r
129 %token D_IMPLICITCOM
\r
135 %token D_MANIFESTRES
\r
142 %token D_ORIGINATOR
\r
148 %token D_PERMISSION
\r
149 %token D_PERMISSIONSET
\r
153 %token D_PUBLICKEYTOKEN
\r
170 %token K_IMPLICITCOM
\r
171 %token K_IMPLICITRES
\r
172 %token K_NOAPPDOMAIN
\r
196 %token K_RTSPECIALNAME
\r
197 %token K_SPECIALNAME
\r
199 %token K_FAMANDASSEM
\r
200 %token K_FAMORASSEM
\r
201 %token K_PRIVATESCOPE
\r
203 %token K_NOTSERIALIZED
\r
205 %token K_NOT_IN_GC_HEAP
\r
210 %token K_SEQUENTIAL
\r
215 %token K_SERIALIZABLE
\r
219 %token K_IMPLEMENTS
\r
224 %token K_UNMANAGEDEXP
\r
225 %token K_PINVOKEIMPL
\r
235 %token K_FORWARDREF
\r
237 %token K_INTERNALCALL
\r
238 %token K_SYNCHRONIZED
\r
239 %token K_NOINLINING
\r
280 %token K_USERDEFINED
\r
286 %token K_STREAMED_OBJECT
\r
287 %token K_STORED_OBJECT
\r
288 %token K_BLOB_OBJECT
\r
299 %token K_FROMUNMANAGED
\r
300 %token K_CALLMOSTDERIVED
\r
316 %token K_PERMITONLY
\r
318 %token K_INHERITCHECK
\r
322 %token K_PREJITGRANT
\r
323 %token K_PREJITDENY
\r
324 %token K_NONCASDEMAND
\r
325 %token K_NONCASLINKDEMAND
\r
326 %token K_NONCASINHERITANCE
\r
328 %token K_NOMETADATA
\r
330 %token K_FULLORIGIN
\r
334 %token K_ENABLEJITTRACKING
\r
335 %token K_DISABLEJITOPTIMIZER
\r
336 %token K_PRESERVESIG
\r
337 %token K_BEFOREFIELDINIT
\r
341 %token K_COMPILERCONTROLLED
\r
349 /* end generated */
\r
362 decls : /* EMPTY */
\r
380 | D_SUBSYSTEM int32
\r
382 | D_FILE K_ALIGNMENT int32
\r
383 /* | D_IMAGEBASE int64 */
\r
388 extsource_spec : D_LINE int32 SQSTRING
\r
390 | D_LINE int32 COLON int32 SQSTRING
\r
391 | D_LINE int32 COLON int32
\r
394 language_decl : D_LANGUAGE SQSTRING
\r
395 | D_LANGUAGE SQSTRING COMMA SQSTRING
\r
396 | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING
\r
399 vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET
\r
400 vtfixup_attr K_AT id
\r
403 vtfixup_attr : /* EMPTY */
\r
404 | vtfixup_attr int32
\r
405 | vtfixup_attr int64
\r
406 | vtfixup_attr K_FROMUNMANAGED
\r
407 | vtfixup_attr K_CALLMOSTDERIVED
\r
410 namespace_all : namespace_head OPEN_BRACE decls CLOSE_BRACE
\r
412 codegen.CurrentNameSpace = null;
\r
416 namespace_head : D_NAMESPACE comp_name
\r
418 codegen.CurrentNameSpace = (string) $2;
\r
422 class_all : class_head OPEN_BRACE class_decls
\r
425 codegen.CurrentClass = null;
\r
430 class_head : D_CLASS class_attr id extends_clause
\r
434 codegen.AddClass ((TypeAttr) $2, (string) $3,
\r
435 ((TypeRef)$4).Type as Class, null);
\r
437 codegen.AddClass ((TypeAttr)$2, (string) $3, null);
\r
440 ArrayList impl_list = (ArrayList) $5;
\r
441 if (impl_list != null) {
\r
442 foreach (TypeRef type_ref in impl_list)
\r
443 codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);
\r
448 class_attrs : class_attrs class_attr
\r
451 class_attr : /* EMPTY */ { $$ = new TypeAttr (); }
\r
452 | class_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }
\r
453 | class_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }
\r
454 | class_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }
\r
455 | class_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }
\r
456 | class_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }
\r
457 | class_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}
\r
458 | class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }
\r
459 | class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }
\r
460 | class_attr K_VALUE { }
\r
461 | class_attr K_ENUM { }
\r
462 | class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }
\r
463 | class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }
\r
464 | class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }
\r
465 | class_attr K_AUTO { }
\r
466 | class_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }
\r
467 | class_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }
\r
468 | class_attr K_ANSI { }
\r
469 | class_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }
\r
470 | class_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }
\r
471 | class_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; }
\r
472 | class_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }
\r
473 | class_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }
\r
474 | class_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }
\r
475 | class_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }
\r
478 extends_clause : /* EMPTY */
\r
479 | K_EXTENDS class_ref
\r
485 impl_clause : /* EMPTY */
\r
486 | K_IMPLEMENTS class_refs
\r
492 class_refs : class_ref
\r
494 ArrayList class_list = new ArrayList ();
\r
495 class_list.Add ($1);
\r
498 | class_refs COMMA class_ref
\r
500 ArrayList class_list = (ArrayList) $1;
\r
501 class_list.Add ($3);
\r
505 slashed_name : comp_name
\r
506 | slashed_name SLASH comp_name
\r
508 $$ = String.Format ("{0}/{1}", $1, $3);
\r
512 class_ref : OPEN_BRACKET comp_name CLOSE_BRACKET slashed_name
\r
514 PEAPI.Type type = codegen.ExternTable.GetClass ((string) $2, (string)$4);
\r
515 $$ = new TypeRef (type, (string) $4);
\r
517 | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET slashed_name
\r
520 $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),
\r
525 class_decls : /* EMPTY */
\r
526 | class_decls class_decl
\r
529 class_decl : method_all
\r
540 | D_OVERRIDE type_spec DOUBLE_COLON method_name
\r
541 K_WITH call_conv type type_spec DOUBLE_COLON method_name
\r
542 OPEN_PARENS sig_args CLOSE_PARENS
\r
546 type : K_CLASS class_ref
\r
552 $$ = new TypeRef (PrimitiveType.Object, "System.Object");
\r
556 $$ = new TypeRef (PrimitiveType.String, "System.String");
\r
558 | K_VALUE K_CLASS class_ref
\r
562 | K_VALUETYPE class_ref
\r
566 | type OPEN_BRACKET CLOSE_BRACKET
\r
568 TypeRef base_type = (TypeRef) $1;
\r
569 PEAPI.Type arr_type = new ZeroBasedArray (base_type.Type);
\r
570 $$ = new TypeRef (arr_type, base_type.FullName + "[]");
\r
572 | type OPEN_BRACKET bounds CLOSE_BRACKET
\r
574 TypeRef base_type = (TypeRef) $1;
\r
575 ArrayList bound_list = (ArrayList) $3;
\r
576 int dimen = bound_list.Count;
\r
577 int[] lower_array = new int[dimen];
\r
578 int[] size_array = new int[dimen];
\r
579 bool lower_set = false;
\r
580 bool size_set = false;
\r
581 bool prev_lower_set = true;
\r
582 bool prev_size_set = true;
\r
584 // TODO: There should probably be an error reported if
\r
585 // something like [3...,3...5] is done
\r
586 for (int i=0; i<dimen; i++) {
\r
587 DictionaryEntry bound = (DictionaryEntry) bound_list[i];
\r
589 if (bound.Key != null && prev_lower_set) {
\r
590 lower_array[i] = (int) bound.Key;
\r
593 prev_lower_set = false;
\r
595 if (bound.Value != null && prev_size_set) {
\r
596 size_array[i] = (int) bound.Value;
\r
599 prev_size_set = false;
\r
602 if (lower_set && size_set) {
\r
603 $$ = new BoundArray (base_type.Type,
\r
604 (uint) dimen, lower_array, size_array);
\r
605 } else if (size_set) {
\r
606 $$ = new BoundArray (base_type.Type,
\r
607 (uint) dimen, size_array);
\r
609 $$ = new BoundArray (base_type.Type, (uint) dimen);
\r
614 TypeRef base_type = $1 as TypeRef;
\r
615 PEAPI.Type ref_type = new ManagedPointer (base_type.Type);
\r
616 $$ = new TypeRef (ref_type, base_type.FullName + '&');
\r
620 TypeRef base_type = (TypeRef) $1;
\r
621 PEAPI.Type ptr_type = new UnmanagedPointer (base_type.Type);
\r
622 $$ = new TypeRef (ptr_type, base_type.FullName + '&');
\r
625 | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS
\r
626 | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS
\r
627 | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS
\r
631 $$ = new TypeRef (PrimitiveType.Char, "System.Char");
\r
635 $$ = new TypeRef (PrimitiveType.Void, "System.Void");
\r
639 $$ = new TypeRef (PrimitiveType.Boolean, "System.Bool");
\r
643 $$ = new TypeRef (PrimitiveType.Int8, "System.Int8");
\r
647 $$ = new TypeRef (PrimitiveType.Int16, "System.Int16");
\r
651 $$ = new TypeRef (PrimitiveType.Int32, "System.Int32");
\r
655 $$ = new TypeRef (PrimitiveType.Int64, "System.Int64");
\r
659 $$ = new TypeRef (PrimitiveType.Float32, "System.Float32");
\r
663 $$ = new TypeRef (PrimitiveType.Float64, "System.Float64");
\r
665 | K_UNSIGNED K_INT8
\r
667 $$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8");
\r
669 | K_UNSIGNED K_INT16
\r
671 $$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16");
\r
673 | K_UNSIGNED K_INT32
\r
675 $$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32");
\r
677 | K_UNSIGNED K_INT64
\r
679 $$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64");
\r
683 // TODO: Is this the proper full name
\r
684 $$ = new TypeRef (PrimitiveType.NativeInt, "native int");
\r
687 | K_NATIVE K_UNSIGNED K_INT
\r
689 // TODO: Is this the proper full name
\r
690 $$ = new TypeRef (PrimitiveType.NativeUInt, "native uint");
\r
696 ArrayList bound_list = new ArrayList ();
\r
697 bound_list.Add ($1);
\r
700 | bounds COMMA bound
\r
702 ArrayList bound_list = (ArrayList) $1;
\r
703 bound_list.Add ($3);
\r
707 bound : /* EMPTY */
\r
710 // No lower bound or size
\r
711 $$ = new DictionaryEntry (null,null);
\r
715 // ******** Not sure what this is?
\r
716 // For now I will say it is size because there
\r
717 // is allready a way to set lower
\r
718 $$ = new DictionaryEntry (null, $1);
\r
720 | int32 ELLIPSIS int32
\r
722 // lower bound and size
\r
723 $$ = new DictionaryEntry ($1, $3);
\r
727 // Just lower bound
\r
728 $$ = new DictionaryEntry ($1, null);
\r
732 call_conv : K_INSTANCE call_conv
\r
733 | K_EXPLICIT call_conv
\r
737 call_kind : /* EMPTY */
\r
740 | K_UNMANAGED K_CDECL
\r
741 | K_UNMANAGED K_STDCALL
\r
742 | K_UNMANAGED K_THISCALL
\r
743 | K_UNMANAGED K_FASTCALL
\r
746 native_type : /* EMPTY */
\r
747 | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS
\r
748 | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET
\r
749 | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET
\r
762 | K_UNSIGNED K_INT8
\r
763 | K_UNSIGNED K_INT16
\r
764 | K_UNSIGNED K_INT32
\r
765 | K_UNSIGNED K_INT64
\r
767 | native_type OPEN_BRACKET CLOSE_BRACKET
\r
768 | native_type OPEN_BRACKET int32 CLOSE_BRACKET
\r
769 | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET
\r
770 | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET
\r
782 | K_SAFEARRAY variant_type
\r
783 | K_SAFEARRAY variant_type COMMA comp_qstring
\r
786 | K_NESTED K_STRUCT
\r
796 variant_type : /* EMPTY */
\r
808 | K_UNSIGNED K_INT8
\r
809 | K_UNSIGNED K_INT16
\r
810 | K_UNSIGNED K_INT32
\r
811 | K_UNSIGNED K_INT64
\r
813 | variant_type OPEN_BRACKET CLOSE_BRACKET
\r
814 | variant_type K_VECTOR
\r
815 | variant_type AMPERSAND
\r
835 | K_STREAMED_OBJECT
\r
842 field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt
\r
845 repeat_opt : /* EMPTY */
\r
846 | OPEN_BRACKET int32 CLOSE_BRACKET
\r
849 field_attr : /* EMPTY */
\r
850 | field_attr K_PUBLIC
\r
851 | field_attr K_PRIVATE
\r
852 | field_attr K_FAMILY
\r
853 | field_attr K_ASSEMBLY
\r
854 | field_attr K_FAMANDASSEM
\r
855 | field_attr K_FAMORASSEM
\r
856 | field_attr K_PRIVATESCOPE
\r
857 | field_attr K_STATIC
\r
858 | field_attr K_INITONLY
\r
859 | field_attr K_RTSPECIALNAME
\r
860 | field_attr K_SPECIALNAME
\r
861 | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
862 | field_attr K_LITERAL
\r
863 | field_attr K_NOTSERIALIZED
\r
866 at_opt : /* EMPTY */
\r
870 init_opt : /* EMPTY */
\r
871 | ASSIGN field_init
\r
874 field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
\r
875 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS
\r
876 | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS
\r
877 | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS
\r
878 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS
\r
879 | K_INT32 OPEN_PARENS int64 CLOSE_PARENS
\r
880 | K_INT16 OPEN_PARENS int64 CLOSE_PARENS
\r
881 | K_CHAR OPEN_PARENS int64 CLOSE_PARENS
\r
882 | K_INT8 OPEN_PARENS int64 CLOSE_PARENS
\r
883 | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS
\r
884 | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS
\r
885 | comp_qstring // ******** ADDED
\r
889 data_decl : data_head data_body
\r
892 data_head : D_DATA tls id ASSIGN
\r
900 data_body : OPEN_BRACE dataitem_list CLOSE_BRACE
\r
904 dataitem_list : dataitem
\r
905 | dataitem_list COMMA dataitem
\r
908 dataitem : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS
\r
909 | AMPERSAND OPEN_PARENS id CLOSE_PARENS
\r
910 | K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
911 | K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS // ******** ADDED
\r
912 | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
913 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
914 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt
\r
915 | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
916 | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
917 | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
918 | K_FLOAT32 repeat_opt
\r
919 | K_FLOAT64 repeat_opt
\r
920 | K_INT64 repeat_opt
\r
921 | K_INT32 repeat_opt
\r
922 | K_INT16 repeat_opt
\r
923 | K_INT8 repeat_opt
\r
926 method_all : method_head OPEN_BRACE method_decls CLOSE_BRACE
\r
929 method_head : D_METHOD meth_attr call_conv param_attr type method_name
\r
930 OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
931 | D_METHOD meth_attr call_conv param_attr type
\r
932 K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name
\r
933 OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
936 meth_attr : /* EMPTY */
\r
937 | meth_attr K_STATIC
\r
938 | meth_attr K_PUBLIC
\r
939 | meth_attr K_PRIVATE
\r
940 | meth_attr K_FAMILY
\r
941 | meth_attr K_ASSEMBLY
\r
942 | meth_attr K_FAMANDASSEM
\r
943 | meth_attr K_FAMORASSEM
\r
944 | meth_attr K_PRIVATESCOPE
\r
945 | meth_attr K_FINAL
\r
946 | meth_attr K_VIRTUAL
\r
947 | meth_attr K_ABSTRACT
\r
948 | meth_attr K_HIDEBYSIG
\r
949 | meth_attr K_NEWSLOT
\r
950 | meth_attr K_REQSECOBJ
\r
951 | meth_attr K_SPECIALNAME
\r
952 | meth_attr K_RTSPECIALNAME
\r
953 | meth_attr K_UNMANAGEDEXP
\r
954 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS
\r
955 comp_qstring pinv_attr CLOSE_PARENS
\r
956 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS
\r
957 | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS
\r
960 pinv_attr : /* EMPTY */
\r
961 | pinv_attr K_NOMANGLE
\r
963 | pinv_attr K_UNICODE
\r
964 | pinv_attr K_AUTOCHAR
\r
965 | pinv_attr K_LASTERR
\r
966 | pinv_attr K_WINAPI
\r
967 | pinv_attr K_CDECL
\r
968 | pinv_attr K_STDCALL
\r
969 | pinv_attr K_THISCALL
\r
970 | pinv_attr K_FASTCALL
\r
973 method_name : D_CTOR
\r
978 param_attr : /* EMPTY */
\r
979 | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET
\r
980 | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET
\r
981 | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET
\r
984 impl_attr : /* EMPTY */
\r
985 | impl_attr K_NATIVE
\r
987 | impl_attr K_OPTIL
\r
988 | impl_attr K_MANAGED
\r
989 | impl_attr K_UNMANAGED
\r
990 | impl_attr K_FORWARDREF
\r
991 | impl_attr K_PRESERVESIG
\r
992 | impl_attr K_RUNTIME
\r
993 | impl_attr K_INTERNALCALL
\r
994 | impl_attr K_SYNCHRONIZED
\r
995 | impl_attr K_NOINLINING
\r
998 sig_args : /* EMPTY */
\r
1002 sig_arg_list : sig_arg
\r
1003 | sig_arg_list COMMA sig_arg
\r
1006 sig_arg : param_attr type
\r
1007 | param_attr type id
\r
1008 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
1009 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id
\r
1012 method_decls : /* EMPTY */
\r
1013 | method_decls method_decl
\r
1016 method_decl : D_EMITBYTE int32
\r
1017 | D_MAXSTACK int32
\r
1018 | D_LOCALS OPEN_PARENS sig_args CLOSE_PARENS
\r
1019 | D_LOCALS K_INIT OPEN_PARENS sig_args CLOSE_PARENS
\r
1022 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET
\r
1023 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id
\r
1024 | D_VTENTRY int32 COLON int32
\r
1025 | D_OVERRIDE type_spec DOUBLE_COLON method_name
\r
1027 | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt
\r
1038 type_spec : class_ref
\r
1039 | OPEN_BRACKET comp_name CLOSE_BRACKET
\r
1040 | OPEN_BRACKET D_MODULE comp_name CLOSE_BRACKET
\r
1044 scope_block : OPEN_BRACE method_decls CLOSE_BRACE
\r
1047 seh_block : try_block seh_clauses
\r
1050 try_block : D_TRY scope_block
\r
1051 | D_TRY id K_TO id
\r
1052 | D_TRY int32 K_TO int32
\r
1055 seh_clauses : seh_clause
\r
1056 | seh_clauses seh_clause
\r
1059 seh_clause : K_CATCH class_ref handler_block
\r
1060 | K_FINALLY handler_block
\r
1061 | K_FAULT handler_block
\r
1062 | filter_clause handler_block
\r
1065 filter_clause : K_FILTER scope_block
\r
1070 handler_block : scope_block
\r
1071 | K_HANDLER id K_TO id
\r
1072 | K_HANDLER int32 K_TO int32
\r
1075 instr : INSTR_NONE
\r
1078 | INSTR_I id /* Allow variable names :p */
\r
1082 | INSTR_R OPEN_PARENS bytes CLOSE_PARENS
\r
1083 | INSTR_BRTARGET int32
\r
1084 | INSTR_BRTARGET id
\r
1085 | INSTR_METHOD method_ref
\r
1086 | INSTR_FIELD type type_spec DOUBLE_COLON id
\r
1087 | INSTR_FIELD type id
\r
1088 | INSTR_TYPE K_FIELD type type_spec DOUBLE_COLON id // ****** ADDED
\r
1089 | INSTR_TYPE K_FIELD type id // ****** ADDED
\r
1090 | INSTR_TYPE type_spec
\r
1091 | INSTR_STRING comp_qstring
\r
1092 | INSTR_STRING K_BYTEARRAY ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1093 | INSTR_STRING K_BYTEARRAY OPEN_PARENS bytes CLOSE_PARENS // ****** ADDED
\r
1094 | INSTR_SIG call_conv type OPEN_PARENS sig_args CLOSE_PARENS
\r
1095 | INSTR_TOK owner_type
\r
1096 | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS
\r
1099 method_ref : call_conv type type_spec DOUBLE_COLON method_name
\r
1100 OPEN_PARENS sig_args CLOSE_PARENS
\r
1101 | call_conv type method_name
\r
1102 OPEN_PARENS sig_args CLOSE_PARENS
\r
1105 labels : /* EMPTY */
\r
1109 | labels COMMA int32
\r
1112 owner_type : type_spec
\r
1116 member_ref : K_METHOD member_ref
\r
1117 | K_FIELD type type_spec DOUBLE_COLON id
\r
1121 event_all : event_head OPEN_BRACE event_decls CLOSE_BRACE
\r
1124 event_head : D_EVENT event_attr type_spec id
\r
1125 | D_EVENT event_attr id
\r
1128 event_attr : /* EMPTY */
\r
1129 | event_attr K_RTSPECIALNAME
\r
1130 | event_attr K_SPECIALNAME
\r
1133 event_decls : /* EMPTY */
\r
1134 | event_decls event_decl
\r
1137 event_decl : D_ADDON method_ref
\r
1138 | D_REMOVEON method_ref
\r
1139 | D_FIRE method_ref
\r
1140 | D_OTHER method_ref
\r
1146 prop_all : prop_head OPEN_BRACE prop_decls CLOSE_BRACE
\r
1149 prop_head : D_PROPERTY prop_attr type id OPEN_PARENS sig_args CLOSE_PARENS init_opt
\r
1152 prop_attr : /* EMPTY */
\r
1153 | prop_attr K_RTSPECIALNAME
\r
1154 | prop_attr K_SPECIALNAME
\r
1157 prop_decls : /* EMPTY */
\r
1158 | prop_decls prop_decl
\r
1161 prop_decl : D_SET method_ref
\r
1162 | D_GET method_ref
\r
1163 | D_OTHER method_ref
\r
1169 customattr_decl : D_CUSTOM custom_type
\r
1170 | D_CUSTOM custom_type ASSIGN comp_qstring
\r
1171 | D_CUSTOM custom_type ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1172 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type
\r
1173 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring
\r
1174 | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN
\r
1175 OPEN_PARENS bytes CLOSE_PARENS
\r
1178 custom_type : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS sig_args CLOSE_PARENS
\r
1179 | call_conv type D_CTOR OPEN_PARENS sig_args CLOSE_PARENS
\r
1182 sec_decl : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS
\r
1183 | D_PERMISSION sec_action type_spec
\r
1184 | D_PERMISSIONSET sec_action ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1187 nameval_pairs : nameval_pair
\r
1188 | nameval_pairs COMMA nameval_pair
\r
1191 nameval_pair : comp_qstring ASSIGN cavalue
\r
1194 cavalue : truefalse
\r
1196 | int32 OPEN_PARENS int32 CLOSE_PARENS
\r
1198 | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS
\r
1199 | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS
\r
1200 | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS
\r
1201 | class_ref OPEN_PARENS int32 CLOSE_PARENS
\r
1204 sec_action : K_REQUEST
\r
1217 | K_NONCASLINKDEMAND
\r
1218 | K_NONCASINHERITANCE
\r
1221 module_head : D_MODULE
\r
1222 | D_MODULE comp_name
\r
1223 | D_MODULE K_EXTERN comp_name
\r
1226 file_decl : D_FILE file_attr comp_name file_entry D_HASH ASSIGN
\r
1227 OPEN_PARENS bytes CLOSE_PARENS file_entry
\r
1228 | D_FILE file_attr comp_name file_entry
\r
1231 file_attr : /* EMPTY */
\r
1232 | file_attr K_NOMETADATA
\r
1235 file_entry : /* EMPTY */
\r
1239 assembly_all : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE
\r
1242 assembly_head : D_ASSEMBLY asm_attr comp_name
\r
1245 asm_attr : /* EMPTY */
\r
1246 | asm_attr K_NOAPPDOMAIN
\r
1247 | asm_attr K_NOPROCESS
\r
1248 | asm_attr K_NOMACHINE
\r
1251 assembly_decls : /* EMPTY */
\r
1252 | assembly_decls assembly_decl
\r
1255 assembly_decl : D_HASH K_ALGORITHM int32
\r
1260 asm_or_ref_decl : D_PUBLICKEY ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1261 | D_VER int32 COLON int32 COLON int32 COLON int32
\r
1262 | D_LOCALE comp_qstring
\r
1263 | D_LOCALE ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1267 assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE
\r
1270 assemblyref_head : D_ASSEMBLY K_EXTERN comp_name
\r
1271 | D_ASSEMBLY K_EXTERN comp_name K_AS comp_name
\r
1274 assemblyref_decls : /* EMPTY */
\r
1275 | assemblyref_decls assemblyref_decl
\r
1278 assemblyref_decl : D_HASH ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1280 | D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS bytes CLOSE_PARENS
\r
1283 exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE
\r
1286 exptype_head : D_CLASS K_EXTERN expt_attr comp_name
\r
1289 expt_attr : /* EMPTY */
\r
1290 | expt_attr K_PRIVATE
\r
1291 | expt_attr K_PUBLIC
\r
1292 | expt_attr K_NESTED K_PUBLIC
\r
1293 | expt_attr K_NESTED K_PRIVATE
\r
1294 | expt_attr K_NESTED K_FAMILY
\r
1295 | expt_attr K_NESTED K_ASSEMBLY
\r
1296 | expt_attr K_NESTED K_FAMANDASSEM
\r
1297 | expt_attr K_NESTED K_FAMORASSEM
\r
1300 exptype_decls : /* EMPTY */
\r
1301 | exptype_decls exptype_decl
\r
1304 exptype_decl : D_FILE comp_name
\r
1305 | D_CLASS K_EXTERN comp_name
\r
1310 manifestres_all : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE
\r
1313 manifestres_head : D_MRESOURCE manres_attr comp_name
\r
1316 manres_attr : /* EMPTY */
\r
1317 | manres_attr K_PUBLIC
\r
1318 | manres_attr K_PRIVATE
\r
1321 manifestres_decls : /* EMPTY */
\r
1322 | manifestres_decls manifestres_decl
\r
1325 manifestres_decl : D_FILE comp_name K_AT int32
\r
1326 | D_ASSEMBLY K_EXTERN comp_name
\r
1331 | dotted_name DOT id { $$ = String.Format ("{0}.{1}", $1, $3); }
\r
1334 comp_qstring : QSTRING
\r
1335 | comp_qstring PLUS QSTRING { $$ = String.Format ("{0}{1}", $1, $3); }
\r
1347 | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS
\r
1348 | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1352 | INT32 // ******** ADDED
\r
1353 | ID // ******** ADDED
\r
1356 bytes : /* EMPTY */
\r
1360 hexbytes : hexbyte
\r
1361 | hexbytes hexbyte
\r
1364 truefalse : K_TRUE
\r
1377 | dotted_name DOT id
\r