/// <summary> /// Заменяет команды перехода (#\s2, #\0.1\s2 и т.д.) /// </summary> /// <param name="Process">Процесс, ситуации которого рассматриваются</param> protected void ReplaceJumpSituationCommand(StringBuilder Code, RelkonCodeProcess Process) { string pattern = @"/\*(\d+)\*/.*(#(?:/(\d+\.\d+))?/s(\d+))"; do { int k = 0; MatchCollection mc = Regex.Matches(Code.ToString(), pattern); for (int i = 0; i < mc.Count; i++) { int LineNumber = int.Parse(mc[i].Groups[1].Value); string RelkonCode = mc[i].Groups[2].Value; uint delay = (mc[i].Groups[3].Value != "") ? (uint)(double.Parse(mc[i].Groups[3].Value, NumberFormatInfo.InvariantInfo) * 1000) : 0; string s = ""; if (this.ValidateDelayInterval(delay, LineNumber)) { RelkonCodeSituation Situation = Process.GetSituationByIndex(int.Parse(mc[i].Groups[4].Value)); if (Situation != null) { s = this.GetJumpToSituationCode(Process, Situation, delay); } else { this.errors.Add(new CompilationError("Указанной ситуации не существует", this.codeModel.FileName, LineNumber, false)); } } Code.Replace(RelkonCode, s, mc[i].Groups[2].Index + k, RelkonCode.Length); k += s.Length - RelkonCode.Length; } }while (Regex.IsMatch(Code.ToString(), @"#(?:/(\d+\.\d+))?/s(\d+)")); }
/// <summary> /// Генерирует код ситуации на основе исходного кода Relkon (заменяет команды Relkon /// на команды C /// </summary> /// <param name="Situation">Ситуация, чей код генерируется</param> /// <param name="Process">Процесс, к которому относится ситуация</param> private void GenerateSituationCode(RelkonCodeProcess Process, RelkonCodeSituation Situation, IndentedTextWriter CodeWriter) { StringBuilder code = new StringBuilder(Situation.Code); this.ReplaceIO(code); this.ReplaceStartStopProcessCommands(code); this.ReplaceJumpSituationCommand(code, Process); this.ReplaceRestartSituationCommands(code, Process); this.PerfomCustomReplacing(code); CodeWriter.Write(code.ToString()); }
/// <summary> /// Поверяет период ситуации на валидность; в случае ошибки заносит сообщение в список ошибок /// и возвращает false, иначе возвращает true /// </summary> protected abstract bool ValidateSituationPeriod(RelkonCodeSituation Situation);
/// <summary> /// Создает код операции перехода на другую ситуацию /// </summary> /// <param name="Process">Процесс, в котором осуществляется работа</param> /// <param name="Situation">Ситуация, на которую осуществляется переход</param> /// <param name="Delay">Задержка в мс перед переходом</param> protected abstract string GetJumpToSituationCode(RelkonCodeProcess Process, RelkonCodeSituation Situation, uint Delay);
/// <summary> /// Возвращает имя функции ситуации /// </summary> protected abstract string GetSituationName(RelkonCodeProcess Process, RelkonCodeSituation Situation);
protected override string GetSituationName(RelkonCodeProcess Process, RelkonCodeSituation Situation) { throw new NotImplementedException(); }
protected override bool ValidateSituationPeriod(RelkonCodeSituation Situation) { return(true); }