示例#1
0
        // Вывести тип переменной
        /// <summary>
        /// Определить тип переменной
        /// </summary>
        /// <returns>0, 1, 2</returns>
        /// <param name="varTypes">Список существующих переменных с типами</param>
        /// <param name="val">Тип переменной трехадресного кода</param>
        private type DetectType(ThreeAddressValueType val)
        {
            if (val == null)
            {
                throw new Exception("Variable is null");
            }

            if (val is ThreeAddressStringValue value)
            {
                if (!variables.ContainsKey(value.Value))
                {
                    throw new Exception("Variable " + value.Value + " is not found");
                }

                return(varTypes[value.Value]);
            }

            if (val is ThreeAddressIntValue valueInt)
            {
                return(type.tint);
            }

            if (val is ThreeAddressLogicValue valueLogic)
            {
                return(type.tbool);
            }

            if (val is ThreeAddressDoubleValue valueDouble)
            {
                return(type.treal);
            }

            throw new Exception("Unknown type");
        }
示例#2
0
        private void LoadValue(ThreeAddressValueType v, CastOptions opts = CastOptions.No)
        {
            switch (v)
            {
            case ThreeAddressStringValue sv:
                genc.Emit(OpCodes.Ldloc, variables[sv.Value]);
                break;

            case ThreeAddressIntValue iv:
                genc.Emit(OpCodes.Ldc_I4, iv.Value);
                break;

            case ThreeAddressDoubleValue dv:
                genc.Emit(OpCodes.Ldc_R8, dv.Value);
                break;

            case ThreeAddressLogicValue lv:
                genc.Emit(lv.Value ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
                break;
            }
            if (opts != CastOptions.No)
            {
                CastToResult(DetectType(v), opts);
            }
        }
示例#3
0
        /// <summary>
        /// Создать переменную и добавить в список переменных
        /// </summary>
        /// <returns>0, 1, 2</returns>
        /// <param name="varTypes">Список переменных с типами</param>
        /// <param name="name">Имя создаваемой переменной</param>
        /// <param name="val1">Тип переменной 1 трехадресного кода</param>
        /// <param name="val2">Тип переменной 2 трехадресного кода</param>
        private void AddVariable(string name, ThreeAddressValueType val1,
                                 ThreeAddressValueType val2, bool isLogic)
        {
            if (name == null || name.Length == 0)
            {
                throw new Exception("Variable name is null");
            }

            type type1 = DetectType(val1);
            type type2 = DetectType(val2);

            if (type1 == type2)
            {
                type t = isLogic ? type.tbool : type1;

                if (varTypes.ContainsKey(name))
                {
                    if (varTypes[name] != t)
                    {
                        throw new Exception("Previous declaration is different");
                    }
                    return;
                }

                var v = CreateVariable(t, name);
                variables.Add(name, v);
                varTypes.Add(name, t);
                return;
            }

            // int + double = double
            if ((type1 == type.tint && type2 == type.treal) ||
                (type1 == type.treal && type2 == type.tint))
            {
                if (varTypes.ContainsKey(name))
                {
                    if (varTypes[name] != type.treal)
                    {
                        throw new Exception("Previous declaration is different");
                    }
                    return;
                }

                type t = isLogic ? type.tbool : type.treal;

                var v = CreateVariable(t, name);
                variables.Add(name, v);
                varTypes.Add(name, t);
                return;
            }

            //ToDo Подумать результаты операций

            throw new Exception("Unknown situation");
        }
示例#4
0
        private static ConstPropSemilatticeEl GetSemilatticeEl
            (ThreeAddressValueType val,
            Dictionary <string, ConstPropKeyValue> m)
        {
            ConstPropSemilatticeEl semilatticeEl = null;

            if (val is ThreeAddressStringValue v)
            {
                semilatticeEl = m[v.Value].Value;
            }
            else if (val is ThreeAddressIntValue c)
            {
                semilatticeEl = new ConstPropSemilatticeEl(ValConstType.Const, c.Value);
            }

            return(semilatticeEl);
        }
示例#5
0
        private type ResultType(ThreeAddressValueType v1, ThreeAddressValueType v2)
        {
            type type1 = DetectType(v1);
            type type2 = DetectType(v2);

            if (type1 == type2)
            {
                return(type1);
            }

            // int + double = double
            if ((type1 == type.tint && type2 == type.treal) ||
                (type1 == type.treal && type2 == type.tint))
            {
                return(type.treal);
            }

            throw new Exception("Unknown situation");
        }
示例#6
0
        /// <summary>
        /// Создать переменную и добавить в список переменных
        /// </summary>
        /// <returns>0, 1, 2</returns>
        /// <param name="varTypes">Список переменных с типами</param>
        /// <param name="name">Имя создаваемой переменной</param>
        /// <param name="val">Тип переменной трехадресного кода</param>
        private void AddVariable(string name, ThreeAddressValueType val)
        {
            if (name == null || name.Length == 0)
            {
                throw new Exception("Variable name is null");
            }

            type t = DetectType(val);

            if (varTypes.ContainsKey(name))
            {
                //if (varTypes[name] != t)
                //    throw new Exception("Previous declaration is different");
                return;
            }
            var v = CreateVariable(t, name);

            variables.Add(name, v);
            varTypes.Add(name, t);
        }
 private void Set(System.Collections.Generic.LinkedListNode <Visitors.ThreeCode> it, ThreeAddressValueType res)
 {
     it.Value.operation = ThreeOperator.Assign;
     it.Value.arg1      = res;
     _apply             = true;
 }