private void CompileExp(Node ActiveNode) { if (ActiveNode.Nodes[0].IsTerminal) { if (ActiveNode.Nodes[0].TypeToken == TokenType.INTEGER_LITERAL) { this.AssemblerGenerator.Emit(Emit.OpCodes.Ldc_I4, System.Convert.ToInt32(ActiveNode.Nodes[0].Value)); } if (ActiveNode.Nodes[0].TypeToken == TokenType.KW_TRUE) { this.AssemblerGenerator.Emit(Emit.OpCodes.Ldc_I4, 1); } if (ActiveNode.Nodes[0].TypeToken == TokenType.KW_FALSE) { this.AssemblerGenerator.Emit(Emit.OpCodes.Ldc_I4, 0); } if ((ActiveNode.Nodes[0].TypeToken == TokenType.KW_NEW) && (ActiveNode.Nodes[1].TypeToken == TokenType.ID)) { if (!TypeTable.ContainsKey(ActiveNode.Nodes[1].Value)) { throw new System.Exception("Не найден тип " + ActiveNode.Nodes[1].Value); } else { this.AssemblerGenerator.Emit(Emit.OpCodes.Newobj, TypeTable[ActiveNode.Nodes[1].Value].GetConstructor(System.Type.EmptyTypes)); CreateCode(ActiveNode.Nodes[4]); } } if ((ActiveNode.Nodes[0].TypeToken == TokenType.KW_NEW) && (ActiveNode.Nodes[2].TypeToken == TokenType.O_S_BRACKET)) { CreateCode(ActiveNode.Nodes[3]); this.AssemblerGenerator.Emit(Emit.OpCodes.Newarr, TypeByTypeId(ActiveNode.Nodes[1])); } if (ActiveNode.Nodes[0].TypeToken == TokenType.O_R_BRACKET) { CreateCode(ActiveNode.Nodes[1]); } if (ActiveNode.Nodes[0].TypeToken == TokenType.ID) { Load(ActiveNode.Nodes[0].Value); } } else { } CreateCode(ActiveNode.Nodes[ActiveNode.Nodes.Count - 1]); }
//Almacena el valor del tope de la pila en el nombre de variable proporcionado (no maneja ambito) public static void Almacenar(string nombre, Emit.ILGenerator _il) { if (!TablaDireccionesSimbolos.ContainsKey(nombre)) { TablaDireccionesSimbolos[nombre] = _il.DeclareLocal(typeof(System.Int32)); //Solo variables enteras } Emit.LocalBuilder variableLocal = TablaDireccionesSimbolos[nombre]; if (!variableLocal.LocalType.HasElementType) //(es una variable simple) verdadero solo en caso de vectores o matrices { _il.Emit(Emit.OpCodes.Stloc, TablaDireccionesSimbolos[nombre]); } else //es una matriz o vector y actuo acorde { throw new System.Exception("No se soportan arrays o matrices en las asignaciones"); } }
private Type GenerteMethodCallCode(MethodCall objCall) { Type type = null; MethodBase methodBase = GetMethodInfo(objCall); foreach (object para in objCall.parameters) { string varaibleName = para.ToString(); Type expectedType = null; if (symbolTable.ContainsKey(varaibleName)) { expectedType = symbolTable[varaibleName].LocalType; } else if (parameterTable.ContainsKey(varaibleName)) { expectedType = parameterTable[varaibleName]; } else if (typefieldList.ContainsKey(varaibleName)) { expectedType = typefieldList[varaibleName].FieldType; } this.GenExpr(new Variable(varaibleName), expectedType); } if (objCall.IsConstrutor) { this.il.Emit(Emit.OpCodes.Newobj, (ConstructorInfo)methodBase); type = ((System.Reflection.MemberInfo)methodBase).ReflectedType; } else { int indx = 0; foreach (string para in symbolTable.Keys) { if (para.Equals(objCall.className, StringComparison.OrdinalIgnoreCase)) { this.il.Emit(Emit.OpCodes.Ldloc_S, Convert.ToByte(indx)); break; } indx++; } //this.il.Emit(Emit.OpCodes.Callvirt,(MethodInfo) methodBase); this.il.Emit(Emit.OpCodes.Call, (MethodInfo)methodBase); try { type = ((MethodInfo)methodBase).ReturnParameter.ParameterType; } catch (InvalidOperationException) { type = parent.parent.GetMethodReturnType(objCall); } } return(type); }
private System.Type TypeByTypeId(Node TypeNode) { System.Type Result = null; if (!TypeNode.IsTerminal) { if (TypeNode.Nodes.Count > 1) { // Массивы if (TypeNode.Nodes[0].Value == "int") { return(typeof(System.Int32[])); } } else { if (TypeNode.Nodes[0].Value == "int") { return(System.Type.GetType("System.Int32")); } if (TypeNode.Nodes[0].Value == "boolean") { return(System.Type.GetType("System.Boolean")); } if (CreatedTypeTable.ContainsKey(TypeNode.Nodes[0].Value)) { return(CreatedTypeTable[TypeNode.Nodes[0].Value]); } } } else { if (TypeNode.Value == "int") { return(System.Type.GetType("System.Int32[]")); } } throw new System.Exception("Использование неопределённого типа"); }