Пример #1
0
        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]);
        }
Пример #2
0
        //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");
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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("Использование неопределённого типа");
        }