%{\r
-// Mono::ILASM::ILParser\r
//\r
+// Mono::ILASM::ILParser\r
+// \r
// (C) Sergey Chaban (serge@wildwestsoftware.com)\r
+// (C) 2003 Jackson Harper, All rights reserved\r
+//\r
\r
using PEAPI;\r
using System;\r
+using System.IO;\r
using System.Collections;\r
+using System.Globalization;\r
\r
namespace Mono.ILASM {\r
\r
\r
private CodeGen codegen;\r
\r
- public ILParser (CodeGen codegen) {\r
+ private bool is_value_class;\r
+ private bool is_enum_class;\r
+ private bool pinvoke_info;\r
+ private string pinvoke_mod;\r
+ private string pinvoke_meth;\r
+ private PEAPI.PInvokeAttr pinvoke_attr;\r
+ private ILTokenizer tokenizer;\r
+ \r
+ public ILParser (CodeGen codegen, ILTokenizer tokenizer)\r
+ {\r
this.codegen = codegen;\r
+ this.tokenizer = tokenizer;\r
}\r
\r
public CodeGen CodeGen {\r
get { return codegen; }\r
}\r
- \r
+\r
+ private ITypeRef GetTypeRef (ITypeRef b)\r
+ {\r
+ ExternTypeRefInst etri = b as ExternTypeRefInst;\r
+ ExternTypeRef etr;\r
+\r
+ if (etri != null)\r
+ return etri.Clone ();\r
+\r
+ etr = b as ExternTypeRef;\r
+ if (etr != null)\r
+ return etr.Clone ();\r
+\r
+ return b;\r
+ }\r
%}\r
\r
%token EOF\r
/* SQSTRING - single quoted string */\r
%token SQSTRING\r
\r
+/* COMP_NAME - A name with dots */\r
+%token COMP_NAME\r
+\r
/* INT32 - 32 bit integer */\r
%token INT32\r
\r
/* FLOAT64 - floating point number */\r
%token FLOAT64\r
\r
+/* HEXBYTE - two digit hex number */\r
+%token HEXBYTE\r
\r
\r
/* Punctuation */\r
%token BANG "!"\r
%token ELLIPSIS "..."\r
%token DASH "-"\r
-\r
+%token OPEN_ANGLE_BRACKET "<"\r
+%token CLOSE_ANGLE_BRACKET ">"\r
\r
\r
\r
%token INSTR_TOK\r
%token INSTR_SWITCH\r
%token INSTR_PHI\r
-\r
-\r
+%token INSTR_LOCAL\r
+%token INSTR_PARAM\r
\r
\r
\r
%token D_CLASS\r
%token D_COMTYPE\r
%token D_CONFIG\r
+%token D_CONSTRAINT\r
+%token D_IMAGEBASE\r
%token D_CORFLAGS\r
%token D_CTOR\r
%token D_CUSTOM\r
%token K_NOMETADATA\r
%token K_ALGORITHM\r
%token K_FULLORIGIN\r
-%token K_NAN\r
-%token K_INF\r
+// %token K_NAN\r
+// %token K_INF\r
%token K_PUBLICKEY\r
%token K_ENABLEJITTRACKING\r
%token K_DISABLEJITOPTIMIZER\r
%token K_STRING\r
%token K_TRUE\r
%token K_FALSE\r
+%token K_IS\r
\r
/* end generated */\r
\r
%%\r
\r
il_file : decls\r
- ; \r
-\r
-decls : /* EMPTY */\r
- | decls decl \r
- ;\r
-\r
-decl : classAll\r
- | nameSpaceHead OPEN_BRACE decls CLOSE_BRACE { codegen.CurrentNameSpace = String.Empty; }\r
- | methodAll\r
- | fieldDecl\r
- | dataDecl\r
- | vtableDecl\r
- | vtfixupDecl\r
- | extSourceSpec\r
- | fileDecl\r
- | assemblyHead OPEN_BRACE assemblyDecls CLOSE_BRACE \r
- | assemblyRefHead OPEN_BRACE assemblyRefDecls CLOSE_BRACE \r
- | comtypeHead OPEN_BRACE comtypeDecls CLOSE_BRACE \r
- | manifestResHead OPEN_BRACE manifestResDecls CLOSE_BRACE \r
- | moduleHead\r
- | secDecl\r
- | customAttrDecl\r
- | D_SUBSYSTEM int32 \r
- | D_CORFLAGS int32 \r
- | D_FILE K_ALIGNMENT int32 \r
- | languageDecl\r
- ;\r
-\r
-compQstring : QSTRING \r
- | compQstring PLUS QSTRING {$$ = ($1 as string) + ($3 as string);}\r
- ;\r
-\r
-languageDecl : D_LANGUAGE SQSTRING \r
- | D_LANGUAGE SQSTRING COMMA SQSTRING \r
- | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING \r
- ;\r
-\r
-customAttrDecl : D_CUSTOM customType \r
- | D_CUSTOM customType ASSIGN compQstring \r
- | customHead bytes CLOSE_PARENS \r
- | D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType \r
- | D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN compQstring \r
- | customHeadWithOwner bytes CLOSE_PARENS \r
- ;\r
-\r
-moduleHead : D_MODULE \r
- | D_MODULE name1 \r
- | D_MODULE K_EXTERN name1 \r
- ;\r
-\r
-vtfixupDecl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET vtfixupAttr K_AT id \r
- ;\r
-\r
-vtfixupAttr : /* EMPTY */ \r
- | vtfixupAttr K_INT32 \r
- | vtfixupAttr K_INT64 \r
- | vtfixupAttr K_FROMUNMANAGED \r
- | vtfixupAttr K_CALLMOSTDERIVED \r
- ;\r
-\r
-vtableDecl : vtableHead bytes CLOSE_PARENS \r
- ;\r
-\r
-vtableHead : D_VTABLE ASSIGN OPEN_PARENS \r
;\r
\r
-nameSpaceHead : D_NAMESPACE name1 \r
- {\r
- codegen.CurrentNameSpace = (string) $2;\r
- }\r
- ;\r
-\r
-classHead : D_CLASS type_attr id extendsClause implClause\r
- {\r
- if ($4 != null) {\r
- codegen.AddClass ((TypeAttr) $2, (string) $3, \r
- ((TypeRef)$4).Type as Class, null);\r
- } else {\r
- codegen.AddClass ((TypeAttr)$2, (string) $3, null);\r
- }\r
+decls : /* EMPTY */\r
+ | decls decl\r
+ ;\r
+\r
+decl : class_all\r
+ | namespace_all\r
+ | method_all\r
+ | field_decl\r
+ | data_decl\r
+ | vtfixup_decl\r
+ | file_decl\r
+ | assembly_all\r
+ | assemblyref_all\r
+ | exptype_all\r
+ | manifestres_all\r
+ | module_head\r
+ | sec_decl\r
+ | customattr_decl\r
+ | D_SUBSYSTEM int32\r
+ {\r
+ codegen.SetSubSystem ((int) $2);\r
+ }\r
+ | D_CORFLAGS int32\r
+ {\r
+ codegen.SetCorFlags ((int) $2);\r
+ }\r
+ | D_FILE K_ALIGNMENT int32\r
+ | D_IMAGEBASE int64\r
+ {\r
+ codegen.SetImageBase ((long) $2);\r
+ }\r
+ | extsource_spec\r
+ | language_decl\r
+ ;\r
+\r
+extsource_spec : D_LINE int32 SQSTRING\r
+ | D_LINE int32\r
+ | D_LINE int32 COLON int32 SQSTRING\r
+ | D_LINE int32 COLON int32\r
+ ;\r
+\r
+language_decl : D_LANGUAGE SQSTRING\r
+ | D_LANGUAGE SQSTRING COMMA SQSTRING\r
+ | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
+ ;\r
+\r
+constraint_decl : D_CONSTRAINT BANG int32 K_IS type\r
+ {\r
+ codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5);\r
+ }\r
+ ;\r
+ \r
+vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
+ vtfixup_attr K_AT id\r
+ ;\r
+\r
+vtfixup_attr : /* EMPTY */\r
+ | vtfixup_attr K_INT32\r
+ | vtfixup_attr K_INT64\r
+ | vtfixup_attr K_FROMUNMANAGED\r
+ | vtfixup_attr K_CALLMOSTDERIVED\r
+ ;\r
+\r
+namespace_all : namespace_head OPEN_BRACE decls CLOSE_BRACE\r
+ {\r
+ codegen.CurrentNameSpace = null;\r
+ }\r
+ ;\r
+\r
+namespace_head : D_NAMESPACE comp_name\r
+ {\r
+ codegen.CurrentNameSpace = (string) $2;\r
+ }\r
+ ;\r
+\r
+class_all : class_head OPEN_BRACE class_decls CLOSE_BRACE\r
+ {\r
+ codegen.EndTypeDef ();\r
+ }\r
+ ;\r
+\r
+class_head : D_CLASS class_attr id formal_typars_clause extends_clause\r
+ impl_clause\r
+ {\r
+ codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
+ $5 as IClassRef, $6 as ArrayList, null);\r
\r
- ArrayList impl_list = (ArrayList) $5;\r
- if (impl_list != null) {\r
- foreach (TypeRef type_ref in impl_list)\r
- codegen.CurrentClass.AddImplementedInterface (type_ref.Type as Class);\r
- }\r
- }\r
- ;\r
-\r
-type_attr : /* EMPTY */ { $$ = new TypeAttr (); }\r
- | type_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }\r
- | type_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
- | type_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
- | type_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
- | type_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
- | type_attr K_AUTO { /* */ }\r
- | type_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
- | type_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
- | type_attr K_ANSI { /* */ }\r
- | type_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
- | type_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
- | type_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
- | type_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
- | type_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
- | type_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
- | type_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
- | type_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly; }\r
- | type_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
- | type_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
- | type_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
- | type_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
- | type_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
- ;\r
-\r
-classAttr : /* EMPTY */ \r
- | classAttr K_PUBLIC { /* currentTypeAttrs |= TypeAttributes.Public; */}\r
- | classAttr K_PRIVATE { /* currentTypeAttrs &= ~TypeAttributes.Public; */}\r
- | classAttr K_VALUE { /* FIXME */ }\r
- | classAttr K_ENUM { /* FIXME */ }\r
- | classAttr K_INTERFACE { /* currentTypeAttrs |= TypeAttributes.Interface; */ }\r
- | classAttr K_SEALED { /* currentTypeAttrs |= TypeAttributes.Sealed; */ }\r
- | classAttr K_ABSTRACT { /* currentTypeAttrs |= TypeAttributes.Abstract; */ }\r
- | classAttr K_AUTO { /* currentTypeAttrs |= TypeAttributes.AutoLayout; */ }\r
- | classAttr K_SEQUENTIAL { /* currentTypeAttrs |= TypeAttributes.SequentialLayout; */ }\r
- | classAttr K_EXPLICIT { /* currentTypeAttrs |= TypeAttributes.ExplicitLayout; */ }\r
- | classAttr K_ANSI { /* currentTypeAttrs |= TypeAttributes.AnsiClass; */ }\r
- | classAttr K_UNICODE { /* currentTypeAttrs |= TypeAttributes.UnicodeClass; */ }\r
- | classAttr K_AUTOCHAR { /* currentTypeAttrs |= TypeAttributes.AutoClass; */ }\r
- | classAttr K_IMPORT { /* currentTypeAttrs |= TypeAttributes.Import; */ }\r
- | classAttr K_SERIALIZABLE { /* currentTypeAttrs |= TypeAttributes.Serializable; */ }\r
- | classAttr K_NESTED K_PUBLIC { /* currentTypeAttrs |= TypeAttributes.NestedPublic; */ }\r
- | classAttr K_NESTED K_PRIVATE { /* currentTypeAttrs |= TypeAttributes.NestedPrivate; */ }\r
- | classAttr K_NESTED K_FAMILY { /* currentTypeAttrs |= TypeAttributes.NestedFamily; */ }\r
- | classAttr K_NESTED K_ASSEMBLY { /* currentTypeAttrs |= TypeAttributes.NestedAssembly; */ }\r
- | classAttr K_NESTED K_FAMANDASSEM { /* currentTypeAttrs |= TypeAttributes.NestedFamANDAssem; */ }\r
- | classAttr K_NESTED K_FAMORASSEM { /* currentTypeAttrs |= TypeAttributes.NestedFamORAssem; */ }\r
- | classAttr K_BEFOREFIELDINIT { /* currentTypeAttrs |= TypeAttributes.BeforeFieldInit; */ }\r
- | classAttr K_SPECIALNAME { /* currentTypeAttrs |= TypeAttributes.SpecialName; */ }\r
- | classAttr K_RTSPECIALNAME { /* currentTypeAttrs |= TypeAttributes.RTSpecialName; */ }\r
- ;\r
-\r
-extendsClause : /* EMPTY */ \r
- | K_EXTENDS class_ref {$$ = $2;}\r
- ;\r
-\r
-implClause : /* EMPTY */\r
- | K_IMPLEMENTS classNames {$$ = $2; }\r
- ;\r
-\r
-classNames : classNames COMMA class_ref\r
- {\r
- ArrayList class_list = (ArrayList) $1;\r
- class_list.Add ($3);\r
- }\r
- | class_ref\r
- {\r
- ArrayList class_list = new ArrayList ();\r
- class_list.Add ($1);\r
- $$ = class_list;\r
- }\r
- ;\r
+ if (is_value_class)\r
+ codegen.CurrentTypeDef.MakeValueClass ();\r
+ if (is_enum_class)\r
+ codegen.CurrentTypeDef.MakeEnumClass ();\r
\r
-classDecls : /* EMPTY */\r
- | classDecls classDecl\r
+ if ($4 != null) {\r
+ ArrayList typars_list = (ArrayList) $4;\r
+ foreach (string id in typars_list)\r
+ codegen.CurrentTypeDef.AddGenericParam (id);\r
+ } \r
+ }\r
;\r
\r
-\r
-classAll : classHead OPEN_BRACE classDecls CLOSE_BRACE\r
- {\r
- /*\r
- codegen.AddClass (currentClass);\r
- currentClass = null;\r
- */\r
- }\r
+class_attrs : class_attrs class_attr\r
;\r
\r
-\r
-classDecl : methodAll\r
- | classAll\r
- | eventHead OPEN_BRACE eventDecls CLOSE_BRACE \r
- | propHead OPEN_BRACE propDecls CLOSE_BRACE \r
- | fieldDecl\r
- | dataDecl\r
- | secDecl\r
- | extSourceSpec\r
- | customAttrDecl\r
- | D_SIZE int32 \r
- | D_PACK int32 \r
- | exportHead OPEN_BRACE comtypeDecls CLOSE_BRACE \r
- | D_OVERRIDE typeSpec DOUBLE_COLON methodName K_WITH callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | languageDecl\r
- ;\r
-\r
-fieldDecl : D_FIELD repeatOpt fieldAttr type_ref id atOpt initOpt \r
- {\r
- codegen.AddField ((FieldAttr) $3, \r
- (string) $5, (TypeRef) $4, null);\r
+class_attr : /* EMPTY */ \r
+ { \r
+ // Reset some flags\r
+ is_value_class = false;\r
+ is_enum_class = false;\r
+ $$ = new TypeAttr ();\r
}\r
- ;\r
-\r
-type_ref : primative_type_ref\r
- | internal_type_ref\r
- | external_type_ref\r
- ;\r
-\r
-class_ref : internal_type_ref\r
- | external_type_ref\r
- ;\r
-\r
-primative_type_ref : K_CHAR \r
- {$$ = new TypeRef (PrimitiveType.Char, "System.Char"); }\r
- | K_VOID \r
- {$$ = new TypeRef (PrimitiveType.Void, "System.Void"); }\r
- | K_BOOL \r
- {$$ = new TypeRef (PrimitiveType.Boolean, "System.Bool"); }\r
- | K_INT8 \r
- {$$ = new TypeRef (PrimitiveType.Int8, "System.Int8"); }\r
- | K_INT16 \r
- {$$ = new TypeRef (PrimitiveType.Int16, "System.Int16"); }\r
- | K_INT32 \r
- {$$ = new TypeRef (PrimitiveType.Int32, "System.Int32"); }\r
- | K_INT64 \r
- {$$ = new TypeRef (PrimitiveType.Int64, "System.Int64"); }\r
- | K_FLOAT32 \r
- {$$ = new TypeRef (PrimitiveType.Float32, "System.Float32"); }\r
- | K_FLOAT64 \r
- {$$ = new TypeRef (PrimitiveType.Float64, "System.Float64"); }\r
- | K_UNSIGNED K_INT8 \r
- {$$ = new TypeRef (PrimitiveType.UInt8, "System.UInt8"); }\r
- | K_UNSIGNED K_INT16 \r
- {$$ = new TypeRef (PrimitiveType.UInt16, "System.UInt16"); }\r
- | K_UNSIGNED K_INT32 \r
- {$$ = new TypeRef (PrimitiveType.UInt32, "System.UInt32"); }\r
- | K_UNSIGNED K_INT64 \r
- {$$ = new TypeRef (PrimitiveType.UInt64, "System.UInt64"); }\r
- | K_STRING \r
- {$$ = new TypeRef (PrimitiveType.String, "System.String"); }\r
- ;\r
-\r
-internal_type_ref : name1\r
- {\r
- $$ = new TypeRef (codegen.ClassTable.GetReference ((string) $1, null),\r
- (string) $1);\r
+ | class_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; } \r
+ | class_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
+ | class_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
+ | class_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
+ | class_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
+ | class_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
+ | class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
+ | class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
+ | class_attr K_VALUE { is_value_class = true; }\r
+ | class_attr K_ENUM { is_enum_class = true; is_value_class = true;\r
}\r
- ;\r
-\r
-external_type_ref : assembly_name namespace_name DOT id\r
+ | class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
+ | class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
+ | class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
+ | class_attr K_AUTO { }\r
+ | class_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }\r
+ | class_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }\r
+ | class_attr K_ANSI { }\r
+ | class_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }\r
+ | class_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }\r
+ | class_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; }\r
+ | class_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }\r
+ | class_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }\r
+ | class_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }\r
+ | class_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }\r
+ ;\r
+\r
+extends_clause : /* EMPTY */\r
+ | K_EXTENDS class_ref\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+impl_clause : /* EMPTY */\r
+ | K_IMPLEMENTS class_refs\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+formal_typars_clause : /* EMPTY */\r
+ | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+typars_clause : /* EMPTY */\r
+ | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+typars : type\r
+ {\r
+ ArrayList typars_list = new ArrayList ();\r
+ typars_list.Add ($1);\r
+ $$ = typars_list;\r
+ }\r
+ | typars COMMA type\r
+ {\r
+ ArrayList typars_list = (ArrayList) $1;\r
+ typars_list.Add ($3);\r
+ $$ = typars_list;\r
+ }\r
+ ;\r
+\r
+formal_typars : formal_typar\r
+ {\r
+ ArrayList formal_list = new ArrayList ();\r
+ formal_list.Add ($1);\r
+ $$ = formal_list;\r
+ }\r
+ | formal_typars COMMA formal_typar\r
+ {\r
+ ArrayList formal_list = (ArrayList) $1;\r
+ formal_list.Add ($3);\r
+ $$ = formal_list;\r
+ }\r
+ ;\r
+\r
+\r
+formal_typar : id\r
+ {\r
+ $$ = $1;\r
+ }\r
+ ;\r
+ \r
+class_refs : class_ref\r
+ {\r
+ ArrayList class_list = new ArrayList ();\r
+ class_list.Add ($1);\r
+ $$ = class_list; \r
+ }\r
+ | class_refs COMMA class_ref\r
+ {\r
+ ArrayList class_list = (ArrayList) $1;\r
+ class_list.Add ($3);\r
+ }\r
+ ;\r
+\r
+slashed_name : comp_name\r
+ | slashed_name SLASH comp_name\r
+ {\r
+ $$ = String.Format ("{0}/{1}", $1, $3);\r
+ }\r
+ ;\r
+\r
+class_ref : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
+ {\r
+ if (codegen.IsThisAssembly ((string) $2)) {\r
+ $$ = new TypeRef ((string) $4, false, null);\r
+ } else {\r
+ $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);\r
+ }\r
+ }\r
+ | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name\r
+ {\r
+ if (codegen.IsThisModule ((string) $3)) {\r
+ $$ = new TypeRef ((string) $5, false, null);\r
+ } else {\r
+ $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);\r
+ }\r
+ }\r
+ | slashed_name\r
+ {\r
+ PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);\r
+\r
+ if (prim != null)\r
+ $$ = prim;\r
+ else\r
+ $$ = new TypeRef ((string) $1, false, null);\r
+ }\r
+ \r
+ ;\r
+\r
+class_decls : /* EMPTY */\r
+ | class_decls class_decl\r
+ ;\r
+\r
+class_decl : method_all\r
+ | class_all\r
+ | event_all\r
+ | prop_all\r
+ | field_decl\r
+ | data_decl\r
+ | sec_decl\r
+ | extsource_spec\r
+ | customattr_decl\r
+ {\r
+ codegen.CurrentTypeDef.AddCustomAttribute ((CustomAttr) $1);\r
+ }\r
+ | D_SIZE int32\r
+ {\r
+ codegen.CurrentTypeDef.SetSize ((int) $2);\r
+ }\r
+ | D_PACK int32\r
+ {\r
+ codegen.CurrentTypeDef.SetPack ((int) $2);\r
+ }\r
+ | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type\r
+ type_spec DOUBLE_COLON method_name type_list\r
+ {\r
+ //\r
+ // My copy of the spec didn't have a type_list but\r
+ // it seems pretty crucial\r
+ //\r
+ ITypeRef owner = (ITypeRef) $2;\r
+ ArrayList arg_list = (ArrayList) $11;\r
+ ITypeRef[] param_list;\r
+ IMethodRef decl;\r
+\r
+ if (arg_list != null)\r
+ param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ else\r
+ param_list = new ITypeRef[0];\r
+\r
+ decl = owner.GetMethodRef ((ITypeRef) $7,\r
+ (CallConv) $6, (string) $4, param_list);\r
+\r
+ string sig = MethodDef.CreateSignature ((string) $10,\r
+ param_list);\r
+ codegen.CurrentTypeDef.AddOverride (sig, decl); \r
+ }\r
+ OPEN_PARENS sig_args CLOSE_PARENS\r
+ | language_decl\r
+ | constraint_decl\r
+ ;\r
+\r
+type : K_CLASS class_ref\r
+ {\r
+ $$ = $2;\r
+ }\r
+ | K_OBJECT\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+ }\r
+ | K_STRING\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
+ }\r
+ | K_VALUE K_CLASS class_ref\r
+ {\r
+ IClassRef class_ref = (IClassRef) $3;\r
+ class_ref.MakeValueClass ();\r
+ $$ = class_ref;\r
+ }\r
+ | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
+ {\r
+ ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, false);\r
+ ExternTypeRefInst inst = new ExternTypeRefInst (ext_ref, true);\r
+ $$ = inst;\r
+ }\r
+ | K_VALUETYPE slashed_name\r
+ {\r
+ TypeRef t_ref = new TypeRef ((string) $2, true, null);\r
+ t_ref.MakeValueClass ();\r
+ $$ = t_ref;\r
+ }\r
+ | type OPEN_BRACKET CLOSE_BRACKET\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ base_type.MakeArray ();\r
+ $$ = base_type;\r
+ }\r
+ | type OPEN_BRACKET bounds CLOSE_BRACKET\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ ArrayList bound_list = (ArrayList) $3;\r
+ base_type.MakeBoundArray (bound_list);\r
+ $$ = base_type;\r
+ }\r
+ | type AMPERSAND\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ base_type.MakeManagedPointer ();\r
+ $$ = base_type;\r
+ }\r
+ | type STAR\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ base_type.MakeUnmanagedPointer ();\r
+ $$ = base_type;\r
+ }\r
+ | type K_PINNED\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ base_type.MakePinned ();\r
+ $$ = base_type;\r
+ }\r
+ | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ IClassRef class_ref = (IClassRef) $4;\r
+ base_type.MakeCustomModified (codegen,\r
+ CustomModifier.modopt, class_ref);\r
+ $$ = base_type;\r
+ }\r
+ | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
+ {\r
+ ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ IClassRef class_ref = (IClassRef) $4;\r
+ base_type.MakeCustomModified (codegen,\r
+ CustomModifier.modopt, class_ref);\r
+ $$ = base_type;\r
+ }\r
+ | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
+ {\r
+ $$ = new MethodPointerTypeRef ((CallConv) $2, (ITypeRef) $3, (ArrayList) $6);\r
+ }\r
+ | K_TYPEDREF\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
+ "System.TypedReference");\r
+ }\r
+ | K_CHAR\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
+ }\r
+ | K_WCHAR\r
{\r
- $$ = new TypeRef (codegen.ExternTable.GetClass ($1 as string, \r
- $2 as string, $4 as string), String.Format ("{0}.{1}", $2, $4));\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
}\r
- ;\r
-\r
-namespace_name : /* EMPTY */\r
- | id\r
- | namespace_name DOT id {$$ = String.Format ("{0}.{1}", $1, $3); }\r
- ;\r
-\r
-atOpt : /* EMPTY */ \r
- | K_AT id \r
- ;\r
-\r
-initOpt : /* EMPTY */ \r
- | ASSIGN fieldInit \r
- ;\r
-\r
-repeatOpt : /* EMPTY */ \r
- | OPEN_BRACKET int32 CLOSE_BRACKET \r
- ;\r
-\r
-customHead : D_CUSTOM customType ASSIGN OPEN_PARENS \r
- ;\r
-\r
-customHeadWithOwner : D_CUSTOM OPEN_PARENS customType CLOSE_PARENS customType ASSIGN OPEN_PARENS \r
- ;\r
-\r
-customType : typeSpec \r
- | callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- ;\r
-\r
-eventHead : D_EVENT eventAttr typeSpec id \r
- | D_EVENT eventAttr id \r
- ;\r
-\r
-\r
-eventAttr : /* EMPTY */ \r
- | eventAttr K_RTSPECIALNAME /**/\r
- | eventAttr K_SPECIALNAME \r
- ;\r
-\r
-eventDecls : /* EMPTY */\r
- | eventDecls eventDecl\r
- ;\r
-\r
-eventDecl : D_ADDON callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_ADDON callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_REMOVEON callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_REMOVEON callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_FIRE callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_FIRE callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_OTHER callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_OTHER callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | extSourceSpec\r
- | customAttrDecl\r
- | languageDecl\r
- ;\r
-\r
-propHead : D_PROPERTY propAttr callConv type id OPEN_PARENS sigArgs0 CLOSE_PARENS initOpt \r
- ;\r
-\r
-propAttr : /* EMPTY */ \r
- | propAttr K_RTSPECIALNAME /**/\r
- | propAttr K_SPECIALNAME \r
- ;\r
-\r
-propDecls : /* EMPTY */\r
- | propDecls propDecl\r
- ;\r
-\r
-\r
-propDecl : D_SET callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_SET callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_GET callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_GET callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_OTHER callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | D_OTHER callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | customAttrDecl\r
- | extSourceSpec\r
- | languageDecl\r
- ;\r
-\r
-field_ref : internal_field_ref\r
- | external_field_ref\r
- ;\r
-\r
-internal_field_ref : type_ref internal_type_ref DOUBLE_COLON id\r
+ | K_VOID\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
+ }\r
+ | K_BOOL\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
+ }\r
+ | K_INT8\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
+ }\r
+ | K_INT16\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");\r
+ }\r
+ | K_INT32\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");\r
+ }\r
+ | K_INT64\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");\r
+ }\r
+ | K_FLOAT32\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
+ }\r
+ | K_FLOAT64\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
+ }\r
+ | K_UNSIGNED K_INT8\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
+ }\r
+ | K_UNSIGNED K_INT16\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16"); \r
+ }\r
+ | K_UNSIGNED K_INT32\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
+ }\r
+ | K_UNSIGNED K_INT64\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
+ }\r
+ | K_NATIVE K_INT\r
+ {\r
+ // TODO: Is this the proper full name\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
+ }\r
+ \r
+ | K_NATIVE K_UNSIGNED K_INT\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
+ }\r
+ | BANG int32\r
+ {\r
+ GenericTypeSpec spec = new GenericTypeSpec ((int) $2);\r
+ $$ = new GenericTypeRef (spec, $2.ToString ());\r
+ }\r
+ | BANG BANG int32\r
+ {\r
+ MVar mvar = new MVar ((int) $3);\r
+ $$ = new GenericTypeRef (mvar, $3.ToString ());\r
+ }\r
+ | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET\r
+ {\r
+ $$ = new TypeRef ((string) $2, false, null);\r
+ }\r
+ | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
+ {\r
+ ArrayList typar_list = (ArrayList) $4;\r
+ ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef));\r
+ \r
+ $$ = new GenericTypeInst ((string)$2, typar_array);\r
+ }\r
+ ;\r
+\r
+bounds : bound\r
+ {\r
+ ArrayList bound_list = new ArrayList ();\r
+ bound_list.Add ($1);\r
+ $$ = bound_list;\r
+ }\r
+ | bounds COMMA bound\r
+ {\r
+ ArrayList bound_list = (ArrayList) $1;\r
+ bound_list.Add ($3);\r
+ }\r
+ ;\r
+\r
+bound : /* EMPTY */\r
+ {\r
+ // This is shortref for no lowerbound or size\r
+ $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
+ }\r
+ | ELLIPSIS\r
+ {\r
+ // No lower bound or size\r
+ $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);\r
+ }\r
+ | int32\r
+ {\r
+ // ******** Not sure what this is?\r
+ // For now I will say it is size because there\r
+ // is allready a way to set lower\r
+ $$ = new DictionaryEntry (TypeRef.Ellipsis, $1);\r
+ }\r
+ | int32 ELLIPSIS int32\r
+ {\r
+ // lower bound and size\r
+ $$ = new DictionaryEntry ($1, $3);\r
+ }\r
+ | int32 ELLIPSIS\r
+ {\r
+ // Just lower bound\r
+ $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);\r
+ }\r
+ ;\r
+\r
+call_conv : K_INSTANCE call_conv\r
+ {\r
+ $$ = (CallConv) $2 | CallConv.Instance;\r
+ }\r
+ | K_EXPLICIT call_conv\r
+ {\r
+ $$ = (CallConv) $2 | CallConv.InstanceExplicit;\r
+ }\r
+ | call_kind\r
+ ;\r
+\r
+call_kind : /* EMPTY */\r
+ {\r
+ $$ = new CallConv ();\r
+ }\r
+ | K_DEFAULT\r
+ {\r
+ $$ = CallConv.Default;\r
+ }\r
+ | K_VARARG\r
+ {\r
+ $$ = CallConv.Vararg;\r
+ }\r
+ | K_UNMANAGED K_CDECL\r
+ {\r
+ $$ = CallConv.Cdecl;\r
+ }\r
+ | K_UNMANAGED K_STDCALL\r
+ {\r
+ $$ = CallConv.Stdcall;\r
+ }\r
+ | K_UNMANAGED K_THISCALL\r
+ {\r
+ $$ = CallConv.Thiscall;\r
+ }\r
+ | K_UNMANAGED K_FASTCALL\r
+ {\r
+ $$ = CallConv.Fastcall;\r
+ }\r
+ ;\r
+\r
+native_type : /* EMPTY */\r
+ | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
+ | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
+ {\r
+ $$ = NativeType.FixedSysString;\r
+ }\r
+ | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
+ | K_VARIANT\r
+ | K_CURRENCY\r
+ {\r
+ $$ = NativeType.Currency;\r
+ }\r
+ | K_SYSCHAR\r
+ | K_VOID\r
+ {\r
+ $$ = NativeType.Void;\r
+ }\r
+ | K_BOOL\r
+ {\r
+ $$ = NativeType.Boolean;\r
+ }\r
+ | K_INT8\r
+ {\r
+ $$ = NativeType.Int8;\r
+ }\r
+ | K_INT16\r
+ {\r
+ $$ = NativeType.Int16;\r
+ }\r
+ | K_INT32\r
+ {\r
+ $$ = NativeType.Int32;\r
+ }\r
+ | K_INT64\r
+ {\r
+ $$ = NativeType.Int64;\r
+ }\r
+ | K_FLOAT32\r
+ {\r
+ $$ = NativeType.Float32;\r
+ }\r
+ | K_FLOAT64\r
+ {\r
+ $$ = NativeType.Float64;\r
+ }\r
+ | K_ERROR\r
+ | K_UNSIGNED K_INT8\r
+ {\r
+ $$ = NativeType.UInt8;\r
+ }\r
+ | K_UNSIGNED K_INT16\r
+ {\r
+ $$ = NativeType.UInt16;\r
+ }\r
+ | K_UNSIGNED K_INT32\r
+ {\r
+ $$ = NativeType.UInt32;\r
+ }\r
+ | K_UNSIGNED K_INT64\r
+ {\r
+ $$ = NativeType.UInt64;\r
+ }\r
+ | native_type STAR\r
+ | native_type OPEN_BRACKET CLOSE_BRACKET\r
+ | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
+ | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
+ | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
+ | K_DECIMAL\r
+ | K_DATE\r
+ | K_BSTR\r
+ {\r
+ $$ = NativeType.BStr;\r
+ }\r
+ | K_LPSTR\r
+ {\r
+ $$ = NativeType.LPStr;\r
+ }\r
+ | K_LPWSTR\r
+ {\r
+ $$ = NativeType.LPWStr;\r
+ }\r
+ | K_LPTSTR\r
+ {\r
+ $$ = NativeType.LPTStr;\r
+ }\r
+ | K_OBJECTREF\r
+ | K_IUNKNOWN\r
+ {\r
+ $$ = NativeType.IUnknown;\r
+ }\r
+ | K_IDISPATCH\r
+ {\r
+ $$ = NativeType.IDispatch;\r
+ }\r
+ | K_STRUCT\r
+ {\r
+ $$ = NativeType.Struct;\r
+ }\r
+ | K_INTERFACE\r
+ {\r
+ $$ = NativeType.Interface;\r
+ }\r
+ | K_SAFEARRAY variant_type\r
+ | K_SAFEARRAY variant_type COMMA comp_qstring\r
+ | K_INT\r
+ {\r
+ $$ = NativeType.Int;\r
+ }\r
+ | K_UNSIGNED K_INT\r
+ {\r
+ $$ = NativeType.UInt;\r
+ }\r
+ | K_NESTED K_STRUCT\r
+ | K_BYVALSTR\r
+ {\r
+ $$ = NativeType.ByValStr;\r
+ }\r
+ | K_ANSI K_BSTR\r
+ {\r
+ $$ = NativeType.AnsiBStr;\r
+ }\r
+ | K_TBSTR\r
+ {\r
+ $$ = NativeType.TBstr;\r
+ }\r
+ | K_VARIANT K_BOOL\r
+ {\r
+ $$ = NativeType.VariantBool;\r
+ }\r
+ | K_METHOD\r
+ | K_AS K_ANY\r
+ {\r
+ $$ = NativeType.AsAny;\r
+ }\r
+ | K_LPSTRUCT\r
+ ;\r
+\r
+variant_type : /* EMPTY */\r
+ | K_NULL\r
+ | K_VARIANT\r
+ | K_CURRENCY\r
+ | K_VOID\r
+ | K_BOOL\r
+ | K_INT8\r
+ | K_INT16\r
+ | K_INT32\r
+ | K_INT64\r
+ | K_FLOAT32\r
+ | K_FLOAT64\r
+ | K_UNSIGNED K_INT8\r
+ | K_UNSIGNED K_INT16\r
+ | K_UNSIGNED K_INT32\r
+ | K_UNSIGNED K_INT64\r
+ | STAR\r
+ | variant_type OPEN_BRACKET CLOSE_BRACKET\r
+ | variant_type K_VECTOR\r
+ | variant_type AMPERSAND\r
+ | K_DECIMAL\r
+ | K_DATE\r
+ | K_BSTR\r
+ | K_LPSTR\r
+ | K_LPWSTR\r
+ | K_IUNKNOWN\r
+ | K_IDISPATCH\r
+ | K_SAFEARRAY\r
+ | K_INT\r
+ | K_UNSIGNED K_INT\r
+ | K_ERROR\r
+ | K_HRESULT\r
+ | K_CARRAY\r
+ | K_USERDEFINED\r
+ | K_RECORD\r
+ | K_FILETIME\r
+ | K_BLOB\r
+ | K_STREAM\r
+ | K_STORAGE\r
+ | K_STREAMED_OBJECT\r
+ | K_STORED_OBJECT\r
+ | K_BLOB_OBJECT\r
+ | K_CF\r
+ | K_CLSID\r
+ ;\r
+\r
+field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
+ {\r
+ FieldDef field_def = new FieldDef((FieldAttr) $3, \r
+ (string) $5, (ITypeRef) $4);\r
+ codegen.AddFieldDef (field_def);\r
+ \r
+ if ($2 != null) {\r
+ field_def.SetOffset ((uint) $2);\r
+ }\r
+\r
+ if ($6 != null) {\r
+ field_def.AddDataValue ((string) $6);\r
+ }\r
+\r
+ if ($7 != null) {\r
+ field_def.SetValue ((Constant) $7);\r
+ }\r
+ }\r
+ ;\r
+\r
+repeat_opt : /* EMPTY */\r
+ | OPEN_BRACKET int32 CLOSE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+field_attr : /* EMPTY */\r
+ {\r
+ $$ = new FieldAttr ();\r
+ }\r
+ | field_attr K_PUBLIC\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Public;\r
+ }\r
+ | field_attr K_PRIVATE\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Private;\r
+ }\r
+ | field_attr K_FAMILY\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Family;\r
+ }\r
+ | field_attr K_ASSEMBLY\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Assembly;\r
+ }\r
+ | field_attr K_FAMANDASSEM\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;\r
+ }\r
+ | field_attr K_FAMORASSEM\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;\r
+ }\r
+ | field_attr K_PRIVATESCOPE\r
+ {\r
+ // This is just 0x0000\r
+ }\r
+ | field_attr K_STATIC\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Static;\r
+ }\r
+ | field_attr K_INITONLY\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Initonly;\r
+ }\r
+ | field_attr K_RTSPECIALNAME\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;\r
+ }\r
+ | field_attr K_SPECIALNAME\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.SpecialName;\r
+ }\r
+ | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
+ {\r
+ \r
+ }\r
+ | field_attr K_LITERAL\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Literal;\r
+ }\r
+ | field_attr K_NOTSERIALIZED\r
+ {\r
+ $$ = (FieldAttr) $1 | FieldAttr.Notserialized;\r
+ }\r
+ ;\r
+\r
+at_opt : /* EMPTY */\r
+ | K_AT id\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+init_opt : /* EMPTY */\r
+ | ASSIGN field_init\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
+ {\r
+ $$ = new FloatConst (Convert.ToSingle ($3));\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS\r
+ {\r
+ $$ = new DoubleConst (Convert.ToDouble ($3));\r
+ }\r
+ | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new FloatConst (Convert.ToSingle ($3));\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new DoubleConst (Convert.ToDouble ($3));\r
+ }\r
+ | K_INT64 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToInt64 ($3));\r
+ }\r
+ | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToInt32 ($3));\r
+ }\r
+ | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToInt16 ($3));\r
+ }\r
+ | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new CharConst (Convert.ToChar ($3));\r
+ }\r
+ | K_WCHAR OPEN_PARENS int64 CLOSE_PARENS\r
{\r
- $$ = codegen.GetFieldRef ((TypeRef) $1, (TypeRef) $2, (string) $4, null);\r
+ $$ = new CharConst (Convert.ToChar ($3));\r
}\r
- ;\r
-\r
-external_field_ref : type_ref external_type_ref DOUBLE_COLON id\r
+ | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new IntConst (Convert.ToByte ($3));\r
+ }\r
+ | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
+ {\r
+ $$ = new BoolConst ((bool) $3);\r
+ }\r
+ | K_BYTEARRAY bytes_list\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $2);\r
+ }\r
+ | comp_qstring\r
+ {\r
+ // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
+ $$ = new StringConst ((string) $1);\r
+ }\r
+ | K_NULLREF\r
+ {\r
+ $$ = new NullConst ();\r
+ }\r
+ ;\r
+\r
+data_decl : data_head data_body\r
+ {\r
+ DataDef datadef = (DataDef) $1;\r
+ \r
+ if ($2 is ArrayList) {\r
+ ArrayList const_list = (ArrayList) $2;\r
+ DataConstant[] const_arr = new DataConstant[const_list.Count];\r
+ \r
+ for (int i=0; i<const_arr.Length; i++)\r
+ const_arr[i] = (DataConstant) const_list[i];\r
+\r
+ datadef.PeapiConstant = new ArrayConstant (const_arr);\r
+ } else {\r
+ datadef.PeapiConstant = (PEAPI.Constant) $2;\r
+ }\r
+ codegen.AddDataDef (datadef);\r
+ }\r
+ ;\r
+\r
+data_head : D_DATA tls id ASSIGN\r
+ {\r
+ $$ = new DataDef ((string) $3, (bool) $2); \r
+ } \r
+ | D_DATA tls\r
+ {\r
+ $$ = new DataDef (String.Empty, (bool) $2);\r
+ }\r
+ ;\r
+\r
+tls : /* EMPTY */ { $$ = false; }\r
+ | K_TLS { $$ = true; }\r
+ ;\r
+\r
+data_body : OPEN_BRACE dataitem_list CLOSE_BRACE\r
+ | dataitem\r
+ ;\r
+\r
+dataitem_list : dataitem\r
+ {\r
+ ArrayList dataitem_list = new ArrayList ();\r
+ dataitem_list.Add ($1);\r
+ $$ = dataitem_list;\r
+ }\r
+ | dataitem_list COMMA dataitem\r
+ {\r
+ ArrayList list = (ArrayList) $1;\r
+ list.Add ($3);\r
+ }\r
+ ;\r
+\r
+dataitem : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst ((string) $4);\r
+ }\r
+ | K_WCHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS\r
{\r
- ClassRef parent = ((TypeRef) $2).Type as ClassRef;\r
- TypeRef type = (TypeRef) $1;\r
- \r
- $$ = parent.AddField ((string) $4, type.Type);\r
+ $$ = new StringConst ((string) $4);\r
}\r
+ | AMPERSAND OPEN_PARENS id CLOSE_PARENS\r
+ {\r
+ // DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);\r
+ // $$ = new AddressConstant ((DataConstant) def.PeapiConstant);\r
+ }\r
+ | K_BYTEARRAY ASSIGN bytes_list\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $3);\r
+ }\r
+ | K_BYTEARRAY bytes_list\r
+ {\r
+ // ******** THIS IS NOT IN THE SPECIFICATION ******** //\r
+ $$ = new ByteArrConst ((byte[]) $2);\r
+ }\r
+ | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+ {\r
+ double d = (double) $3;\r
+ FloatConst float_const = new FloatConst ((float) d);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (float_const, (int) $5);\r
+ else\r
+ $$ = float_const;\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt\r
+ {\r
+ DoubleConst double_const = new DoubleConst ((double) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (double_const, (int) $5);\r
+ else\r
+ $$ = double_const;\r
+ }\r
+ | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((long) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((int) $3);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+ {\r
+ int i = (int) $3;\r
+ IntConst int_const = new IntConst ((short) i);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt\r
+ {\r
+ int i = (int) $3;\r
+ IntConst int_const = new IntConst ((sbyte) i);\r
+\r
+ if ($5 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $5);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_FLOAT32 repeat_opt\r
+ {\r
+ FloatConst float_const = new FloatConst (0F);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (float_const, (int) $2);\r
+ else\r
+ $$ = float_const;\r
+ }\r
+ | K_FLOAT64 repeat_opt\r
+ {\r
+ DoubleConst double_const = new DoubleConst (0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (double_const, (int) $2);\r
+ else\r
+ $$ = double_const;\r
+ }\r
+ | K_INT64 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((long) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT32 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((int) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT16 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((short) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ | K_INT8 repeat_opt\r
+ {\r
+ IntConst int_const = new IntConst ((sbyte) 0);\r
+\r
+ if ($2 != null)\r
+ $$ = new RepeatedConstant (int_const, (int) $2);\r
+ else\r
+ $$ = int_const;\r
+ }\r
+ ;\r
+\r
+method_all : method_head OPEN_BRACE method_decls CLOSE_BRACE\r
+ {\r
+ codegen.EndMethodDef ();\r
+ }\r
+ ;\r
+\r
+method_head : D_METHOD meth_attr call_conv param_attr type method_name\r
+ formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+ {\r
+ MethodDef methdef = new MethodDef ((MethAttr) $2, (CallConv) $3,\r
+ (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
+ (ArrayList) $9);\r
+ codegen.BeginMethodDef (methdef);\r
+\r
+ if (pinvoke_info) {\r
+ ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
+ methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
+ pinvoke_info = false;\r
+ }\r
+\r
+ if ($7 != null) {\r
+ ArrayList typars_list = (ArrayList) $7;\r
+ foreach (string id in typars_list)\r
+ methdef.AddGenericParam (id);\r
+ }\r
+ }\r
+ | D_METHOD meth_attr call_conv param_attr type \r
+ K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
+ OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+ ;\r
+\r
+meth_attr : /* EMPTY */ { $$ = new MethAttr (); }\r
+ | meth_attr K_STATIC { $$ = (MethAttr) $1 | MethAttr.Static; }\r
+ | meth_attr K_PUBLIC { $$ = (MethAttr) $1 | MethAttr.Public; }\r
+ | meth_attr K_PRIVATE { $$ = (MethAttr) $1 | MethAttr.Private; }\r
+ | meth_attr K_FAMILY { $$ = (MethAttr) $1 | MethAttr.Family; }\r
+ | meth_attr K_ASSEMBLY { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
+ | meth_attr K_FAMANDASSEM { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; } \r
+ | meth_attr K_FAMORASSEM { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; } \r
+ | meth_attr K_PRIVATESCOPE { /* CHECK HEADERS */ }\r
+ | meth_attr K_FINAL { $$ = (MethAttr) $1 | MethAttr.Final; } \r
+ | meth_attr K_VIRTUAL { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
+ | meth_attr K_ABSTRACT { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
+ | meth_attr K_HIDEBYSIG { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
+ | meth_attr K_NEWSLOT { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
+ | meth_attr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
+ | meth_attr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
+ | meth_attr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
+ | meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }\r
+ | meth_attr K_UNMANAGEDEXP \r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
+ comp_qstring pinv_attr CLOSE_PARENS\r
+ {\r
+ pinvoke_info = true;\r
+ pinvoke_mod = (string) $4;\r
+ pinvoke_meth = (string) $6;\r
+ pinvoke_attr = (PInvokeAttr) $7;\r
+ }\r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS\r
+ {\r
+ pinvoke_info = true;\r
+ pinvoke_mod = (string) $4;\r
+ pinvoke_meth = null;\r
+ pinvoke_attr = (PInvokeAttr) $5;\r
+ }\r
+ | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS\r
+ {\r
+ pinvoke_info = true;\r
+ pinvoke_mod = null;\r
+ pinvoke_meth = null;\r
+ pinvoke_attr = (PInvokeAttr) $4;\r
+ }\r
+ ;\r
+\r
+pinv_attr : /* EMPTY */ { $$ = new PInvokeAttr (); }\r
+ | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }\r
+ | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }\r
+ | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }\r
+ | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }\r
+ | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }\r
+ | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }\r
+ | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }\r
+ | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
+ | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
+ | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
+ ;\r
+\r
+method_name : D_CTOR\r
+ | D_CCTOR\r
+ | comp_name\r
+ ;\r
+\r
+param_attr : /* EMPTY */ { $$ = new ParamAttr (); }\r
+ | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.In; }\r
+ | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Out; }\r
+ | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
+ ;\r
+\r
+impl_attr : /* EMPTY */ { $$ = new ImplAttr (); }\r
+ | impl_attr K_NATIVE { $$ = (ImplAttr) $1 | ImplAttr.Native; }\r
+ | impl_attr K_CIL { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
+ | impl_attr K_IL { $$ = (ImplAttr) $1 | ImplAttr.IL; }\r
+ | impl_attr K_OPTIL { $$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
+ | impl_attr K_MANAGED { /* should this reset? */ }\r
+ | impl_attr K_UNMANAGED { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
+ | impl_attr K_FORWARDREF { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
+ | impl_attr K_PRESERVESIG { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
+ | impl_attr K_RUNTIME { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }\r
+ | impl_attr K_INTERNALCALL { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
+ | impl_attr K_SYNCHRONIZED { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
+ | impl_attr K_NOINLINING { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
+ ;\r
+\r
+sig_args : /* EMPTY */\r
+ | sig_arg_list\r
+ ;\r
+\r
+sig_arg_list : sig_arg\r
+ {\r
+ ArrayList sig_list = new ArrayList ();\r
+ sig_list.Add ($1);\r
+ $$ = sig_list;\r
+ }\r
+ | sig_arg_list COMMA sig_arg\r
+ {\r
+ ArrayList sig_list = (ArrayList) $1;\r
+ sig_list.Add ($3);\r
+ $$ = sig_list;\r
+ }\r
+ ;\r
+\r
+sig_arg : param_attr type\r
+ {\r
+ $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
+ }\r
+ | param_attr type id\r
+ {\r
+ $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
+ }\r
+ | ELLIPSIS\r
+ {\r
+ $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());\r
+ // $$ = ParamDef.Ellipsis;\r
+ }\r
+ | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
+ | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
+ ;\r
+\r
+type_list : /* EMPTY */\r
+ {\r
+ $$ = new ArrayList (0);\r
+ }\r
+ | ELLIPSIS\r
+ {\r
+ ArrayList type_list = new ArrayList ();\r
+ // type_list.Add (TypeRef.Ellipsis);\r
+ type_list.Add (new SentinelTypeRef ());\r
+ $$ = type_list;\r
+ }\r
+ | type_list COMMA ELLIPSIS\r
+ {\r
+ ArrayList type_list = (ArrayList) $1;\r
+ // type_list.Add (TypeRef.Ellipsis);\r
+ type_list.Add (new SentinelTypeRef ());\r
+ $$ = type_list;\r
+ }\r
+ | param_attr type opt_id\r
+ {\r
+ ArrayList type_list = new ArrayList ();\r
+ type_list.Add ($2);\r
+ $$ = type_list;\r
+ }\r
+ | type_list COMMA param_attr type opt_id\r
+ {\r
+ ArrayList type_list = (ArrayList) $1;\r
+ type_list.Add ($4);\r
+ }\r
+ ;\r
+\r
+opt_id : /* EMPTY */\r
+ | id\r
+ ;\r
+\r
+method_decls : /* EMPTY */\r
+ | method_decls method_decl\r
+ ;\r
+\r
+method_decl : D_EMITBYTE int32\r
+ | D_MAXSTACK int32\r
+ {\r
+ codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
+ }\r
+ | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS\r
+ {\r
+ if ($3 != null) {\r
+ codegen.CurrentMethodDef.AddLocals (\r
+ (ArrayList) $3);\r
+ }\r
+ }\r
+ | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS\r
+ {\r
+ if ($4 != null) {\r
+ codegen.CurrentMethodDef.AddLocals (\r
+ (ArrayList) $4);\r
+ codegen.CurrentMethodDef.InitLocals ();\r
+ }\r
+ }\r
+ | D_ENTRYPOINT\r
+ {\r
+ codegen.CurrentMethodDef.EntryPoint ();\r
+ }\r
+ | D_ZEROINIT\r
+ {\r
+ codegen.CurrentMethodDef.ZeroInit ();\r
+ }\r
+ | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET\r
+ | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id\r
+ | D_VTENTRY int32 COLON int32 \r
+ | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
+ {\r
+ codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
+ (ITypeRef) $2, (string) $4);\r
+ \r
+ }\r
+ | scope_block\r
+ | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
+ | id COLON\r
+ {\r
+ codegen.CurrentMethodDef.AddLabel ((string) $1);\r
+ }\r
+ | seh_block\r
+ | instr\r
+ | sec_decl\r
+ | extsource_spec\r
+ | language_decl\r
+ | customattr_decl\r
+ {\r
+ codegen.CurrentMethodDef.AddCustomAttr ((CustomAttr) $1);\r
+ }\r
+ | data_decl\r
+ ;\r
+\r
+local_list : /* EMPTY */\r
+ | local\r
+ {\r
+ ArrayList local_list = new ArrayList ();\r
+ local_list.Add ($1);\r
+ $$ = local_list;\r
+ }\r
+ | local_list COMMA local\r
+ {\r
+ ArrayList local_list = (ArrayList) $1;\r
+ local_list.Add ($3);\r
+ }\r
+ ;\r
+\r
+local : type\r
+ {\r
+ $$ = new Local (-1, (ITypeRef) $1);\r
+ }\r
+ | type id\r
+ {\r
+ $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
+ }\r
+ | slot_num type\r
+ {\r
+ $$ = new Local ((int) $1, (ITypeRef) $2);\r
+ }\r
+ | slot_num type id\r
+ {\r
+ $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
+ }\r
+ ;\r
+\r
+slot_num : OPEN_BRACKET int32 CLOSE_BRACKET\r
+ {\r
+ $$ = $2;\r
+ }\r
+ ;\r
+\r
+type_spec : class_ref\r
+ | OPEN_BRACKET slashed_name CLOSE_BRACKET\r
+ {\r
+ // This is a reference to a global method in another\r
+ // assembly. This is not supported in the MS version of ilasm\r
+ }\r
+ | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET\r
+ {\r
+ string module = (string) $3;\r
+\r
+ if (codegen.IsThisModule (module)) {\r
+ // This is not handled yet.\r
+ } else {\r
+ $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, "<Module>", false);\r
+ }\r
+\r
+ }\r
+ | type\r
;\r
\r
-method_ref : internal_method_ref\r
- | external_method_ref\r
- ;\r
-\r
-external_method_ref : type_ref external_type_ref DOUBLE_COLON name1 OPEN_PARENS arg_list CLOSE_PARENS\r
- {\r
- TypeRef parent = (TypeRef) $1;\r
- TypeRef extern_type = (TypeRef) $2;\r
- ClassRef class_ref = (ClassRef) extern_type.Type;\r
- PEAPI.Type[] type_array;\r
- if ($6 != null) {\r
- ArrayList param_list = $6 as ArrayList;\r
- int index = 0;\r
- type_array = new PEAPI.Type[param_list.Count];\r
- foreach (DictionaryEntry entry in param_list) {\r
- type_array[index] = ((TypeRef)entry.Value).Type;\r
- index++;\r
- }\r
- } else {\r
- type_array = new PEAPI.Type[0];\r
- } \r
- $$ = class_ref.AddMethod ((string) $4, parent.Type, type_array);\r
- }\r
- ; \r
-\r
-internal_method_ref : type_ref internal_type_ref DOUBLE_COLON name1 OPEN_PARENS arg_list CLOSE_PARENS\r
- { \r
- TypeRef parent, return_type;\r
- parent = (TypeRef) $2;\r
- return_type = (TypeRef) $1;\r
-\r
- Param[] param_array;\r
- TypeRef[] typeref_array;\r
- if ($6 != null) {\r
- ArrayList param_list = $6 as ArrayList;\r
- int index = 0;\r
- param_array = new Param[param_list.Count];\r
- typeref_array = new TypeRef[param_list.Count];\r
- foreach (DictionaryEntry entry in param_list) {\r
- param_array[index] = entry.Key as Param;\r
- typeref_array[index] = entry.Value as TypeRef;\r
- index++;\r
- }\r
- } else {\r
- param_array = new Param[0];\r
- typeref_array = new TypeRef[0];\r
- }\r
- \r
- $$ = codegen.GetMethodRef (parent, (string) $4, return_type, param_array, \r
- typeref_array, null);\r
- }\r
- ; \r
-\r
-\r
-methodHead : D_METHOD methAttr callConv type_ref methodName \r
- OPEN_PARENS arg_list CLOSE_PARENS implAttr OPEN_BRACE \r
- {\r
- Param[] param_array;\r
- TypeRef[] typeref_array;\r
- if ($7 != null) {\r
- ArrayList param_list = $7 as ArrayList;\r
- int index = 0;\r
- param_array = new Param[param_list.Count];\r
- typeref_array = new TypeRef[param_list.Count];\r
- foreach (DictionaryEntry entry in param_list) {\r
- param_array[index] = entry.Key as Param;\r
- typeref_array[index] = entry.Value as TypeRef;\r
- index++;\r
- }\r
- } else {\r
- param_array = new Param[0];\r
- typeref_array = new TypeRef[0];\r
- }\r
+scope_block : scope_block_begin method_decls CLOSE_BRACE\r
+ {\r
+ $$ = new HandlerBlock ((LabelInfo) $1,\r
+ codegen.CurrentMethodDef.AddLabel ());\r
+ }\r
+ ;\r
+\r
+scope_block_begin : OPEN_BRACE\r
+ {\r
+ $$ = codegen.CurrentMethodDef.AddLabel ();\r
+ }\r
+ ;\r
+ \r
+ \r
+seh_block : try_block seh_clauses\r
+ {\r
+ TryBlock try_block = (TryBlock) $1;\r
+\r
+ ArrayList clause_list = (ArrayList) $2;\r
+ foreach (object clause in clause_list)\r
+ try_block.AddSehClause ((ISehClause) clause);\r
+\r
+ codegen.CurrentMethodDef.AddInstr (try_block);\r
+ }\r
+ ;\r
+\r
+try_block : D_TRY scope_block\r
+ {\r
+ $$ = new TryBlock ((HandlerBlock) $2);\r
+ }\r
+ | D_TRY id K_TO id\r
+ {\r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+ LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
\r
- codegen.AddMethod ((MethAttr) $2, (ImplAttr) $9, (CallConv) $3, (string) $5, \r
- (TypeRef) $4, param_array, typeref_array, null);\r
- }\r
- | D_METHOD methAttr callConv paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS methodName OPEN_PARENS sigArgs0 CLOSE_PARENS implAttr OPEN_BRACE\r
- ;\r
-\r
-\r
-methodAll : methodHead methodDecls CLOSE_BRACE\r
- {\r
- /*\r
- // Console.WriteLine (method);\r
- currentClass.AddMethod (method);\r
- */\r
- }\r
- ;\r
-\r
-\r
-methAttr : /* EMPTY */ { $$ = MethAttr.Default; }\r
- | methAttr K_STATIC { $$ = (MethAttr) $1 | MethAttr.Static; }\r
- | methAttr K_PUBLIC { $$ = (MethAttr) $1 | MethAttr.Public; }\r
- | methAttr K_PRIVATE { $$ = (MethAttr) $1 | MethAttr.Private; }\r
- | methAttr K_FAMILY { $$ = (MethAttr) $1 | MethAttr.Family; }\r
- | methAttr K_FINAL { $$ = (MethAttr) $1 | MethAttr.Final; }\r
- | methAttr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
- | methAttr K_VIRTUAL { $$ = (MethAttr) $1 | MethAttr.Virtual; }\r
- | methAttr K_ABSTRACT { $$ = (MethAttr) $1 | MethAttr.Abstract; }\r
- | methAttr K_ASSEMBLY { $$ = (MethAttr) $1 | MethAttr.Assembly; }\r
- | methAttr K_FAMANDASSEM { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; }\r
- | methAttr K_FAMORASSEM { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; }\r
- | methAttr K_COMPILERCONTROLLED {/* FIXME */}\r
- | methAttr K_HIDEBYSIG { $$ = (MethAttr) $1 | MethAttr.HideBySig; }\r
- | methAttr K_NEWSLOT { $$ = (MethAttr) $1 | MethAttr.NewSlot; }\r
- | methAttr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
- | methAttr K_UNMANAGEDEXP {/* FIXME */}\r
- | methAttr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
- /*\r
- | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS { }\r
- | methAttr K_PINVOKEIMPL OPEN_PARENS compQstring pinvAttr CLOSE_PARENS { }\r
- | methAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS { }\r
- */\r
- ;\r
-\r
-pinvAttr : /* EMPTY */ \r
- | pinvAttr K_NOMANGLE \r
- | pinvAttr K_ANSI \r
- | pinvAttr K_UNICODE \r
- | pinvAttr K_AUTOCHAR \r
- | pinvAttr K_LASTERR \r
- | pinvAttr K_WINAPI \r
- | pinvAttr K_CDECL \r
- | pinvAttr K_STDCALL \r
- | pinvAttr K_THISCALL \r
- | pinvAttr K_FASTCALL \r
- ;\r
-\r
-methodName : D_CTOR\r
- | D_CCTOR\r
- | name1\r
- ;\r
-\r
-paramAttr : /* EMPTY */ {$$ = ParamAttr.Default; }\r
- | paramAttr OPEN_BRACKET K_IN CLOSE_BRACKET {$$ = (ParamAttr) $1 | ParamAttr.In; }\r
- | paramAttr OPEN_BRACKET K_OUT CLOSE_BRACKET {$$ = (ParamAttr) $1 | ParamAttr.Out; }\r
- | paramAttr OPEN_BRACKET K_OPT CLOSE_BRACKET {$$ = (ParamAttr) $1 | ParamAttr.Opt; }\r
- /* | paramAttr OPEN_BRACKET int32 CLOSE_BRACKET */\r
- ;\r
- \r
-fieldAttr : /* EMPTY */ {$$ = FieldAttr.Default; }\r
- | fieldAttr K_STATIC {$$ = FieldAttr.Static; }\r
- | fieldAttr K_PUBLIC {$$ = FieldAttr.Public; }\r
- | fieldAttr K_PRIVATE {$$ = FieldAttr.Private; }\r
- | fieldAttr K_FAMILY {$$ = FieldAttr.Family; }\r
- | fieldAttr K_INITONLY {$$ = FieldAttr.Initonly; }\r
- | fieldAttr K_RTSPECIALNAME {$$ = FieldAttr.RTSpecialName; }\r
- | fieldAttr K_SPECIALNAME {$$ = FieldAttr.SpecialName; }\r
- /* commented out because PInvoke for fields is not supported by EE\r
- | fieldAttr K_PINVOKEIMPL OPEN_PARENS compQstring K_AS compQstring pinvAttr CLOSE_PARENS \r
- | fieldAttr K_PINVOKEIMPL OPEN_PARENS compQstring pinvAttr CLOSE_PARENS \r
- | fieldAttr K_PINVOKEIMPL OPEN_PARENS pinvAttr CLOSE_PARENS \r
- \r
- | fieldAttr K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
- */\r
- | fieldAttr K_ASSEMBLY {$$ = FieldAttr.Assembly; }\r
- | fieldAttr K_FAMANDASSEM {$$ = FieldAttr.FamAndAssem; }\r
- | fieldAttr K_FAMORASSEM {$$ = FieldAttr.FamOrAssem; }\r
- /* | fieldAttr K_COMPILERCONTROLLED {$$ = FieldAttr. */\r
- | fieldAttr K_LITERAL {$$ = FieldAttr.Literal; }\r
- | fieldAttr K_NOTSERIALIZED {$$ = FieldAttr.Notserialized; }\r
- ;\r
-\r
-\r
-implAttr : /* empty */ {$$ = new ImplAttr (); }\r
- | implAttr K_NATIVE {$$ = (ImplAttr) $1 | ImplAttr.Native; }\r
- | implAttr K_IL {$$ = (ImplAttr) $1 | ImplAttr.IL; }\r
- | implAttr K_CIL { /* Do nothing */ }\r
- | implAttr K_OPTIL {$$ = (ImplAttr) $1 | ImplAttr.Optil; }\r
- | implAttr K_MANAGED { /* Do nothing */ }\r
- | implAttr K_UNMANAGED {$$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }\r
- | implAttr K_FORWARDREF {$$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }\r
- | implAttr K_PRESERVESIG {$$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
- | implAttr K_RUNTIME {$$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }\r
- | implAttr K_INTERNALCALL {$$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
- | implAttr K_SYNCHRONIZED {$$ = (ImplAttr) $1 | ImplAttr.Synchronized; }\r
- | implAttr K_NOINLINING {$$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
- ;\r
-\r
-localsHead : D_LOCALS\r
- ;\r
-\r
- \r
-methodDecl : D_EMITBYTE int32 \r
- | sehBlock \r
- | D_MAXSTACK int32 \r
+ $$ = new TryBlock (new HandlerBlock (from, to));\r
+ }\r
+ | D_TRY int32 K_TO int32\r
{\r
- codegen.CurrentMethod.SetMaxStack ((int) $2);\r
- }\r
- | localsHead OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | localsHead K_INIT OPEN_PARENS named_arg_list CLOSE_PARENS \r
- {\r
- /*\r
- ArrayList arg_list = $4 as ArrayList;\r
- \r
- if (arg_list != null) {\r
- foreach (DictionaryEntry local in arg_list) {\r
- method.AddLocal (local);\r
- }\r
- }\r
- */\r
- }\r
- | D_ENTRYPOINT \r
- { \r
- codegen.CurrentMethod.DeclareEntryPoint ();\r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+ LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);\r
+ \r
+ $$ = new TryBlock (new HandlerBlock (from, to));\r
}\r
- | D_ZEROINIT \r
- | dataDecl\r
- | instr {\r
- /* method.AddInstruction (currentInstr); */\r
- }\r
- | id COLON \r
- | secDecl\r
- | extSourceSpec\r
- | languageDecl\r
- | customAttrDecl\r
- | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET \r
- | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id \r
- | D_VTENTRY int32 COLON int32 \r
- | D_OVERRIDE typeSpec DOUBLE_COLON methodName \r
- | scopeBlock\r
- | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET initOpt \r
- ;\r
-\r
-scopeBlock : scopeOpen methodDecls CLOSE_BRACE \r
- ;\r
-\r
-scopeOpen : OPEN_BRACE \r
;\r
\r
-sehBlock : tryBlock sehClauses\r
- ;\r
-\r
-sehClauses : sehClause sehClauses\r
- | sehClause\r
- ;\r
-\r
-tryBlock : tryHead scopeBlock \r
- | tryHead id K_TO id \r
- | tryHead int32 K_TO int32 \r
- ;\r
-\r
-tryHead : D_TRY \r
- ;\r
-\r
-\r
-sehClause : catchClause handlerBlock \r
- | filterClause handlerBlock \r
- | finallyClause handlerBlock \r
- | faultClause handlerBlock \r
- ;\r
-\r
- \r
-filterClause : filterHead scopeBlock \r
- | filterHead id \r
- | filterHead int32 \r
- ;\r
-\r
-filterHead : K_FILTER \r
- ;\r
-\r
-catchClause : K_CATCH className \r
- ;\r
-\r
-finallyClause : K_FINALLY \r
- ;\r
-\r
-faultClause : K_FAULT \r
- ;\r
-\r
-handlerBlock : scopeBlock \r
- | K_HANDLER id K_TO id \r
- | K_HANDLER int32 K_TO int32 \r
- ;\r
-\r
-\r
-methodDecls : /* EMPTY */\r
- | methodDecls methodDecl\r
- ;\r
-\r
-dataDecl : ddHead ddBody\r
- ;\r
-\r
-ddHead : D_DATA tls id ASSIGN \r
- | D_DATA tls \r
- ;\r
-\r
-tls : /* EMPTY */ \r
- | K_TLS \r
- ;\r
-\r
-ddBody : OPEN_BRACE ddItemList CLOSE_BRACE\r
- | ddItem\r
- ;\r
-\r
-ddItemList : ddItem COMMA ddItemList\r
- | ddItem\r
- ;\r
-\r
-ddItemCount : /* EMPTY */ \r
- | OPEN_BRACKET int32 CLOSE_BRACKET \r
+seh_clauses : seh_clause\r
+ {\r
+ ArrayList clause_list = new ArrayList ();\r
+ clause_list.Add ($1);\r
+ $$ = clause_list;\r
+ }\r
+ | seh_clauses seh_clause\r
+ {\r
+ ArrayList clause_list = (ArrayList) $1;\r
+ clause_list.Add ($2);\r
+ }\r
+ ;\r
+\r
+seh_clause : K_CATCH class_ref handler_block\r
+ {\r
+ IClassRef type = (IClassRef) $2;\r
+ CatchBlock cb = new CatchBlock (type);\r
+ cb.SetHandlerBlock ((HandlerBlock) $3);\r
+ $$ = cb;\r
+ }\r
+ | K_FINALLY handler_block\r
+ {\r
+ FinallyBlock fb = new FinallyBlock ();\r
+ fb.SetHandlerBlock ((HandlerBlock) $2);\r
+ $$ = fb;\r
+ }\r
+ | K_FAULT handler_block\r
+ {\r
+ FaultBlock fb = new FaultBlock ();\r
+ fb.SetHandlerBlock ((HandlerBlock) $2);\r
+ $$ = fb;\r
+ }\r
+ | filter_clause handler_block\r
+ {\r
+ FilterBlock fb = (FilterBlock) $1;\r
+ fb.SetHandlerBlock ((HandlerBlock) $2);\r
+ }\r
+ ;\r
+\r
+filter_clause : K_FILTER scope_block\r
+ {\r
+ HandlerBlock block = (HandlerBlock) $2;\r
+ FilterBlock fb = new FilterBlock (block);\r
+ $$ = fb;\r
+ }\r
+ | K_FILTER id\r
+ {\r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+ FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
+ $$ = fb;\r
+ }\r
+ | K_FILTER int32\r
+ {\r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+ FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));\r
+ $$ = fb;\r
+ }\r
;\r
\r
-ddItem : K_CHAR STAR OPEN_PARENS compQstring CLOSE_PARENS \r
- | AMPERSAND OPEN_PARENS id CLOSE_PARENS \r
- | bytearrayhead bytes CLOSE_PARENS \r
- | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS ddItemCount \r
- | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS ddItemCount \r
- | K_INT64 OPEN_PARENS int64 CLOSE_PARENS ddItemCount \r
- | K_INT32 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
- | K_INT16 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
- | K_INT8 OPEN_PARENS int32 CLOSE_PARENS ddItemCount \r
- | K_FLOAT32 ddItemCount \r
- | K_FLOAT64 ddItemCount \r
- | K_INT64 ddItemCount \r
- | K_INT32 ddItemCount \r
- | K_INT16 ddItemCount \r
- | K_INT8 ddItemCount \r
- ;\r
+handler_block : scope_block\r
+ {\r
+ \r
+ }\r
+ | K_HANDLER id K_TO id\r
+ { \r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+ LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
+\r
+ $$ = new HandlerBlock (from, to);\r
+ }\r
+ | K_HANDLER int32 K_TO int32\r
+ {\r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+ LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
\r
-fieldInit : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS \r
- | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS \r
- | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS \r
- | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS \r
- | K_INT64 OPEN_PARENS int64 CLOSE_PARENS \r
- | K_INT32 OPEN_PARENS int64 CLOSE_PARENS \r
- | K_INT16 OPEN_PARENS int64 CLOSE_PARENS \r
- | K_CHAR OPEN_PARENS int64 CLOSE_PARENS \r
- | K_INT8 OPEN_PARENS int64 CLOSE_PARENS \r
- | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS \r
- | compQstring \r
- | bytearrayhead bytes CLOSE_PARENS \r
- | K_NULLREF \r
+ $$ = new HandlerBlock (from, to);\r
+ }\r
;\r
\r
-bytearrayhead : K_BYTEARRAY OPEN_PARENS \r
+instr : INSTR_NONE\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (\r
+ new SimpInstr ((Op) $1));\r
+ }\r
+ | INSTR_LOCAL int32\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (\r
+ new IntInstr ((IntOp) $1, (int) $2)); \r
+ }\r
+ | INSTR_LOCAL id\r
+ {\r
+ int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+ codegen.CurrentMethodDef.AddInstr (\r
+ new IntInstr ((IntOp) $1, slot));\r
+ }\r
+ | INSTR_PARAM int32\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (\r
+ new IntInstr ((IntOp) $1, (int) $2));\r
+ }\r
+ | INSTR_PARAM id\r
+ {\r
+ int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
+ codegen.CurrentMethodDef.AddInstr (\r
+ new IntInstr ((IntOp) $1, pos));\r
+ }\r
+ | INSTR_I int32\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new\r
+ IntInstr ((IntOp) $1, (int) $2));\r
+ }\r
+ | INSTR_I id\r
+ {\r
+ int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+ codegen.CurrentMethodDef.AddInstr (new\r
+ IntInstr ((IntOp) $1, slot));\r
+ }\r
+ | INSTR_I8 int64\r
+ {\r
+ if ($1 is MiscInstr) {\r
+ switch ((MiscInstr) $1) {\r
+ case MiscInstr.ldc_i8:\r
+ codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,\r
+ (long) $2));\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ | INSTR_R float64\r
+ {\r
+ switch ((MiscInstr) $1) {\r
+ case MiscInstr.ldc_r4:\r
+ case MiscInstr.ldc_r8:\r
+ codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2));\r
+ break;\r
+ }\r
+ }\r
+ | INSTR_R int64\r
+ {\r
+ long l = (long) $2;\r
+ \r
+ switch ((MiscInstr) $1) {\r
+ case MiscInstr.ldc_r4:\r
+ case MiscInstr.ldc_r8:\r
+ codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l));\r
+ break;\r
+ }\r
+ }\r
+ | INSTR_R bytes_list\r
+ | INSTR_BRTARGET int32\r
+ {\r
+ LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+ codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
+ target)); \r
+ }\r
+ | INSTR_BRTARGET id\r
+ {\r
+ LabelInfo target = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
+ codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,\r
+ target));\r
+ }\r
+ | INSTR_METHOD method_ref\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
+ (IMethodRef) $2));\r
+ }\r
+ | INSTR_FIELD type type_spec DOUBLE_COLON id\r
+ {\r
+ \r
+ ITypeRef owner = (ITypeRef) $3;\r
+ IFieldRef fieldref = owner.GetFieldRef (\r
+ (ITypeRef) $2, (string) $5);\r
+\r
+ codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
+ }\r
+ | INSTR_FIELD type id\r
+ {\r
+ GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+\r
+ codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref));\r
+ }\r
+ | INSTR_TYPE type_spec\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
+ (ITypeRef) $2));\r
+ }\r
+ | INSTR_STRING comp_qstring\r
+ {\r
+ if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+ codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2));\r
+ }\r
+ | INSTR_STRING K_BYTEARRAY ASSIGN bytes_list\r
+ {\r
+ byte[] bs = (byte[]) $4;\r
+ if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+ codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));\r
+ }\r
+ | INSTR_STRING K_BYTEARRAY bytes_list\r
+ {\r
+ byte[] bs = (byte[]) $3;\r
+ if ((MiscInstr) $1 == MiscInstr.ldstr)\r
+ codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs));\r
+ }\r
+ | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
+ {\r
+ ArrayList arg_list = (ArrayList) $5;\r
+ ITypeRef[] arg_array = null;\r
+\r
+ if (arg_list != null)\r
+ arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+\r
+ codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,\r
+ (ITypeRef) $3, arg_array));\r
+ } \r
+ | INSTR_TOK owner_type\r
+ {\r
+ if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
+ if ($2 is IMethodRef)\r
+ codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2));\r
+ else if ($2 is IFieldRef)\r
+ codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2));\r
+ else\r
+ codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2));\r
+ \r
+ }\r
+ }\r
+ | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3));\r
+ }\r
+ ;\r
+\r
+method_ref : call_conv type type_spec DOUBLE_COLON method_name\r
+ OPEN_PARENS type_list CLOSE_PARENS \r
+ {\r
+ ITypeRef owner = (ITypeRef) $3;\r
+ ArrayList arg_list = (ArrayList) $7;\r
+ ITypeRef[] param_list;\r
+ IMethodRef methref;\r
+\r
+ if (arg_list != null)\r
+ param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ else\r
+ param_list = new ITypeRef[0];\r
+\r
+ if (owner.UseTypeSpec) {\r
+ methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list);\r
+ } else {\r
+ methref = owner.GetMethodRef ((ITypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list);\r
+ }\r
+\r
+ $$ = methref;\r
+ }\r
+ | call_conv type method_name \r
+ OPEN_PARENS type_list CLOSE_PARENS\r
+ {\r
+ ArrayList arg_list = (ArrayList) $5;\r
+ ITypeRef[] param_list;\r
+ \r
+ if (arg_list != null)\r
+ param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ else\r
+ param_list = new ITypeRef[0];\r
+\r
+ $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
+ (string) $3, param_list);\r
+ }\r
+ | call_conv type type_spec DOUBLE_COLON method_name\r
+ typars_clause OPEN_PARENS type_list CLOSE_PARENS \r
+ {\r
+ ITypeRef owner = (ITypeRef) $3;\r
+ ArrayList arg_list = (ArrayList) $8;\r
+ ITypeRef[] param_list;\r
+ IMethodRef methref;\r
+\r
+ if (arg_list != null)\r
+ param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ else\r
+ param_list = new ITypeRef[0];\r
+\r
+ if (owner.UseTypeSpec) {\r
+ methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list);\r
+ } else {\r
+ methref = owner.GetMethodRef ((ITypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list);\r
+ }\r
+\r
+ if ($6 != null) {\r
+ ArrayList tp = (ArrayList) $6;\r
+ ITypeRef[] ta = (ITypeRef[]) tp.ToArray (typeof (ITypeRef));\r
+ \r
+ methref = new GenericMethodRef (methref, new GenericMethodSig (ta));\r
+ }\r
+ \r
+ $$ = methref;\r
+ }\r
;\r
\r
-\r
-hexbyte : INT32\r
+labels : /* EMPTY */\r
| id\r
+ {\r
+ ArrayList label_list = new ArrayList ();\r
+ label_list.Add ($1);\r
+ $$ = label_list;\r
+ }\r
+ | int32\r
+ {\r
+ ArrayList label_list = new ArrayList ();\r
+ label_list.Add ($1);\r
+ $$ = label_list;\r
+ }\r
+ | labels COMMA id\r
+ {\r
+ ArrayList label_list = (ArrayList) $1;\r
+ label_list.Add ($3);\r
+ }\r
+ | labels COMMA int32\r
+ {\r
+ ArrayList label_list = (ArrayList) $1;\r
+ label_list.Add ($3);\r
+ }\r
+ ;\r
+\r
+owner_type : type_spec\r
+ | member_ref\r
+ ;\r
+\r
+member_ref : K_METHOD method_ref\r
+ {\r
+ $$ = $2;\r
+ }\r
+ | K_FIELD type type_spec DOUBLE_COLON id\r
+ {\r
+ ITypeRef owner = (ITypeRef) $3;\r
+\r
+ $$ = owner.GetFieldRef (\r
+ (ITypeRef) $2, (string) $5);\r
+ }\r
+ | K_FIELD type id\r
+ {\r
+ $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+ }\r
+ ;\r
+\r
+event_all : event_head OPEN_BRACE event_decls CLOSE_BRACE\r
+ {\r
+ codegen.CurrentTypeDef.EndEventDef ();\r
+ }\r
+ ;\r
+\r
+event_head : D_EVENT event_attr type_spec id\r
+ {\r
+ EventDef event_def = new EventDef ((FeatureAttr) $2,\r
+ (ITypeRef) $3, (string) $4);\r
+ codegen.CurrentTypeDef.BeginEventDef (event_def);\r
+ }\r
+ | D_EVENT event_attr id\r
+ ;\r
+\r
+event_attr : /* EMPTY */\r
+ {\r
+ $$ = new FeatureAttr ();\r
+ }\r
+ | event_attr K_RTSPECIALNAME\r
+ {\r
+ $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;\r
+ }\r
+ | event_attr K_SPECIALNAME\r
+ {\r
+ $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;\r
+ }\r
+ ;\r
+\r
+event_decls : /* EMPTY */\r
+ | event_decls event_decl\r
+ ;\r
+\r
+event_decl : D_ADDON method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
+ (MethodRef) $2); \r
+ }\r
+ | D_REMOVEON method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
+ (MethodRef) $2);\r
+ }\r
+ | D_FIRE method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
+ (MethodRef) $2);\r
+ }\r
+ | D_OTHER method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
+ (MethodRef) $2);\r
+ }\r
+ | customattr_decl\r
+ | extsource_spec\r
+ | language_decl\r
+ ;\r
+\r
+prop_all : prop_head OPEN_BRACE prop_decls CLOSE_BRACE\r
+ {\r
+ codegen.CurrentTypeDef.EndPropertyDef ();\r
+ }\r
+ ;\r
+\r
+prop_head : D_PROPERTY prop_attr type id OPEN_PARENS type_list CLOSE_PARENS init_opt\r
+ {\r
+ PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,\r
+ (string) $4, (ArrayList) $6);\r
+ codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
+\r
+ if ($8 != null) {\r
+ prop_def.AddInitValue ((Constant) $8);\r
+ }\r
+ }\r
+ ;\r
+\r
+prop_attr : /* EMPTY */\r
+ {\r
+ $$ = new FeatureAttr ();\r
+ }\r
+ | prop_attr K_RTSPECIALNAME\r
+ {\r
+ $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;\r
+ }\r
+ | prop_attr K_SPECIALNAME\r
+ {\r
+ $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;\r
+ }\r
+ | prop_attr K_INSTANCE\r
+ {\r
+ }\r
+ ;\r
+\r
+prop_decls : /* EMPTY */\r
+ | prop_decls prop_decl\r
+ ;\r
+\r
+prop_decl : D_SET method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);\r
+ }\r
+ | D_GET method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);\r
+ }\r
+ | D_OTHER method_ref\r
+ {\r
+ codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);\r
+ }\r
+ | customattr_decl\r
+ | extsource_spec\r
+ | language_decl\r
+ ;\r
+\r
+customattr_decl : D_CUSTOM custom_type\r
+ {\r
+ $$ = new CustomAttr ((IMethodRef) $2, null);\r
+ }\r
+ | D_CUSTOM custom_type ASSIGN comp_qstring\r
+ | D_CUSTOM custom_type ASSIGN bytes_list\r
+ {\r
+ $$ = new CustomAttr ((IMethodRef) $2,\r
+ (byte[]) $4);\r
+ }\r
+ | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
+ | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
+ | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
+ bytes_list\r
;\r
-\r
-bytes : /* EMPTY */ \r
- | hexbytes \r
+ \r
+custom_type : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+ {\r
+ ITypeRef owner = (ITypeRef) $3;\r
+ ArrayList arg_list = (ArrayList) $7;\r
+ ITypeRef[] param_list;\r
+ \r
+ if (arg_list != null)\r
+ param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ else\r
+ param_list = new ITypeRef[0];\r
+\r
+ $$ = owner.GetMethodRef ((ITypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list);\r
+ }\r
+ | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+ {\r
+ ArrayList arg_list = (ArrayList) $5;\r
+ ITypeRef[] param_list;\r
+ \r
+ if (arg_list != null)\r
+ param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ else\r
+ param_list = new ITypeRef[0];\r
+\r
+ $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
+ (string) $3, param_list);\r
+ }\r
+ ;\r
+\r
+sec_decl : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
+ | D_PERMISSION sec_action type_spec\r
+ | D_PERMISSIONSET sec_action ASSIGN bytes_list\r
+ ;\r
+\r
+nameval_pairs : nameval_pair \r
+ | nameval_pairs COMMA nameval_pair\r
+ ;\r
+\r
+nameval_pair : comp_qstring ASSIGN cavalue\r
+ ;\r
+\r
+cavalue : truefalse\r
+ | int32\r
+ | int32 OPEN_PARENS int32 CLOSE_PARENS\r
+ | comp_qstring \r
+ | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
+ | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
+ | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
+ | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
+ ;\r
+\r
+sec_action : K_REQUEST\r
+ | K_DEMAND\r
+ | K_ASSERT\r
+ | K_DENY\r
+ | K_PERMITONLY\r
+ | K_LINKCHECK\r
+ | K_INHERITCHECK\r
+ | K_REQMIN\r
+ | K_REQOPT\r
+ | K_REQREFUSE\r
+ | K_PREJITGRANT\r
+ | K_PREJITDENY\r
+ | K_NONCASDEMAND\r
+ | K_NONCASLINKDEMAND\r
+ | K_NONCASINHERITANCE\r
+ ;\r
+\r
+module_head : D_MODULE\r
+ {\r
+ }\r
+ | D_MODULE comp_name\r
+ {\r
+ codegen.SetModuleName ((string) $2);\r
+ }\r
+ | D_MODULE K_EXTERN comp_name\r
+ {\r
+ codegen.ExternTable.AddModule ((string) $3); \r
+ }\r
+ ;\r
+\r
+file_decl : D_FILE file_attr comp_name file_entry D_HASH ASSIGN\r
+ bytes_list file_entry\r
+ {\r
+ codegen.SetFileRef (new FileRef ((string) $3, (byte []) $7, (bool) $2, (bool) $8)); \r
+ }\r
+ | D_FILE file_attr comp_name file_entry\r
+ {\r
+ // We need to compute the hash ourselves. :-(\r
+ // AssemblyName an = AssemblyName.GetName ((string) $3);\r
+ }\r
+ ;\r
+\r
+file_attr : /* EMPTY */\r
+ {\r
+ $$ = true;\r
+ }\r
+ | file_attr K_NOMETADATA\r
+ {\r
+ $$ = false;\r
+ }\r
+ ;\r
+\r
+file_entry : /* EMPTY */\r
+ {\r
+ $$ = false;\r
+ }\r
+ | D_ENTRYPOINT\r
+ {\r
+ $$ = true;\r
+ }\r
+ ;\r
+\r
+assembly_all : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
;\r
\r
-hexbytes : hexbyte \r
- | hexbytes hexbyte \r
+assembly_head : D_ASSEMBLY asm_attr slashed_name\r
+ {\r
+ codegen.SetAssemblyName ((string) $3);\r
+ }\r
;\r
\r
-instr_r_head : INSTR_R OPEN_PARENS \r
+asm_attr : /* EMPTY */\r
+ | asm_attr K_NOAPPDOMAIN\r
+ | asm_attr K_NOPROCESS\r
+ | asm_attr K_NOMACHINE\r
;\r
\r
-methodSpec : K_METHOD \r
+assembly_decls : /* EMPTY */\r
+ | assembly_decls assembly_decl\r
;\r
\r
-instr : INSTR_NONE \r
- { \r
- codegen.CodeBuffer.Inst ((Op) $1); \r
+assembly_decl : D_PUBLICKEY ASSIGN bytes_list\r
+ {\r
+ codegen.SetAssemblyPublicKey ((byte []) $3);\r
}\r
- | INSTR_VAR int32 {/* currentInstr = new InstrVar ((OpCode) $1, $2);*/}\r
- | INSTR_VAR id {/* currentInstr = new InstrVar ((OpCode) $1, $2); */}\r
- | INSTR_I int32 \r
+ | D_VER int32 COLON int32 COLON int32 COLON int32\r
{\r
- codegen.CodeBuffer.IntInst ((IntOp) $1, (int) $2); \r
- }\r
- | INSTR_I8 int64 {/* currentInstr = new InstrI8 ((OpCode) $1, (Int64) $2);*/}\r
- | INSTR_R float64 {/* currentInstr = new InstrR ((OpCode) $1, (Double) $2);*/}\r
- | INSTR_R int64 {/* currentInstr = new InstrR ((OpCode) $1, (Int64) $2);*/}\r
- | instr_r_head bytes CLOSE_PARENS \r
- | INSTR_BRTARGET int32 \r
- | INSTR_BRTARGET id \r
- | INSTR_METHOD method_ref \r
+ codegen.SetAssemblyVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
+ }\r
+ | D_LOCALE comp_qstring\r
{\r
- codegen.CodeBuffer.MethInst ((MethodOp) $1, (Method) $2); \r
+ codegen.SetAssemblyLocale ((string) $2);\r
}\r
-\r
- \r
- | INSTR_METHOD callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- {\r
- \r
- }\r
- | INSTR_NEWOBJ callConv type assembly_name name1 DOUBLE_COLON call_name OPEN_PARENS signature_args CLOSE_PARENS\r
- { \r
- \r
- }\r
- | INSTR_FIELD type typeSpec DOUBLE_COLON id \r
- | INSTR_FIELD field_ref \r
+ | D_LOCALE ASSIGN bytes_list\r
+ | D_HASH K_ALGORITHM int32\r
{\r
- codegen.CodeBuffer.FieldInst ((FieldOp) $1, (Field) $2);\r
+ codegen.SetAssemblyHashAlgorithm ((int) $3);\r
}\r
- | INSTR_TYPE type_ref\r
+ | customattr_decl\r
{\r
- TypeRef type_ref = (TypeRef) $2;\r
- codegen.CodeBuffer.TypeInst ((TypeOp) $1, type_ref.Type); \r
+ codegen.AddAssemblyCustomAttribute ((CustomAttr) $1);\r
}\r
- | INSTR_STRING compQstring \r
- {\r
- codegen.CodeBuffer.ldstr ((string) $2);\r
- }\r
- | INSTR_STRING bytearrayhead bytes CLOSE_PARENS \r
- | INSTR_SIG callConv type OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | INSTR_RVA id \r
- | INSTR_RVA int32 \r
- | INSTR_TOK methodSpec callConv type typeSpec DOUBLE_COLON methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | INSTR_TOK methodSpec callConv type methodName OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | INSTR_TOK K_FIELD type typeSpec DOUBLE_COLON id \r
- | INSTR_TOK K_FIELD type id \r
- | INSTR_TOK typeSpec \r
- | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS \r
- | INSTR_PHI int16s \r
- ;\r
-\r
-param_name : /* EMPTY */\r
- | name1\r
- ;\r
-\r
-arg_list \r
- : /* EMPTY */\r
- | paramAttr type_ref param_name\r
- {\r
- ArrayList arg_list = new ArrayList ();\r
- Param param = new Param ((ParamAttr) $1, $3 as string, ((TypeRef) $2).Type);\r
- DictionaryEntry entry = new DictionaryEntry (param, $2);\r
-\r
- arg_list.Add (entry); \r
- $$ = arg_list;\r
- }\r
- | arg_list COMMA paramAttr type_ref param_name\r
- {\r
- ArrayList arg_list = (ArrayList) $1;\r
- Param param = new Param ((ParamAttr) $3, $5 as string, ((TypeRef) $4).Type);\r
- DictionaryEntry entry = new DictionaryEntry (param, $4);\r
-\r
- arg_list.Add (entry);\r
- $$ = arg_list;\r
- }\r
- ;\r
-\r
-param_name : /* EMPTY */\r
- | name1\r
- ;\r
-\r
-named_arg\r
- : type_ref ID\r
- {\r
- $$ = new DictionaryEntry ((string) $1, (string) $2);\r
- }\r
- ;\r
-\r
-named_arg_list \r
- : /* EMPTY */\r
- | named_arg\r
- {\r
- ArrayList arg_list = new ArrayList ();\r
- arg_list.Add ($1);\r
-\r
- $$ = arg_list; \r
- }\r
- | named_arg_list COMMA named_arg \r
- {\r
- ArrayList arg_list = (ArrayList) $1;\r
- arg_list.Add ($3);\r
- \r
- $$ = arg_list;\r
- }\r
- ; \r
-\r
- \r
-signature_args : /* EMPTY */\r
- | type\r
- | type COMMA signature_args\r
+ | sec_decl\r
;\r
\r
-binding_flags : /* EMPTY */\r
- | K_INSTANCE\r
- ;\r
-\r
-sigArgs0 : /* EMPTY */ \r
- | sigArgs1 \r
- ;\r
-\r
-sigArgs1 : sigArg \r
- | sigArgs1 COMMA sigArg { $$ = String.Format ("{0},{1}", $1, $2); }\r
- ;\r
-\r
-sigArg : ELLIPSIS \r
- | paramAttr type_ref \r
- | paramAttr type id { $$ = String.Format ("{0} {1}", $2, $3); }\r
- | paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS \r
- | paramAttr type K_MARSHAL OPEN_PARENS nativeType CLOSE_PARENS id \r
- ;\r
- \r
-\r
-dottedName : id DOT id {$$ = ($1 as string) + "." + ($3 as string);}\r
+asm_or_ref_decl : D_PUBLICKEY ASSIGN bytes_list\r
+ | D_VER int32 COLON int32 COLON int32 COLON int32 \r
+ | D_LOCALE comp_qstring\r
+ | D_LOCALE ASSIGN bytes_list\r
+ | customattr_decl\r
;\r
\r
-\r
-name1 : id\r
- | dottedName\r
- | name1 DOT name1 {$$ = String.Format ("{0}.{1}", $1, $3); }\r
+assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
;\r
\r
-call_name : \r
- | id\r
- | D_CTOR\r
- | D_CCTOR\r
- ;\r
+assemblyref_head : D_ASSEMBLY K_EXTERN slashed_name\r
+ {\r
+ System.Reflection.AssemblyName asmb_name = \r
+ new System.Reflection.AssemblyName ();\r
+ asmb_name.Name = (string) $3;\r
+ codegen.BeginAssemblyRef ((string) $3, asmb_name);\r
+ }\r
+ | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name\r
+ {\r
+ System.Reflection.AssemblyName asmb_name = \r
+ new System.Reflection.AssemblyName ();\r
+ asmb_name.Name = (string) $3;\r
+ codegen.BeginAssemblyRef ((string) $5, asmb_name);\r
+ }\r
+ ;\r
+\r
+assemblyref_decls : /* EMPTY */\r
+ | assemblyref_decls assemblyref_decl\r
+ ;\r
+\r
+assemblyref_decl : D_VER int32 COLON int32 COLON int32 COLON int32\r
+ {\r
+ codegen.CurrentAssemblyRef.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
+ }\r
+ | D_PUBLICKEY ASSIGN bytes_list\r
+ {\r
+ codegen.CurrentAssemblyRef.SetPublicKey ((byte []) $3);\r
+ }\r
+ | D_PUBLICKEYTOKEN ASSIGN bytes_list\r
+ {\r
+ codegen.CurrentAssemblyRef.SetPublicKeyToken ((byte []) $3);\r
+ }\r
+ | D_LOCALE comp_qstring\r
+ {\r
+ codegen.CurrentAssemblyRef.SetLocale ((string) $2);\r
+ }\r
+ | D_LOCALE ASSIGN bytes_list\r
\r
-assembly_ref : id\r
- | id DASH id {$$ = String.Format ("{0}-{1}", $1, $3);}\r
- | id DASH assembly_ref {$$ = String.Format ("{0}-{1}", $1, $3);}\r
- ;\r
-\r
-assembly_name : OPEN_BRACKET assembly_ref CLOSE_BRACKET {$$ = ($2 as string);}\r
- ;\r
-\r
-className : OPEN_BRACKET name1 CLOSE_BRACKET slashedName \r
- | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET slashedName \r
- | slashedName \r
- ;\r
-\r
-slashedName : name1\r
- | slashedName SLASH name1 {$$ = ($1 as string) + "/" + ($3 as string);}\r
- ;\r
-\r
-typeSpec : className \r
- | OPEN_BRACKET name1 CLOSE_BRACKET \r
- | OPEN_BRACKET D_MODULE name1 CLOSE_BRACKET \r
- | type \r
- ;\r
-\r
-callConv : K_INSTANCE callConv { $$ = (CallConv) $1 | CallConv.Instance; }\r
- | K_EXPLICIT callConv { $$ = (CallConv) $1 | CallConv.InstanceExplicit; }\r
- | callKind \r
- ;\r
-\r
-callKind : /* EMPTY */ { $$ = CallConv.Default; }\r
- | K_DEFAULT { $$ = (CallConv) $1 | CallConv.Default; }\r
- | K_VARARG { $$ = (CallConv) $1 | CallConv.Vararg; }\r
- | K_UNMANAGED K_CDECL { $$ = (CallConv) $1 | CallConv.Cdecl; }\r
- | K_UNMANAGED K_STDCALL { $$ = (CallConv) $1 | CallConv.Stdcall; }\r
- | K_UNMANAGED K_THISCALL { $$ = (CallConv) $1 | CallConv.Thiscall; }\r
- | K_UNMANAGED K_FASTCALL { $$ = (CallConv) $1 | CallConv.Fastcall; }\r
- ;\r
-\r
-nativeType : /* EMPTY */ \r
- | K_CUSTOM OPEN_PARENS compQstring COMMA compQstring COMMA compQstring COMMA compQstring CLOSE_PARENS \r
- | K_CUSTOM OPEN_PARENS compQstring COMMA compQstring CLOSE_PARENS \r
- | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET \r
- | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET \r
- | K_VARIANT \r
- | K_CURRENCY \r
- | K_SYSCHAR \r
- | K_VOID \r
- | K_BOOL \r
- | K_INT8 \r
- | K_INT16 \r
- | K_INT32 \r
- | K_INT64 \r
- | K_FLOAT32 \r
- | K_FLOAT64 \r
- | K_ERROR \r
- | K_UNSIGNED K_INT8 \r
- | K_UNSIGNED K_INT16 \r
- | K_UNSIGNED K_INT32 \r
- | K_UNSIGNED K_INT64 \r
- | nativeType STAR \r
- | nativeType OPEN_BRACKET CLOSE_BRACKET \r
- | nativeType OPEN_BRACKET int32 CLOSE_BRACKET \r
- | nativeType OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET \r
- | nativeType OPEN_BRACKET PLUS int32 CLOSE_BRACKET \r
- | K_DECIMAL \r
- | K_DATE \r
- | K_BSTR \r
- | K_LPSTR \r
- | K_LPWSTR \r
- | K_LPTSTR \r
- | K_OBJECTREF \r
- | K_IUNKNOWN \r
- | K_IDISPATCH \r
- | K_STRUCT \r
- | K_INTERFACE \r
- | K_SAFEARRAY variantType \r
- | K_INT \r
- | K_UNSIGNED K_INT \r
- | K_NESTED K_STRUCT \r
- | K_BYVALSTR \r
- | K_ANSI K_BSTR \r
- | K_TBSTR \r
- | K_VARIANT K_BOOL \r
- | methodSpec \r
- | K_AS K_ANY \r
- | K_LPSTRUCT \r
- ;\r
-\r
-variantType : /* EMPTY */ \r
- | K_NULL \r
- | K_VARIANT \r
- | K_CURRENCY \r
- | K_VOID \r
- | K_BOOL \r
- | K_INT8 \r
- | K_INT16 \r
- | K_INT32 \r
- | K_INT64 \r
- | K_FLOAT32 \r
- | K_FLOAT64 \r
- | K_UNSIGNED K_INT8 \r
- | K_UNSIGNED K_INT16 \r
- | K_UNSIGNED K_INT32 \r
- | K_UNSIGNED K_INT64 \r
- | STAR \r
- | variantType OPEN_BRACKET CLOSE_BRACKET \r
- | variantType K_VECTOR \r
- | variantType AMPERSAND \r
- | K_DECIMAL \r
- | K_DATE \r
- | K_BSTR \r
- | K_LPSTR \r
- | K_LPWSTR \r
- | K_IUNKNOWN \r
- | K_IDISPATCH \r
- | K_SAFEARRAY \r
- | K_INT \r
- | K_UNSIGNED K_INT \r
- | K_ERROR \r
- | K_HRESULT \r
- | K_CARRAY \r
- | K_USERDEFINED \r
- | K_RECORD \r
- | K_FILETIME \r
- | K_BLOB \r
- | K_STREAM \r
- | K_STORAGE \r
- | K_STREAMED_OBJECT \r
- | K_STORED_OBJECT \r
- | K_BLOB_OBJECT \r
- | K_CF \r
- | K_CLSID \r
- ;\r
-\r
-type : K_CLASS className \r
- | K_OBJECT \r
- | K_STRING \r
- | K_VALUE K_CLASS className \r
- | K_VALUETYPE className \r
- | type OPEN_BRACKET CLOSE_BRACKET \r
- | type OPEN_BRACKET bounds1 CLOSE_BRACKET \r
- /* uncomment when and if this type is supported by the Runtime\r
- | type K_VALUE OPEN_BRACKET int32 CLOSE_BRACKET \r
- */\r
- | type AMPERSAND \r
- | type STAR \r
- | type K_PINNED \r
- | type K_MODREQ OPEN_PARENS className CLOSE_PARENS \r
- | type K_MODOPT OPEN_PARENS className CLOSE_PARENS \r
- | BANG int32 \r
- | methodSpec callConv type STAR OPEN_PARENS sigArgs0 CLOSE_PARENS \r
- | K_TYPEDREF \r
- | K_CHAR \r
- | K_VOID \r
- | K_BOOL \r
- | K_INT8 \r
- | K_INT16 \r
- | K_INT32 \r
- | K_INT64 \r
- | K_FLOAT32 \r
- | K_FLOAT64 \r
- | K_UNSIGNED K_INT8 {$$ = "uint8";}\r
- | K_UNSIGNED K_INT16 {$$ = "uint16";}\r
- | K_UNSIGNED K_INT32 {$$ = "uint32";}\r
- | K_UNSIGNED K_INT64 {$$ = "uint64";}\r
- | K_NATIVE K_INT \r
- | K_NATIVE K_UNSIGNED K_INT \r
- | K_NATIVE K_FLOAT \r
- ;\r
-\r
-bounds1 : bound \r
- | bounds1 COMMA bound \r
- ;\r
-\r
-bound : /* EMPTY */ \r
- | ELLIPSIS \r
- | int32 \r
- | int32 ELLIPSIS int32 \r
- | int32 ELLIPSIS \r
- ;\r
-\r
-labels : /* empty */ \r
- | id COMMA labels \r
- | int32 COMMA labels \r
- | id \r
- | int32 \r
- ;\r
-\r
-\r
-id : ID \r
- | SQSTRING \r
- ;\r
-\r
-int16s : /* EMPTY */ \r
- | int16s int32 \r
- ;\r
- \r
-int32 : INT32 /* NOTE: it's INT64 in docs */\r
- ;\r
-\r
-int64 : INT64 \r
+ | D_HASH ASSIGN bytes_list\r
+ {\r
+ codegen.CurrentAssemblyRef.SetHash ((byte []) $3);\r
+ }\r
+ | customattr_decl\r
+ {\r
+ codegen.CurrentAssemblyRef.AddCustomAttribute ((CustomAttr) $1);\r
+ }\r
;\r
\r
-float64 : FLOAT64 \r
- | K_FLOAT32 OPEN_PARENS int32 CLOSE_PARENS \r
- | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS \r
+exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
;\r
\r
-secDecl : D_PERMISSION secAction typeSpec OPEN_PARENS nameValPairs CLOSE_PARENS \r
- | D_PERMISSION secAction typeSpec \r
- | psetHead bytes CLOSE_PARENS \r
+exptype_head : D_CLASS K_EXTERN expt_attr comp_name\r
;\r
\r
-psetHead : D_PERMISSIONSET secAction ASSIGN OPEN_PARENS \r
+expt_attr : /* EMPTY */\r
+ | expt_attr K_PRIVATE\r
+ | expt_attr K_PUBLIC \r
+ | expt_attr K_NESTED K_PUBLIC\r
+ | expt_attr K_NESTED K_PRIVATE\r
+ | expt_attr K_NESTED K_FAMILY\r
+ | expt_attr K_NESTED K_ASSEMBLY\r
+ | expt_attr K_NESTED K_FAMANDASSEM\r
+ | expt_attr K_NESTED K_FAMORASSEM\r
;\r
\r
-nameValPairs : nameValPair \r
- | nameValPair COMMA nameValPairs \r
+exptype_decls : /* EMPTY */\r
+ | exptype_decls exptype_decl\r
;\r
\r
-nameValPair : compQstring ASSIGN caValue \r
+exptype_decl : D_FILE comp_name\r
+ | D_CLASS K_EXTERN comp_name\r
+ | D_CLASS int32\r
+ | customattr_decl\r
;\r
\r
-truefalse : K_TRUE \r
- | K_FALSE \r
+manifestres_all : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
;\r
\r
-caValue : truefalse \r
- | int32 \r
- | K_INT32 OPEN_PARENS int32 CLOSE_PARENS \r
- | compQstring \r
- | className OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS \r
- | className OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS \r
- | className OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS \r
- | className OPEN_PARENS int32 CLOSE_PARENS \r
+manifestres_head : D_MRESOURCE manres_attr comp_name \r
;\r
\r
-secAction : K_REQUEST \r
- | K_DEMAND \r
- | K_ASSERT \r
- | K_DENY \r
- | K_PERMITONLY \r
- | K_LINKCHECK \r
- | K_INHERITCHECK \r
- | K_REQMIN \r
- | K_REQOPT \r
- | K_REQREFUSE \r
- | K_PREJITGRANT \r
- | K_PREJITDENY \r
- | K_NONCASDEMAND \r
- | K_NONCASLINKDEMAND \r
- | K_NONCASINHERITANCE \r
+manres_attr : /* EMPTY */\r
+ | manres_attr K_PUBLIC\r
+ | manres_attr K_PRIVATE\r
;\r
\r
-extSourceSpec : D_LINE int32 SQSTRING \r
- | D_LINE int32 \r
- | D_XLINE int32 QSTRING \r
+manifestres_decls : /* EMPTY */\r
+ | manifestres_decls manifestres_decl\r
;\r
\r
-fileDecl : D_FILE fileAttr name1 fileEntry hashHead bytes CLOSE_PARENS fileEntry \r
- | D_FILE fileAttr name1 fileEntry \r
+manifestres_decl : D_FILE comp_name K_AT int32\r
+ | D_ASSEMBLY K_EXTERN slashed_name\r
+ | customattr_decl\r
;\r
\r
-fileAttr : /* EMPTY */ \r
- | fileAttr K_NOMETADATA \r
+comp_qstring : QSTRING\r
+ | comp_qstring PLUS QSTRING { $$ = String.Format ("{0}{1}", $1, $3); }\r
;\r
\r
-fileEntry : /* EMPTY */ \r
- | D_ENTRYPOINT \r
+int32 : INT64\r
+ {\r
+ long l = (long) $1;\r
+ byte[] intb = BitConverter.GetBytes (l);\r
+ $$ = BitConverter.ToInt32 (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ }\r
;\r
\r
-hashHead : D_HASH ASSIGN OPEN_PARENS \r
+int64 : INT64\r
;\r
\r
-assemblyHead : D_ASSEMBLY asmAttr name1\r
- {\r
- /*\r
- // TODO: set assembly attrs\r
- codegen.SetName ($3 as string);\r
- */\r
- }\r
+float64 : FLOAT64\r
+ | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS\r
+ {\r
+ int i = (int) $3;\r
+ byte[] intb = BitConverter.GetBytes (i);\r
+ $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ }\r
+ | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
+ {\r
+ long l = (long) $3;\r
+ byte[] intb = BitConverter.GetBytes (l);\r
+ $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
+ {\r
+ byte[] intb = BitConverter.GetBytes ((long) $3);\r
+ $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ }\r
+ | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
+ {\r
+ byte[] intb = BitConverter.GetBytes ((int) $3);\r
+ $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ }\r
;\r
\r
-asmAttr : /* EMPTY */ \r
- | asmAttr K_NOAPPDOMAIN \r
- | asmAttr K_NOPROCESS \r
- | asmAttr K_NOMACHINE \r
+hexbyte : HEXBYTE { }\r
;\r
\r
-assemblyDecls : /* EMPTY */\r
- | assemblyDecls assemblyDecl\r
- ;\r
+bytes_list : OPEN_PARENS\r
+ {\r
+ tokenizer.InByteArray = true;\r
+ }\r
+ bytes CLOSE_PARENS\r
+ {\r
+ $$ = $3;\r
+ tokenizer.InByteArray = false;\r
+ }\r
+ ;\r
\r
-assemblyDecl : D_HASH K_ALGORITHM int32 \r
- | secDecl\r
- | asmOrRefDecl\r
+bytes : /* EMPTY */ { $$ = new byte[0]; }\r
+ | hexbytes\r
+ {\r
+ ArrayList byte_list = (ArrayList) $1;\r
+ $$ = byte_list.ToArray (typeof (byte));\r
+ }\r
;\r
\r
-asmOrRefDecl : publicKeyHead bytes CLOSE_PARENS \r
- | D_VER int32 COLON int32 COLON int32 COLON int32 \r
- | D_LOCALE compQstring \r
- | localeHead bytes CLOSE_PARENS \r
- | D_PROCESSOR int32 \r
- | D_OS int32 D_VER int32 COLON int32 \r
- | customAttrDecl\r
+hexbytes : hexbyte\r
+ {\r
+ ArrayList byte_list = new ArrayList ();\r
+ byte_list.Add (Convert.ToByte ($1));\r
+ $$ = byte_list;\r
+ }\r
+ | hexbytes hexbyte\r
+ {\r
+ ArrayList byte_list = (ArrayList) $1;\r
+ byte_list.Add (Convert.ToByte ($2));\r
+ }\r
;\r
\r
-publicKeyHead : D_PUBLICKEY ASSIGN OPEN_PARENS \r
+truefalse : K_TRUE\r
+ {\r
+ $$ = true;\r
+ }\r
+ | K_FALSE\r
+ {\r
+ $$ = false;\r
+ }\r
;\r
\r
-publicKeyTokenHead : D_PUBLICKEYTOKEN ASSIGN OPEN_PARENS \r
+id : ID\r
+ | SQSTRING\r
;\r
\r
-localeHead : D_LOCALE ASSIGN OPEN_PARENS \r
+comp_name : id\r
+ | comp_name DOT id\r
+ {\r
+ $$ = (string) $1 + '.' + (string) $3;\r
+ }\r
+ | COMP_NAME\r
;\r
\r
-assemblyRefHead : D_ASSEMBLY K_EXTERN name1 \r
- {\r
- System.Reflection.AssemblyName asmb_name = \r
- new System.Reflection.AssemblyName ();\r
- asmb_name.Name = (string) $3;\r
- codegen.ExternTable.AddAssembly ((string) $3, asmb_name);\r
- }\r
- ;\r
-\r
-assemblyRefDecls : /* EMPTY */\r
- | assemblyRefDecls assemblyRefDecl\r
- ;\r
-\r
-assemblyRefDecl : hashHead bytes CLOSE_PARENS \r
- | asmOrRefDecl\r
- | publicKeyTokenHead bytes CLOSE_PARENS \r
- ;\r
-\r
-comtypeHead : D_CLASS K_EXTERN comtAttr name1 \r
- ;\r
-\r
-exportHead : D_EXPORT comtAttr name1 \r
- ;\r
-\r
-comtAttr : /* EMPTY */ \r
- | comtAttr K_PRIVATE \r
- | comtAttr K_PUBLIC \r
- | comtAttr K_NESTED K_PUBLIC \r
- | comtAttr K_NESTED K_PRIVATE \r
- | comtAttr K_NESTED K_FAMILY \r
- | comtAttr K_NESTED K_ASSEMBLY \r
- | comtAttr K_NESTED K_FAMANDASSEM \r
- | comtAttr K_NESTED K_FAMORASSEM \r
- ;\r
-\r
-comtypeDecls : /* EMPTY */\r
- | comtypeDecls comtypeDecl\r
- ;\r
-\r
-comtypeDecl : D_FILE name1 \r
- | D_CLASS K_EXTERN name1 \r
- | D_CLASS int32 \r
- | customAttrDecl\r
- ;\r
-\r
-manifestResHead : D_MRESOURCE manresAttr name1 \r
- ;\r
-\r
-manresAttr : /* EMPTY */ \r
- | manresAttr K_PUBLIC \r
- | manresAttr K_PRIVATE \r
- ;\r
-\r
-manifestResDecls : /* EMPTY */\r
- | manifestResDecls manifestResDecl\r
- ;\r
-\r
-manifestResDecl : D_FILE name1 K_AT int32 \r
- | D_ASSEMBLY K_EXTERN name1 \r
- | customAttrDecl\r
- ;\r
-\r
-\r
-\r
%%\r
\r
-} // namespace Mono.ILASM\r
+}\r
+\r