public override void PrzypiszReferencje(ISlownikSkryptu slownik) { if (Zmienna is ZmiennaNieistniejaca) { Zmienna = (Zmienna)slownik.PobierzWartosc(Zmienna.Nazwa); Zmienna.SprawdzCzyMoznaUstawiacWartoscWSkrypcie(); } if (Wyrazenie is ZmiennaNieistniejaca) { Wartosc w = slownik.PobierzWartosc(((ZmiennaNieistniejaca)Wyrazenie).Nazwa); if (w is Zmienna) { Wyrazenie = (Zmienna)w; } else { if (w is Stala) { Wyrazenie = (Stala)w; } else { Wyrazenie = w; } } } else { Wyrazenie.PrzypiszReferencje(slownik); } }
public override void Sygnal(Zmienna zmienna) { try { Akcje.Wykonaj(); } catch (EndExecutionException) { } }
public static ZmiennaArgument Copy(Zmienna zmienna) { return(new ZmiennaArgument() { Kierunek = zmienna.Kierunek, Nazwa = zmienna.Nazwa, Typ = zmienna.Typ, _Wartosc = zmienna._Wartosc }); }
public override void PrzypiszReferencje(ISlownikSkryptu slownik) { if (Zmienna is ZmiennaNieistniejaca) { object v = slownik.PobierzWartosc(Zmienna.Nazwa); if (!(v is Zmienna)) { throw new CheckingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.EventsAreAllowedOnlyForVariables), Zmienna.Nazwa)); } Zmienna = (Zmienna)v; Zmienna.Powiadomienie += new ZmianaWartosciZmiennejPowiadomienie(Sygnal); } if (Akcje != null) { Akcje.PrzypiszReferencje(slownik); } }
private static object SetSize(Argument[] argumenty) { if (argumenty[0].argument is Zmienna) { int size = (int)argumenty[1].Wykonaj(); if (size < 0) { throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.WrongArraySize), size)); } Zmienna z = (Zmienna)argumenty[0].argument; object array = z.Wykonaj(); switch (z.Typ) { case HomeSimCockpitSDK.VariableType.Bool_Array: bool [] t1 = (bool[])array; Array.Resize <bool>(ref t1, size); return(z.UstawWartosc(t1)); case HomeSimCockpitSDK.VariableType.Int_Array: int[] t2 = (int[])array; Array.Resize <int>(ref t2, size); return(z.UstawWartosc(t2)); case HomeSimCockpitSDK.VariableType.Double_Array: double[] t3 = (double[])array; Array.Resize <double>(ref t3, size); return(z.UstawWartosc(t3)); case HomeSimCockpitSDK.VariableType.String_Array: string[] t4 = (string[])array; Array.Resize <string>(ref t4, size); return(z.UstawWartosc(t4)); case HomeSimCockpitSDK.VariableType.Array: object[] t5 = (object[])array; Array.Resize <object>(ref t5, size); return(z.UstawWartosc(t5)); default: throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.WrongSetSizeFunctionArgumentType), argumenty[0])); } } throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ArgumentIsNotVariable), argumenty[0], "SetSize")); }
public override void Sygnal(Zmienna zmienna) { if (!_sygnaly[zmienna.Nazwa]) { _sygnaly[zmienna.Nazwa] = true; _sygnalow++; } if ((Minimum == -1 && _sygnalow == Zmienne.Length) || (Minimum > -1 && _sygnalow >= Minimum)) { foreach (Zmienna z in Zmienne) { _sygnaly[z.Nazwa] = false; } _sygnalow = 0; try { Akcje.Wykonaj(); } catch (EndExecutionException) { } } }
private static void DodajZmienna(HCPSTokenizer tokenizer, List <Zmienna> zmienne, Zmienna zmienna) { Zmienna z = zmienne.Find(delegate(Zmienna zz) { if (zmienna.Kierunek == KierunekZmiennej.None) { return(zz.Nazwa == zmienna.Nazwa); } else { return(zz.Modul == zmienna.Modul && zz.ID == zmienna.ID); } }); if (z != null && (z.Kierunek != zmienna.Kierunek || z.Typ != zmienna.Typ || (zmienna.Kierunek != KierunekZmiennej.None && zmienna.Modul != z.Modul) || z.Nazwa != zmienna.Nazwa)) { if (tokenizer == null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.VariableRedefinition), zmienna.ID, zmienna.Modul, zmienna.Nazwa)); } else { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.VariableRedefinition2), zmienna.ID, zmienna.Modul, zmienna.Nazwa, tokenizer.GetPosition(tokenizer.Position))); } } if (z == null) { zmienne.Add(zmienna); } else { if (z._funkcjaNazwa == null && zmienna._funkcjaNazwa != null) { z._funkcjaNazwa = zmienna._funkcjaNazwa; } } }
private static Skrypt[] ParsujHCPS(string nazwaPliku, IProgress progress, List <string> included, Dictionary <string, Skrypt[]> scripts, bool bindObjects) { string fileNameLower = nazwaPliku.ToLowerInvariant(); if (included.Contains(fileNameLower)) { if (scripts.ContainsKey(fileNameLower)) { return(scripts[fileNameLower]); } } else { included.Add(fileNameLower); } List <Skrypt> result = new List <Skrypt>(); string info = string.Format(UI.Language.Instance.GetString(UI.UIStrings.LoadingFile), nazwaPliku); progress.Progress(info, ""); // utworzenie tokenizera HCPSTokenizer tokenizer = new HCPSTokenizer(nazwaPliku); HCPSToken token = HCPSToken.Unknown; while ((token = tokenizer.Next()) != HCPSToken.EOF) { while (token == HCPSToken.Comment) { token = tokenizer.Next(); } if (token == HCPSToken.EOF) { break; } if (token == HCPSToken.Word && tokenizer.Value.ToLowerInvariant() == "script") { // chyba mamy skrypt token = tokenizer.Next(); if (token == HCPSToken.String) { // nazwa slryptu // sprawdzenie czy skrytp o takiej nazwie nie istnieje Skrypt skrypt = result.Find(delegate(Skrypt o) { return(o.Nazwa == tokenizer.Value); }); if (skrypt != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ScriptAlreadyExists), tokenizer.Value)); } skrypt = new Skrypt(); skrypt.Nazwa = tokenizer.Value; ZbiorWartosci2 slownik = null; progress.Progress(info, string.Format(UI.Language.Instance.GetString(UI.UIStrings.LoadingScript), skrypt.Nazwa)); token = tokenizer.Next(); if (token == HCPSToken.BlockBegin) { // rozpoczęcie bloku // odczytywanie po kolei co jest List <Zmienna> zmienne = new List <Zmienna>(); List <Stala> stale = new List <Stala>(); List <DefinicjaFunkcji> funkcje = new List <DefinicjaFunkcji>(); List <Zdarzenie> zdarzenia = new List <Zdarzenie>(); List <IncludeStatement> includes = new List <IncludeStatement>(); while ((token = tokenizer.Next()) != HCPSToken.BlockEnd) { if (token == HCPSToken.Word) { if (progress.Cancel) { throw new ParsingScriptException(UI.Language.Instance.GetString(UI.UIStrings.LoadingScriptsFileCanceledByUser)); } switch (tokenizer.Value.ToLowerInvariant()) { case "variable": // odczytanie zmiennej Zmienna zmienna = Zmienna.Parsuj(tokenizer); DodajZmienna(tokenizer, zmienne, zmienna); break; case "const": // odczytanie stałej Stala stala = Stala.Parsuj(tokenizer); DodajStala(tokenizer, stale, stala); break; case "initialize": // funkcja inicjalizująca if (skrypt.Initialize != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.SpecialEventRedefinition), tokenizer.GetPosition(tokenizer.Position), "initialize")); } if (tokenizer.Next() != HCPSToken.BlockBegin) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.IncorrectSpecialEventDefinition), tokenizer.GetPosition(tokenizer.Position), "initialize")); } skrypt.Initialize = Akcje.Parsuj(tokenizer); break; case "output_started": if (skrypt.OutputStarted != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.SpecialEventRedefinition), tokenizer.GetPosition(tokenizer.Position), "output_started")); } if (tokenizer.Next() != HCPSToken.BlockBegin) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.IncorrectSpecialEventDefinition), tokenizer.GetPosition(tokenizer.Position), "output_started")); } skrypt.OutputStarted = Akcje.Parsuj(tokenizer); break; case "output_stopped": if (skrypt.OutputStopped != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.SpecialEventRedefinition), tokenizer.GetPosition(tokenizer.Position), "output_stopped")); } if (tokenizer.Next() != HCPSToken.BlockBegin) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.IncorrectSpecialEventDefinition), tokenizer.GetPosition(tokenizer.Position), "output_stopped")); } skrypt.OutputStopped = Akcje.Parsuj(tokenizer); break; case "input_started": if (skrypt.InputStarted != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.SpecialEventRedefinition), tokenizer.GetPosition(tokenizer.Position), "input_started")); } if (tokenizer.Next() != HCPSToken.BlockBegin) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.IncorrectSpecialEventDefinition), tokenizer.GetPosition(tokenizer.Position), "input_started")); } skrypt.InputStarted = Akcje.Parsuj(tokenizer); break; case "input_stopped": if (skrypt.InputStopped != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.SpecialEventRedefinition), tokenizer.GetPosition(tokenizer.Position), "input_stopped")); } if (tokenizer.Next() != HCPSToken.BlockBegin) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.IncorrectSpecialEventDefinition), tokenizer.GetPosition(tokenizer.Position), "input_stopped")); } skrypt.InputStopped = Akcje.Parsuj(tokenizer); break; case "uninitialize": if (skrypt.Uninitialize != null) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.SpecialEventRedefinition), tokenizer.GetPosition(tokenizer.Position), "uninitialize")); } if (tokenizer.Next() != HCPSToken.BlockBegin) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.IncorrectSpecialEventDefinition), tokenizer.GetPosition(tokenizer.Position), "uninitialize")); } skrypt.Uninitialize = Akcje.Parsuj(tokenizer); break; case "variable_changed": // zdarzenie zmiany wartości zmiennej ZmianaZmiennej zmianaZmiennej = ZmianaZmiennej.Parsuj(tokenizer); DodajZdarzenieZmiennej(tokenizer, zdarzenia, zmianaZmiennej); break; case "variables_changed": // zdarzenie zmiany wielu zmiennych ZmianaZmiennych zmianaZmiennych = ZmianaZmiennych.Parsuj(tokenizer); DodajZdarzenieZmiennych(tokenizer, zdarzenia, zmianaZmiennych); break; case "function": // funkcja DefinicjaFunkcji funkcja = DefinicjaFunkcji.Parsuj(tokenizer); DodajFunkcje(tokenizer, funkcje, funkcja); break; case "include": IncludeStatement include = IncludeStatement.Parsuj(tokenizer); IncludeStatement includeF = includes.Find(delegate(IncludeStatement o) { return(o.FilePath.ToLowerInvariant() == include.FilePath.ToLowerInvariant() && o.ScriptName == include.ScriptName); }); if (includeF != null) { throw new Exception(); } includes.Add(include); break; default: throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.UnsuportedDefinitionType), tokenizer.Value, tokenizer.GetPosition(tokenizer.Position))); } } else { if (token != HCPSToken.Comment) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ScriptSyntaxError), tokenizer.GetPosition(tokenizer.Position))); } } } // TODO obsługa dyrektyw include if (includes.Count > 0) { foreach (IncludeStatement inc in includes) { string includeFileName = inc.FilePath.ToLowerInvariant(); if (included.Contains(includeFileName)) { continue; } if (includeFileName == fileNameLower) { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.CannotJoinScriptsFromOneFile))); } if (!Path.IsPathRooted(inc.FilePath)) { string dir = nazwaPliku.Substring(0, nazwaPliku.Length - Path.GetFileName(nazwaPliku).Length); inc.FilePath = Path.Combine(dir, inc.FilePath); } Skrypt[] skrypty = ParsujHCPS(inc.FilePath, progress, included, scripts, false); Skrypt skryptInc = Array.Find <Skrypt>(skrypty, delegate(Skrypt o) { return(o.Nazwa.ToLowerInvariant() == inc.ScriptName.ToLowerInvariant()); }); if (skryptInc != null) { skrypt.Initialize = PolaczAkcje(skrypt.Initialize, skryptInc.Initialize); skrypt.OutputStarted = PolaczAkcje(skrypt.OutputStarted, skryptInc.OutputStarted); skrypt.OutputStopped = PolaczAkcje(skrypt.OutputStopped, skryptInc.OutputStopped); skrypt.InputStarted = PolaczAkcje(skrypt.InputStarted, skryptInc.InputStarted); skrypt.InputStopped = PolaczAkcje(skrypt.InputStopped, skryptInc.InputStopped); for (int i = 0; i < skryptInc.Zmienne.Length; i++) { DodajZmienna(null, zmienne, skryptInc.Zmienne[i]); } for (int i = 0; i < skryptInc.Stale.Length; i++) { DodajStala(null, stale, skryptInc.Stale[i]); } for (int i = 0; i < skryptInc.Funkcje.Length; i++) { DodajFunkcje(null, funkcje, skryptInc.Funkcje[i]); } for (int i = 0; i < skryptInc.Zdarzenia.Length; i++) { DodajZdarzenie(null, zdarzenia, skryptInc.Zdarzenia[i]); } } else { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ScriptNotFoundInFile), inc.FilePath, inc.ScriptName)); } } } slownik = new ZbiorWartosci2(zmienne, stale, funkcje); skrypt.Zmienne = zmienne.ToArray(); skrypt.Stale = stale.ToArray(); skrypt.Funkcje = funkcje.ToArray(); skrypt.Zdarzenia = zdarzenia.ToArray(); } else { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ScriptSyntaxError), tokenizer.GetPosition(tokenizer.Position))); } // przepisanie referencji zmiennych, stałych i funkcji if (bindObjects) { skrypt.PrzypiszReferencje(slownik); } result.Add(skrypt); } else { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ScriptSyntaxError), tokenizer.GetPosition(tokenizer.Position))); } } else { throw new ParsingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.UnrecognizedString), tokenizer.Value, tokenizer.GetPosition(tokenizer.Position))); } } result.Sort(); return(result.ToArray()); }
public virtual void Sygnal(Zmienna zmienna) { }
private static object SetValue(Argument[] argumenty) { if (argumenty[0].argument is Zmienna) { Zmienna z = (Zmienna)argumenty[0].argument; object array = z.Wykonaj(); object value = argumenty[1].Wykonaj(); int indexFrom = (int)argumenty[2].Wykonaj(); //int indexTo = (int)argumenty[3].Wykonaj() + 1; int indexTo = indexFrom + (int)argumenty[3].Wykonaj(); if (array == null) { throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ArrayNotInitialized), argumenty[0], "SetValue")); } if (value == null) { throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.UnsetValueForArray), argumenty[0], indexFrom)); } try { if (array.GetType() == Utils.__boolArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <bool>((bool[])array, indexFrom, indexTo, (bool)value))); } if (array.GetType() == Utils.__intArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <int>((int[])array, indexFrom, indexTo, (int)value))); } if (array.GetType() == Utils.__doubleArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <double>((double[])array, indexFrom, indexTo, (double)value))); } if (array.GetType() == Utils.__stringArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <string>((string[])array, indexFrom, indexTo, (string)value))); } if (array.GetType() == Utils.__arrayType) { object[] t5 = (object[])array; if (value is bool) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <bool>(t5, indexFrom, indexTo, (bool)value))); } if (value is int) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <int>(t5, indexFrom, indexTo, (int)value))); } if (value is double) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <double>(t5, indexFrom, indexTo, (double)value))); } if (value is string) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <string>(t5, indexFrom, indexTo, (string)value))); } if (value.GetType() == Utils.__boolArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <bool>(t5, indexFrom, indexTo, (bool[])value))); } if (value.GetType() == Utils.__intArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <int>(t5, indexFrom, indexTo, (int[])value))); } if (value.GetType() == Utils.__doubleArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <double>(t5, indexFrom, indexTo, (double[])value))); } if (value.GetType() == Utils.__stringArrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <string>(t5, indexFrom, indexTo, (string[])value))); } if (value.GetType() == Utils.__arrayType) { return(z.UstawWartosc(SprawdzCzyRoznaUstawZwroc <object>(t5, indexFrom, indexTo, (object[])value))); } throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.UnsupportedValueTypeInArray), value.GetType(), argumenty[0], indexFrom)); } throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.UnsupportedArrayType), array.GetType(), argumenty[0])); } catch (IndexOutOfRangeException) { throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ArrayIndexOutOfBound), indexFrom, indexTo, argumenty[0])); } } throw new ExecutingScriptException(string.Format(UI.Language.Instance.GetString(UI.UIStrings.ArgumentIsNotVariable), argumenty[0], "SetValue")); }