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); }
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); }
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())); }
public ExpressionFactory() { TokenList = new List <Token>(); symbolList = new SymbolList(); }
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(); }