Beispiel #1
0
 /// <summary>
 /// Constructor, which creates a clone of a particular var.
 /// </summary>
 /// <param name="bParam">Var to clone.</param>
 public Base(Base bParam)
 {
     Clear();
     name = bParam.name;
     use = bParam.use;
     lg = bParam.lg;
     db = bParam.db;
     str = bParam.str;
 }
Beispiel #2
0
 /// <summary>
 /// Method, processing simple sequence - A <+,-,*,/> B
 /// </summary>
 /// <param name="sParam">Sequence</param>
 /// <param name="fFunc">Func class instance</param>
 /// <returns>Result of the sequence.</returns>
 private string processSimpleSeq(string sParam, Func fFunc)
 {
     if (sParam.IndexOf('+') > -1)
     {
         string[] sSeqParams = sParam.Split('+');
         Base a = new Base();
         a.SetUntyped(sSeqParams[0].Trim());
         Base b = new Base();
         b.SetUntyped(sSeqParams[1].Trim());
         Base c = a + b;
         return c.Get();
     }
     else
         if (sParam.IndexOf('-') > -1)
         {
             string[] sSeqParams = sParam.Split('-');
             Base a = new Base();
             a.SetUntyped(sSeqParams[0].Trim());
             Base b = new Base();
             b.SetUntyped(sSeqParams[1].Trim());
             Base c = a - b;
             return c.Get();
         }
         else
             if (sParam.IndexOf('*') > -1)
             {
                 string[] sSeqParams = sParam.Split('*');
                 Base a = new Base();
                 a.SetUntyped(sSeqParams[0].Trim());
                 Base b = new Base();
                 b.SetUntyped(sSeqParams[1].Trim());
                 Base c = a * b;
                 return c.Get();
             }
             else
                 if (sParam.IndexOf('/') > -1)
                 {
                     string[] sSeqParams = sParam.Split('/');
                     Base a = new Base();
                     a.SetUntyped(sSeqParams[0].Trim());
                     Base b = new Base();
                     b.SetUntyped(sSeqParams[1].Trim());
                     Base c = a / b;
                     return c.Get();
                 }
                 else return sParam;
 }
Beispiel #3
0
        /// <summary>
        /// This method executes one line of code.
        /// </summary>
        /// <param name="cmd">The name of command to execute.</param>
        /// <param name="param">Parameters for this command</param>
        /// <param name="fFunc">The instance of Func class, which is currently running.</param>
        /// <returns>String, which is the result of executing this cmd. </returns>
        public string execCmd(string cmd, string param, Func fFunc)
        {
            ///Here will be (switch), which will run functions for standart cmd signatures
            try
            {
                if (bStartBreaking) { return ""; }
                if ((cmd!="=")&&(cmd!="#in")) ///if we have cmd, that is not changing vars - then process them = change to thier values
                {
                    param=processVars(param,fFunc);
                }

                switch (cmd.ToLower())
                {
                    case "#outstream":
                        param = processVars(param, fFunc);
                        fFunc.sOutput = param.Trim();
                        return "";
                    case "#instream":
                        param = processVars(param, fFunc);
                        fFunc.sInput = param.Trim();
                        return "";
                    case "#temp": // this cmd is used only for testing some features, i.e. processing simple seq.
                        param = processSimpleSeq(param, fFunc);
                        frRun1.textBox2.Text += param;
                        frRun1.textBox2.Refresh();
                        return "";
                    case "#in":
                        string ret = "";
                        string varName = param.Split(' ')[0];
                        if (fFunc.sInput.ToLower() == "console")
                        {
                            ret = frRun1.gettext();
                        }
                        else
                        {
                            FileStream FS = new FileStream(fFunc.sInput, FileMode.OpenOrCreate);
                            StreamReader SR = new StreamReader(FS);
                            ret = SR.ReadToEnd();
                            SR.Close();
                            FS.Close();
                        }

                        if (varName.IndexOf('@') == 0) //local var
                        {
                            fFunc.setVar(new Base(varName, ret));
                        }
                        else
                            if (varName.IndexOf('&') == 0) //global var
                            {
                                fFunc.setGlVar(new Base(varName, ret));
                            }

                        return "";

                    case "=":
                        string var1Name = param.Split(' ')[0];
                        param = param.Substring(var1Name.Length + 1);
                        param = processVars(param, fFunc);
                        if (isCmd(param))
                        {
                            string[] sCmdPar = extractCmdParam(param);
                            param = sCmdPar[0] + execCmd(sCmdPar[1], sCmdPar[2], fFunc);
                        }

                        param = param.Trim();

                        if (param[0] == '(' && param[param.Length - 1] == ')')
                        {
                            param = processBlanks(param, fFunc);
                            param = processVars(param, fFunc);
                            param = processComplicatedSeq(param);
                        }
                        long lg;
                        double db;
                        Base b;
                        if (long.TryParse(param,out lg))
                            {
                                b = new Base(var1Name, lg);
                            }
                        else
                            if (double.TryParse(param, out db))
                            {
                                b = new Base(var1Name, db);
                            }
                            else
                            {
                                b = new Base(var1Name, param);
                            }

                            if (var1Name.IndexOf('@') == 0)
                        {
                            fFunc.setVar(b);
                        }
                        else
                            if (var1Name.IndexOf('&') == 0)
                            {
                                fFunc.setGlVar(b);
                            }

                        return "";

                    case "#function":
                        if (isCmd(param))
                        {
                            string[] sCmdPar = extractCmdParam(param);
                            param = sCmdPar[0] + execCmd(sCmdPar[1], sCmdPar[2],fFunc);
                        }
                        string funcPath = param.Split(' ')[0];
                        param = param.Substring(param.IndexOf(' ') + 1);
                        string fullPath="";

                        if (path.Trim() != "")
                        {
                            if (File.Exists(Path.GetDirectoryName(path) + "\\" + funcPath + ".ps"))
                            {
                                fullPath = Path.GetDirectoryName(path) + "\\" + funcPath + ".ps";
                            }
                        }
                        if (fullPath=="")
                            if (File.Exists(Path.GetDirectoryName(Application.ExecutablePath) + "\\" + funcPath + ".ps"))
                            {
                                fullPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\" + funcPath + ".ps";
                            }
                        if (fullPath!="")
                        {
                            FileStream FS = new FileStream(fullPath, FileMode.OpenOrCreate);

                            StreamReader SR = new StreamReader(FS);
                            string funcSource = SR.ReadToEnd();
                            SR.Close();
                            FS.Close();

                            Func fnAdditional = new Func(funcSource, param);
                            string sReturn = fnAdditional.Run(this);
                            return sReturn;
                        }
                        else
                            return "Error while launching function " + funcPath;
                    case "#random":///random a b
                        if (isCmd(param))
                        {
                            string[] sCmdPar = extractCmdParam(param);
                            param = sCmdPar[0] + execCmd(sCmdPar[1], sCmdPar[2], fFunc);
                        }
                        Random rnd = new Random(DateTime.Now.Millisecond);
                        string[] par = param.Split(' ');
                        string ans = rnd.Next(Int32.Parse(par[0]), Int32.Parse(par[1])).ToString();
                        param = param.Substring(par[0].Length + 1 + par[1].Length);
                        param.Trim();

                        return ans + param;

                    case "#out":
                        if (isCmd(param))
                        {
                            string[] sCmdPar = extractCmdParam(param);
                            param = sCmdPar[0] + execCmd(sCmdPar[1], sCmdPar[2],fFunc);
                        }
                        ///DELETE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        if (param[0] == '(' && param[param.Length - 1] == ')')
                        {
                            param = processBlanks(param, fFunc);
                            param = processVars(param, fFunc);
                            param = processComplicatedSeq(param);
                        }
                        param = param.Replace("\\n", "\r\n");
                        param = param.Replace("==", "=");
                        if (fFunc.sOutput.ToLower() == "console")
                        {
                            frRun1.textBox2.Text += param;
                            frRun1.textBox2.Refresh();
                        }
                        else
                        {
                            FileStream FS = new FileStream(fFunc.sOutput.Trim(), FileMode.OpenOrCreate);
                            StreamWriter SW = new StreamWriter(FS);
                            SW.Write(param);
                            SW.Close();
                            FS.Close();
                        }
                        return "";

                    case "#time":

                        if (isCmd(param))
                        {
                            string[] sCmdPar = extractCmdParam(param);
                            param = sCmdPar[0] + execCmd(sCmdPar[1], sCmdPar[2], fFunc);
                        }
                        return DateTime.Now.TimeOfDay + " " + param;

                    case "#sleep":
                        System.Threading.Thread.Sleep(Int32.Parse(param));
                        return "";

                    case "#clear": // this command use for clear program - window
                        frRun1.textBox2.Clear();
                        return "";

                    case "#return":
                        if (isCmd(param))
                        {
                            string[] sCmdPar = extractCmdParam(param);
                            param = sCmdPar[0] + execCmd(sCmdPar[1], sCmdPar[2], fFunc);
                        }
                        return param;

                    default:
                        return execCmd("#function", cmd.Remove(0,1) + " " + param, fFunc);
                    //  return "Err";
                }
            }
            catch
            {
                return "Parse_Error! Unknown command!";
            }
        }
Beispiel #4
0
 /// <summary>
 /// This method sets all brackets needed in this seq.
 /// </summary>
 /// <param name="sParam">Unparsed seq.</param>
 /// <returns>Seq. with brackets.</returns>
 private string CountExpression(string sParam)
 {
     ///Here will be your code
     int i1, i2;
     bool flag = true;
     List<string> sParams = new List<string>(); // Use List , not string[], because we need to delete some elements and insert some new
     for (i1 = 0 , i2 = 0; i2 < sParam.Length; i2++)
     {
         if (sParam[i2] == '*' || sParam[i2] == '/' || sParam[i2] == '+' || sParam[i2] == '-')
         {
             sParams.Add(sParam.Substring(i1,i2-i1));
             i1 = i2 + 1;
             sParams.Add(sParam[i2].ToString());
         }
     }
     sParams.Add(sParam.Substring(i1));
     Base a = new Base();
     Base b = new Base();
     Base c;
     while (flag)
     {
         flag = false;
         for (int i = 0; i < sParams.Count; i++)
         {
             if (sParams[i] == "*" || sParams[i] == "/") // In First we find all operations * ans / and count them
             {
                 a.SetUntyped(sParams[i - 1]);
                 b.SetUntyped(sParams[i + 1]);
                 switch (sParams[i])
                 {
                     case "*":
                         c = a * b;
                         break;
                     case "/":
                         c = a / b;
                         break;
                     default:
                         c = new Base();
                         break;
                 }
                 sParams.RemoveAt(i - 1);
                 sParams.RemoveAt(i);
                 sParams[i - 1] = c.Get();
                 flag = true;
                 break;
             }
         }
     }
     while (sParams.Count != 1)
     {
         for (int i = 0; i < sParams.Count; i++) // After we work with + and -
         {
             if (sParams[i] == "+" || sParams[i] == "-")
             {
                 a.SetUntyped(sParams[i - 1]);
                 b.SetUntyped(sParams[i + 1]);
                 switch (sParams[i])
                 {
                     case "+":
                         c = a + b;
                         break;
                     case "-":
                         c = a - b;
                         break;
                     default:
                         c = new Base();
                         break;
                 }
                 sParams.RemoveAt(i - 1);
                 sParams.RemoveAt(i);
                 sParams[i - 1] = c.Get();
                 break;
             }
         }
     }
     return sParams[0];
 }
Beispiel #5
0
        /// <summary>
        /// This method process some logical sequence and returns result - is it true or false.
        /// </summary>
        /// <param name="sParam">Some sequence</param>
        /// <param name="fFunc">Func class instance</param>
        /// <returns>Is this seq. true or false.</returns>
        public bool processLogicalSeq(string sParam, Func fFunc)
        {
            bool answer = false;

            string[] logicalMarks = new string[6] { "<=", ">=", "==", "!=", "<", ">"};
            string[] sParams = sParam.Split(logicalMarks, StringSplitOptions.None);
            if (sParams.Length != 1)
            {
                string usedLogic = sParam.Substring(sParams[0].Length, sParam.Length - sParams[0].Length - sParams[1].Length).Trim();
                sParams[0] = processComplicatedSeq(processVars(sParams[0].Trim(), fFunc));
                sParams[1] = processComplicatedSeq(processVars(sParams[1].Trim(), fFunc));
                if (!bStartBreaking)
                {
                    Base a = new Base();
                    a.SetUntyped(sParams[0]);
                    Base b = new Base();
                    b.SetUntyped(sParams[1]);

                    switch (usedLogic)
                    {
                        case "<":
                            answer = (a < b);
                            break;
                        case ">":
                            answer = (a > b);
                            break;
                        case "<=":
                            answer = (a <= b);
                            break;
                        case ">=":
                            answer = (a >= b);
                            break;
                        case "!=":
                            answer = (a != b);
                            break;
                        case "==":
                            answer = (a == b);
                            break;
                    }
                }
                else
                    switch (sParams[0][0])
                    {
                        case '@':
                            try
                            {
                                answer = Convert.ToBoolean(fFunc.getVar(sParams[0].Trim()));
                            }
                            catch
                            {
                                answer = false;
                            }
                            break;
                        case '&':
                            try
                            {
                                answer = Convert.ToBoolean(fFunc.getGlVar(sParams[0].Trim()));
                            }
                            catch
                            {
                                answer = false;
                            }
                            break;
                        default:
                            break;
                    }
            }
            return answer;
        }
Beispiel #6
0
 /// <summary>
 /// Makes a copy of param var and adds it to the List. 
 /// </summary>
 /// <param name="param">Base-type variable.</param>
 private void addVar(Base param)
 {
     if (varExists(param.name) == -1)
     {
         vrb.Add(new Base(param));
     }
 }
Beispiel #7
0
 /// <summary>
 /// Sets the value of param to var from the list, which name is equal to param's name.
 /// If such var in list doesn't exists - it is added. 
 /// </summary>
 /// <param name="param">Base-type variable</param>
 public void setVar(Base param)
 {
     int nNum = varExists(param.name);
     if (nNum == -1) { addVar(param); }
     else vrb[nNum].Set(param);
 }
Beispiel #8
0
 /// <summary>
 /// Makes a copy of param global var and adds it to the List. 
 /// </summary>
 /// <param name="param">Base-type variable.</param>
 private void addGlVar(Base param)
 {
     if (varGlExists(param.name) == -1)
     {
         globalVrb.Add(new Base(param));
     }
 }
Beispiel #9
0
 /// <summary>
 /// Sets the value of param to global var from the list, which name is equal to param's name.
 /// If such var in list doesn't exists - it is added. 
 /// </summary>
 /// <param name="param">Base-type variable</param>
 public void setGlVar(Base param)
 {
     int nNum = varGlExists(param.name);
     if (nNum == -1) { addGlVar(param); }
     else globalVrb[nNum].Set(param);
 }
Beispiel #10
0
 /// <summary>
 /// Sets a value to the var by copying it form another var.
 /// </summary>
 /// <param name="bParam">Base var to get value from.</param>
 public void Set(Base bParam)
 {
     str = bParam.str;
     lg = bParam.lg;
     db = bParam.db;
     use = bParam.use;
 }
Beispiel #11
0
 public static Base operator /(Base a, Base b)
 {
     Base c = new Base();
     if (a.use == b.use)
     {
         if (a.use == "Long")
             c.lg = a.lg + b.lg;
         if (a.use == "Double")
             c.db = a.db + b.db;
         //a.str /= b.str;
         c.use = a.use;
     }
     return c;
 }
Beispiel #12
0
 public static Base operator -(Base a, Base b)
 {
     Base c = new Base();
     if (a.use == b.use)
     {
         c.lg = a.lg - b.lg;
         c.db = a.db - b.db;
         c.use = a.use;
         /*while (a.str.IndexOf(b.str) != -1)
         {
             a.str.Remove(a.str.IndexOf(b.str), a.str.IndexOf(b.str) + b.str.Length);
         }*/
     }
     return c;
 }
Beispiel #13
0
 public static Base operator +(Base a, Base b)
 {
     Base c = new Base();
     if (a.use == b.use)
     {
        c.lg = a.lg + b.lg;
        c.db = a.db + b.db;
        c.str= a.str + b.str;
        c.use = a.use;
     }
     return c;
 }