示例#1
0
 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);
     }
 }
示例#2
0
 public override void Sygnal(Zmienna zmienna)
 {
     try
     {
         Akcje.Wykonaj();
     }
     catch (EndExecutionException)
     {
     }
 }
示例#3
0
 public static ZmiennaArgument Copy(Zmienna zmienna)
 {
     return(new ZmiennaArgument()
     {
         Kierunek = zmienna.Kierunek,
         Nazwa = zmienna.Nazwa,
         Typ = zmienna.Typ,
         _Wartosc = zmienna._Wartosc
     });
 }
示例#4
0
 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);
     }
 }
示例#5
0
        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"));
        }
示例#6
0
 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)
         {
         }
     }
 }
示例#7
0
        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;
                }
            }
        }
示例#8
0
        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());
        }
示例#9
0
 public virtual void Sygnal(Zmienna zmienna)
 {
 }
示例#10
0
 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"));
 }