コード例 #1
0
        private static List <string> ParseFuncArgs(CalcEnvironment env)
        {
            List <string> args = new List <string>();
            int           brc  = 0;
            string        arg  = "";
            char          c;

            while (env.Length != 0)
            {
                env.NextChar();
                c = env.Char;
                if (c == ')')
                {
                    --brc;
                    if (brc == -1)
                    {
                        env.NextChar();
                        break;
                    }
                }
                else if (c == '(')
                {
                    ++brc;
                }
                else if (c == ',')
                {
                    if (arg != "")
                    {
                        args.Add(arg);
                        arg = "";
                    }
                    else
                    {
                        throw new ParseException(env.i, "Empty argument");
                    }
                }
                if (c != ',')
                {
                    arg += c;
                }
            }
            if (brc != -1)
            {
                throw new ParseException(env.i, env.Char, "Missing function closing bracket");
            }
            if (arg != "")
            {
                args.Add(arg);
            }
            else if (args.Count > 0)
            {
                throw new ParseException(env.i, "Empty argument");
            }
            return(args);
        }
コード例 #2
0
        private static void ParseConstOrFunc(CalcEnvironment env, int sign)
        {
            bool          isFunc = false;
            List <string> args   = null;
            string        str    = "";
            char          c;

            do
            {
                c = env.Char;
                if (char.IsLetter(c) || c == '_')
                {
                    str += c;
                }
                else if (c == '(')
                {
                    isFunc = true;
                    args   = ParseFuncArgs(env);
                    break;
                }
                else
                {
                    break;
                }
                env.NextChar();
            } while (env.Length != 0);
            if (isFunc)
            {
                env.nodes.AddLast(new FuncNode(str, args.ToArray(), sign));
            }
            else
            {
                env.nodes.AddLast(new ConstNode(str, sign));
            }
        }
コード例 #3
0
        private static void ParseOpenBrackets(CalcEnvironment env, ref bool firstValue)
        {
            char c;

            wasOpenBrc = false;
            sign       = 1;
            do
            {
                c = env.Char;
                if (c == '(')
                {
                    wasOpenBrc = true;
                    ++env.brc;
                }
                else if (c == '-')
                {
                    if (wasOpenBrc || firstValue)
                    {
                        sign      *= -1;
                        wasOpenBrc = false;
                        firstValue = false;
                    }
                    else
                    {
                        throw new ParseException(env.i, "Bad minus");
                    }
                }
                else
                {
                    break;
                }
                env.NextChar();
            } while (env.Length != 0);
        }
コード例 #4
0
        private static void ParseOperation(CalcEnvironment env)
        {
            LinkedListNode <Node> op;

            if ("^%*/+-".Contains(env.Char))
            {
                op = env.nodes.AddLast(new OperationNode(env.Char, env.brc));
                env.AddOpInQueue(op);
            }
            else
            {
                throw new ParseException(env.i, env.Char, "Operation expected");
            }
            env.NextChar();
        }
コード例 #5
0
        private static void ParseCloseBrackets(CalcEnvironment env)
        {
            char c;

            while (env.Length != 0)
            {
                c = env.Char;
                if (c == ')')
                {
                    --env.brc;
                    env.NextChar();
                }
                else
                {
                    break;
                }
            }
        }
コード例 #6
0
        private static void ParseNumber(CalcEnvironment env, int sign)
        {
            var    wasDigit = false;
            var    wasDot   = false;
            string str      = "";
            double numb     = 0.0;
            char   c;

            do
            {
                c = env.Char;
                if (c == '.')
                {
                    if (wasDigit && !wasDot)
                    {
                        str   += '.';
                        wasDot = true;
                    }
                    else
                    {
                        throw new ParseException(env.i, "Bad dot");
                    }
                }
                else if (char.IsDigit(c))
                {
                    str     += c;
                    wasDigit = true;
                }
                else
                {
                    break;
                }
                env.NextChar();
            } while (env.Length != 0);

            if (!double.TryParse(str, numberStyles, provider, out numb))
            {
                throw new ParseException(env.i, $"Bad number '{str}'");
            }
            env.nodes.AddLast(new NumberNode(numb * sign));
        }