public GraficNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args) : base(keeper, terminal, args) { string code = Token.Text; if (Keeper.Module.Grafics.ContainsKey(code)) { Grafic = Keeper.Module.Grafics[code]; } foreach (var m in Keeper.Module.LinkedModules) { if (m.Grafics.ContainsKey(code)) { Grafic = m.Grafics[code]; } } if (Grafic == null) { AddError("Не найден график"); } else { if (args.Length != Grafic.Dim) { AddError("Количество аргументов функции не совпадает с рамерностью графика"); } else if (args.Any(arg => !arg.Type.DataType.LessOrEquals(DataType.Real))) { AddError("Недопустимые аргументы функции График"); } } }
public TablikCalcParam(TablikModule module, IRecordRead rec, bool isSubParam, bool isGenerated) : base(rec, isSubParam) { Module = module; Keeper = new TablikKeeper(this); IsGenerated = isGenerated; if (!Code.IsCorrectCode()) { ErrMess += "Указан недопустимый код расчетного параметра; "; IsFatalError = true; } CalcOn = rec.GetBool("CalcOn"); UserExpr1 = rec.GetString("UserExpr1", ""); if (UserExpr1 == "") { ErrMess += "Не заполнено расчетное выражение; "; IsFatalError = true; } UserExpr2 = rec.GetString("UserExpr2", ""); if (UserExpr2 == "") { ErrMess += "Не заполнено управляющее выражение; "; IsFatalError = true; } InputsStr = rec.GetString("Inputs"); JoinToParamTree(); }
//Конструктор для тестов public TablikCalcParam(TablikModule module, string code, string expr1, string expr2 = "Расчет") : base(false) { Module = module; Code = code; UserExpr1 = expr1; UserExpr2 = expr2; Keeper = new TablikKeeper(this); }
public ParamNode(TablikKeeper keeper, ITerminalNode terminal, TablikCalcParam param, IEnumerable <IExprNode> args = null) : base(keeper, terminal) { Param = param; Args = args != null?args.ToArray() : new IExprNode[0]; if (Keeper.Module == param.Module && !Keeper.Param.UsedParams.ContainsKey(param)) { Keeper.Param.UsedParams.Add(param, terminal.Symbol); } }
public TablNode(TablikKeeper keeper, ITerminalNode fun, ITerminalNode tabl, ITerminalNode field, params IExprNode[] args) : base(keeper, fun, args) { Fun = Keeper.FunsChecker.Funs[Token.Text]; var t = tabl.Symbol.Text; if (Keeper.Module.Tabls.Structs.ContainsKey(t)) { Tabl = Keeper.Module.Tabls.Structs[t]; } else { foreach (var m in Keeper.Module.LinkedModules) { if (m.Tabls.Structs.ContainsKey(t)) { if (Tabl != null) { AddError("Таблица присутствует сразу в нескольких модулях"); } else { Tabl = m.Tabls.Structs[t]; } } } } if (Tabl == null) { AddError("Не найдена таблица"); } else { int tnum = Fun.Code == "tabl" || Fun.Code == "tablcontains" ? Args.Length - 1 : Args.Length; if (Tabl.Tabls.Count - 1 < tnum) { AddError("Недопустимое количество аргументов функции"); } else if (field != null) { Field = field.Symbol.Text; var fields = Tabl.Tabls[tnum].Fields; if (!fields.ContainsKey(Field)) { AddError("В таблице не найдено указанное поле", field.Symbol); } else { FieldType = fields[Field]; } } } }
public SignalNode(TablikKeeper keeper, ITerminalNode terminal) : base(keeper, terminal) { var code = terminal.Symbol.Text.Substring(1, terminal.Symbol.Text.Length - 2); string ocode = null, scode = null; int pos = code.LastIndexOf('.'); if (pos != -1) { scode = code.Substring(pos + 1); ocode = code.Substring(0, pos); } else { ocode = code.Substring(1, code.Length - 2); } foreach (var source in Keeper.Project.Sources.Values) { var objs = source.Objects; var uobjs = Keeper.Module.UsedObjects; if (objs.ContainsKey(code)) { if (Object != null) { AddError("Указанный объект присутствует в нескольких источниках"); } Object = objs[ocode = code]; Signal = Object.Signal; _isObject = true; } else if (pos != -1 && objs.ContainsKey(ocode) && objs[ocode].ObjectType.Signals.ContainsKey(scode)) { if (Object != null) { AddError("Указанный сигнал присутствует в нескольких источниках"); } Object = objs[ocode]; Signal = Object.ObjectType.Signals[scode]; _isObject = false; } if (!uobjs.ContainsKey(ocode)) { uobjs.Add(ocode, Object); } if (!Object.UsedSignals.Contains(Signal)) { Object.UsedSignals.Add(Signal); } } }
public PrevNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args) : base(keeper, terminal, args) { if (args.Length == 2) { Def = args[1]; } if (!(args[0].Type is TablikCalcParam)) { AddError("Аргумент функции Абсолют должен задавать расчетный параметр", args[0].Token); } else { Param = (TablikCalcParam)args[0].Type; } }
public IfNode(TablikKeeper keeper, ITerminalNode terminal, IEnumerable <IExprNode> conditions, IEnumerable <IExprNode> variants) : base(keeper, terminal) { _conditions = conditions.ToList(); _variants = variants.ToList(); Args = new IExprNode[_conditions.Count + _variants.Count]; for (int i = 0; i < _conditions.Count; i++) { Args[2 * i] = _conditions[i]; Args[2 * i + 1] = _variants[i]; } if (_variants.Count > _conditions.Count) { Args[Args.Length - 1] = _variants[_variants.Count - 1]; } }
public AssignNode(TablikKeeper keeper, ITerminalNode assign, ITerminalNode v, IExprNode expr, IExprNode type = null) : base(keeper, assign, expr) { var vcode = v.Symbol.Text; var vars = Keeper.Param.Vars; if (vars.ContainsKey(vcode)) { Var = vars[vcode]; } else { vars.Add(vcode, Var = new TablikVar(vcode, type == null ? null : type.Type)); } if (Keeper.Param.Inputs.ContainsKey(vcode)) { AddError("Нельзя присваивать значение входу"); } }
public ParamTypeNode(TablikKeeper keeper, IEnumerable <ITerminalNode> codes) : base(keeper, codes.First()) { ISubParams p = Keeper.Module; foreach (var code in codes) { if (p.Params.ContainsKey(code.Symbol.Text)) { p = p.Params[code.Symbol.Text]; } else { AddError("Не найден " + (p == Keeper.Module ? "" : "под") + "параметр", code.Symbol); Type = new SimpleType(); } } if (Type == null) { Type = (TablikCalcParam)p; } }
public SignalTypeNode(TablikKeeper keeper, ITerminalNode terminal) : base(keeper, terminal) { var signalCode = Token.Text.Substring(1, Token.Text.Length - 2); foreach (var con in Keeper.Module.LinkedSources) { if (con.ObjectsTypes.ContainsKey(signalCode)) { Type = con.ObjectsTypes[signalCode]; } else if (con.BaseObjectsTypes.ContainsKey(signalCode)) { Type = con.BaseObjectsTypes[signalCode]; } } if (Type == null) { AddError("Не найден тип объекта или сигнала"); Type = new SimpleType(); } }
public MetSignalNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode parent) : base(keeper, terminal, parent) { Parent = parent; }
public SubParamsNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode expr) : base(keeper, terminal, expr) { }
public MetNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode parent, params IExprNode[] args) : base(keeper, terminal, args) { Parent = parent; IsMet = true; }
public ParamPropNode(TablikKeeper keeper, ITerminalNode terminal, ITerminalNode prop) : base(keeper, terminal) { IsMet = true; Prop = prop.Symbol; }
internal ExprVisitor(TablikKeeper keeper) { _keeper = keeper; }
public WhileNode(TablikKeeper keeper, ITerminalNode terminal, IExprNode condition, IExprNode prog) : base(keeper, terminal, condition, prog) { }
//Тип данных protected TablikKeeperNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args) : base(keeper, terminal) { Args = args; }
public ForNode(TablikKeeper keeper, ITerminalNode terminal, TablikVar v, IExprNode array, IExprNode prog) : base(keeper, terminal, array, prog) { Var = v; }
public ObjectPropNode(TablikKeeper keeper, IExprNode parent, ITerminalNode terminal, ITerminalNode prop) : base(keeper, terminal) { Parent = parent; Prop = prop.Symbol; }
protected KeeperNode(TablikKeeper keeper, ITerminalNode terminal) : base(terminal) { Keeper = keeper; }
public OwnerNode(TablikKeeper keeper, ITerminalNode terminal) : base(keeper, terminal) { }
public FunNode(TablikKeeper keeper, ITerminalNode terminal, params IExprNode[] args) : base(keeper, terminal, args) { Fun = Keeper.FunsChecker.Funs[Token.Text]; }