// Вывести тип переменной /// <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"); }
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); } }
/// <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"); }
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); }
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"); }
/// <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; }