Beispiel #1
0
 private void EatBlanks(EOFCharEnumerator fen)
 {
     while (char.IsWhiteSpace(fen.Current) && fen.MoveNext())
     {
         ;
     }
 }
Beispiel #2
0
        public DynaFunction(string fdef)
        {
            Variables = new List <VarDef> ();
            var fen = new EOFCharEnumerator(fdef);

            FunctionName = UntilSeparator(fen, "(", "function");
            EatBlanks(fen);
            if (fen.PeekNext() == ')') // NO ARGUMENTS FUNCTION
            {
                fen.MoveNext();
            }
            else
            {
                while (fen.Current != ')')
                {
                    var tmpVarName = UntilSeparator(fen, ":", "variable name");
                    if (!ExConst.ValidVarName(tmpVarName))
                    {
                        throw new ExpressionException("Invalid name for variable " + tmpVarName);
                    }
                    var tmpType = UntilSeparator(fen, ",)", "variable type");
                    if (Enum.TryParse(tmpType.ToUpperInvariant(), out DFDataType tmpDFDataType))
                    {
                        Variables.Add(new VarDef(tmpVarName, tmpDFDataType));
                    }
                    else
                    {
                        throw new ExpressionException("Invalid data type for variable " + tmpVarName + ": " + tmpType);
                    }
                }
            }
            EatUntil(fen, ':');
            var tmprettype = UntilSeparator(fen, "=", "return type");

            if (!Enum.TryParse(tmprettype.ToUpperInvariant(), out DFDataType rettype))
            {
                throw new ExpressionException("Invalid return type: " + tmprettype);
            }
            ReturnType = rettype;
            fen.MoveNext();
            if (fen.Current != '>')
            {
                throw new ExpressionException("Unexpected character: " + fen.Current);
            }

            var exp = new StringBuilder();

            while (fen.MoveNext())
            {
                exp.Append(fen.Current);
            }
            StringExpression = exp.ToString().Trim();
            if (string.IsNullOrEmpty(StringExpression))
            {
                throw new ExpressionException("Empty expression");
            }
            new Expression().Parse(StringExpression);
        }
Beispiel #3
0
 private void EatUntil(EOFCharEnumerator fen, char sep)
 {
     while (fen.MoveNext() && fen.Current != sep)
     {
         if (!char.IsWhiteSpace(fen.Current))
         {
             throw new ExpressionException("Unexpected char: " + fen.Current);
         }
     }
 }
Beispiel #4
0
        private string UntilSeparator(EOFCharEnumerator f, string sep, string what)
        {
            StringBuilder name = new StringBuilder();

            while (f.MoveNext() && sep.IndexOf(f.Current) < 0)
            {
                name.Append(f.Current);
            }
            string ret = name.ToString().Trim();

            if (string.IsNullOrEmpty(ret))
            {
                throw new ExpressionException("Invalid syntax: empty " + what + " name");
            }
            foreach (char c in ret)
            {
                if (char.IsWhiteSpace(c))
                {
                    throw new ExpressionException("Invalid function syntax: unexpected whitespace in " + what + " name");
                }
            }
            return(ret);
        }