Esempio n. 1
0
        /// <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+)"));
        }
Esempio n. 2
0
        /// <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());
        }
Esempio n. 3
0
 /// <summary>
 /// Поверяет период ситуации на валидность; в случае ошибки заносит сообщение в список ошибок
 /// и возвращает false, иначе возвращает true
 /// </summary>
 protected abstract bool ValidateSituationPeriod(RelkonCodeSituation Situation);
Esempio n. 4
0
 /// <summary>
 /// Создает код операции перехода на другую ситуацию
 /// </summary>
 /// <param name="Process">Процесс, в котором осуществляется работа</param>
 /// <param name="Situation">Ситуация, на которую осуществляется переход</param>
 /// <param name="Delay">Задержка в мс перед переходом</param>
 protected abstract string GetJumpToSituationCode(RelkonCodeProcess Process, RelkonCodeSituation Situation, uint Delay);
Esempio n. 5
0
 /// <summary>
 /// Возвращает имя функции ситуации
 /// </summary>
 protected abstract string GetSituationName(RelkonCodeProcess Process, RelkonCodeSituation Situation);
Esempio n. 6
0
 protected override string GetSituationName(RelkonCodeProcess Process, RelkonCodeSituation Situation)
 {
     throw new NotImplementedException();
 }
Esempio n. 7
0
 protected override bool ValidateSituationPeriod(RelkonCodeSituation Situation)
 {
     return(true);
 }