Beispiel #1
0
        public static string DF(Symbol sym, bool SkipPoly = false)
        {
            SymbolList symList = new SymbolList(sym.Tokens);

            if (!SkipPoly && symList.Count > 1) // Do polynomials
            {
                return(Poly(symList));
            }
            MethodInfo mi = (MethodInfo)htTestFuncs[sym.HashTokenString];

            if (mi != null)
            {
                return((string)mi.Invoke(null, new object[] { sym }));
            }

            return(sym.NakedTokenString);
        }
Beispiel #2
0
        public static string Add(Symbol sym, bool SkipPoly = false)
        {
            SymbolList symList = new SymbolList(sym.Tokens);

            if (!SkipPoly && symList.Count > 1) // Do polynomials
            {
                //return Poly(symList);     //TODO:Work in progress, maybe?  GPG
            }
            MethodInfo mi = (MethodInfo)htTestFuncs[sym.HashTokenString];

            if (mi != null)
            {
                return((string)mi.Invoke(null, new object[] { sym }));
            }

            return(sym.NakedTokenString);
        }
Beispiel #3
0
        private static string Poly(SymbolList symAgg)
        {
            StringBuilder sb = new StringBuilder();

            foreach (Symbol sym in symAgg)
            {
                sb.Append(DF(sym));
            }

            // Check for literal plus literal and literal minus literal
            Symbol symCheck = new Symbol(sb.ToString());

            if (symCheck.HashTokenString == "LiteralOperator_Plus_Literal" ||
                symCheck.HashTokenString == "LiteralOperator_Minus_Literal")
            {
                sb.Clear();
                sb.Append(DF(symCheck, true));
            }
            return(CleanUpEnds(sb.ToString()));
        }
Beispiel #4
0
 public ExpressionFactory()
 {
     TokenList  = new List <Token>();
     symbolList = new SymbolList();
 }
Beispiel #5
0
        public void ParseExpression(string FunctionString)
        {
            int element = 0;

            TokenList.Clear();

            Symbol sym = new Symbol();

            bool InBracket    = false;
            bool InUnderScore = false;

            while (element < FunctionString.Length)
            {
                char ch = FunctionString[element];
                if (ch == '-' && FunctionString[element + 1] != ' ') // Negative number. Parser needs space for +-*/
                {
                    numberBuffer.Add("-1");
                }
                else if (isDigit(ch))
                {
                    if (InUnderScore) // Subscript variables such as x_1
                    {
                        InUnderScore = false;
                        letterBuffer.Clear(); // Contained in variable buffer. subscript
                        variableBuffer.Add(ch.ToString());
                        Token t = new Token("Variable", string.Join("", variableBuffer.ToArray()));
                        t.SymbolEnd = false;
                        TokenList.Add(t);
                        variableBuffer.Clear();
                    }
                    else
                    {
                        numberBuffer.Add(ch.ToString());
                    }
                }
                else if (ch == '.')
                {
                    numberBuffer.Add(ch.ToString());
                }
                else if (ch == '_')
                {
                    InUnderScore = true;
                    variableBuffer.Add(ch.ToString());
                }
                else if (isLetter(ch))
                {
                    if (numberBuffer.Count > 0)
                    {
                        emptyNumberBufferAsLiteral();
                        TokenList.Add(new Token("Operator", "*"));
                    }

                    if (Variables.Exists(v => v == ch.ToString()))
                    {
                        letterBuffer.Clear(); // Contained in variable buffer. subscript
                        variableBuffer.Add(ch.ToString());
                        Token t = new Token("Variable", string.Join("", variableBuffer.ToArray()));
                        t.SymbolEnd = false;
                        TokenList.Add(t);
                        if (element != FunctionString.Length - 1 && !InBracket)
                        {
                            TokenList.Add(new Token("Operator", "*"));
                        }
                        variableBuffer.Clear();
                    }
                    else
                    {
                        letterBuffer.Add(ch.ToString());
                        variableBuffer.Add(ch.ToString());
                    }
                }
                else if (ch == '^') // Number's coming
                {
                    TokenList.Add(new Token("Operator", ch.ToString()));
                }
                else if (ch == '/')
                {
                    emptyNumberBufferAsLiteral();
                    TokenList.Add(new Token("Operator", ch.ToString()));
                }
                else if (ch == ' ') // Space denotes polynomial, everything before is complete
                {
                    //TokenList[TokenList.Count - 1].SymbolEnd = true;
                    // Is this else if block necessary? GPG
                }
                else if (ch == '+')
                {
                    emptyNumberBufferAsLiteral();
                    TokenList[TokenList.Count - 1].SymbolEnd = (InBracket) ? false : true;
                    TokenList.Add(new Token("Operator", " " + ch.ToString() + " "));
                }
                else if (ch == '-' && FunctionString[element + 1] == ' ')
                {
                    emptyNumberBufferAsLiteral();
                    TokenList[TokenList.Count - 1].SymbolEnd = true;
                    TokenList.Add(new Token("Operator", " " + ch.ToString() + " "));
                }
                else if (isLeftParenthesis(ch))
                {
                    InBracket = true;
                    if (letterBuffer.Count > 0)
                    {
                        TokenList.Add(new Token("Function", string.Join("", letterBuffer.ToArray())));
                        letterBuffer.Clear();
                        variableBuffer.Clear();
                    }
                    else if (numberBuffer.Count > 0)
                    {
                        emptyNumberBufferAsLiteral();
                        TokenList.Add(new Token("Operator", "*"));
                    }
                    TokenList.Add(new Token("Left Parenthesis", ch.ToString()));
                }
                else if (isRightParenthesis(ch))
                {
                    InBracket = false;
                    emptyNumberBufferAsLiteral();
                    TokenList.Add(new Token("Right Parenthesis", ch.ToString()));
                }

                element++;
            }

            emptyNumberBufferAsLiteral();
            TokenList[TokenList.Count - 1].SymbolEnd = true;

            this.symbolList = new SymbolList(TokenList);
        }
        public void ParseExpression(string FunctionString)
        {
            int charcounter = 0;

            TokenList.Clear();

            Symbol sym = new Symbol();

            bool      InBracket = false;
            Tokenizer tokes     = new Tokenizer();

            while (charcounter < FunctionString.Length)
            {
                char ch = FunctionString[charcounter];
                if (ch == '-' && FunctionString[charcounter + 1] != ' ') //negative number. Parser needs space for +-*/
                {
                    numberBuffer.Add(ch.ToString());
                }
                else if (tokes.isDigit(ch))
                {
                    numberBuffer.Add(ch.ToString());
                }
                else if (ch == '.')
                {
                    numberBuffer.Add(ch.ToString());
                }
                else if (tokes.isLetter(ch))
                {
                    if (numberBuffer.Count > 0)
                    {
                        emptyNumberBufferAsLiteral();
                        TokenList.Add(new Token("Operator", "*"));
                    }
                    if (Variables.Exists(v => v == ch.ToString()))
                    {
                        letterBuffer.Add(ch.ToString());
                        emptyLetterBufferAsVariables();
                        if (charcounter - 1 > 0)
                        {
                            char ch2 = FunctionString[charcounter - 1];
                            if (ch2 == ' ' && !InBracket)//(ch != '^')
                            {
                                TokenList[TokenList.Count - 1].SymbolEnd = true;
                            }
                        }
                    }
                    else
                    {
                        letterBuffer.Add(ch.ToString());
                    }
                }
                else if (tokes.isOperator(ch))
                {
                    emptyNumberBufferAsLiteral();
                    emptyLetterBufferAsVariables();
                    char ch2 = FunctionString[charcounter - 1];
                    if (ch2 == ' ' && !InBracket)//(ch != '^')
                    {
                        if (TokenList.Count - 1 >= 0)
                        {
                            TokenList[TokenList.Count - 1].SymbolEnd = true;
                        }
                    }
                    if (ch == '^')
                    {
                        TokenList.Add(new Token("Operator", ch.ToString()));
                    }
                    else
                    {
                        TokenList.Add(new Token("Operator", " " + ch.ToString() + " "));
                    }
                }
                else if (tokes.isLeftParenthesis(ch))
                {
                    InBracket = true;
                    if (letterBuffer.Count > 0)
                    {
                        TokenList.Add(new Token("Function", string.Join("", letterBuffer.ToArray())));
                        letterBuffer.Clear();
                    }
                    else if (numberBuffer.Count > 0)
                    {
                        emptyNumberBufferAsLiteral();
                        TokenList.Add(new Token("Operator", "*"));
                    }
                    TokenList.Add(new Token("Left Parenthesis", ch.ToString()));
                }
                else if (tokes.isRightParenthesis(ch))
                {
                    InBracket = false;
                    emptyLetterBufferAsVariables();
                    emptyNumberBufferAsLiteral();
                    TokenList.Add(new Token("Right Parenthesis", ch.ToString()));
                }
                else if (tokes.isComma(ch))
                {
                    emptyNumberBufferAsLiteral();
                    emptyLetterBufferAsVariables();
                    TokenList.Add(new Token("Function Argument Separator", ch.ToString()));
                }


                charcounter++;
            }

            emptyNumberBufferAsLiteral(true);
            emptyLetterBufferAsVariables(true);

            symbolList = new SymbolList(this.TokenList);
        }
 public TokenFactory() //default constructor
 {
     coordinates = new Coordinates(CoordinateSystem.x, 1, "x");
     TokenList   = new List <Token>();
     symbolList  = new SymbolList();
 }