public void UpdateValueInInfixNotation(TreeFunctional tree) { this.RemoveReverseNotations(); foreach (var token in this.infixNotation) { if (token.type == TokenType.VARIABLE) { var tokenVar = (token as TokenVariable); tokenVar.data = tree.GetVar(tokenVar.name).data; } } }
public Token GetNextToken(ref int pos, TreeFunctional tree) { char tmp = text[pos]; while (this.text[pos] == ' ' || this.text[pos] == '\n' || this.text[pos] == '\t') { ++pos; } if (char.IsLetter(this.text[pos])) // is var { int start = pos; while (char.IsLetter(this.text[++pos]) || this.text[pos] == '_') { ; } string nameVar = this.text.Substring(start, pos - start); if (BuiltInFunction.IsBuiltIn(nameVar)) { --pos; while (this.text[++pos] != '(') { ; } return(new TokenFunction(nameVar, start, pos)); } switch (nameVar) { case "if": return(new TokenIfElse(pos, EndBracket(pos, "if"), TokenType.IF)); case "else": return(new TokenIfElse(pos, EndBracket(pos, "else"), TokenType.ELSE)); case "for": start = pos; while (this.text[++start] != '{') { ; } return(new TokenFor(start, EndBracket(start, "for"), TokenType.FOR)); case "AND": return(new Token() { type = TokenType.AND }); case "OR": return(new Token() { type = TokenType.OR }); case "MORE": return(new Token() { type = TokenType.MORE }); case "LESS": return(new Token() { type = TokenType.LESS }); case "EQ": return(new Token() { type = TokenType.EQUAL }); case "NEQ": return(new Token() { type = TokenType.NOT_EQUAL }); case "return": return(new Token() { type = TokenType.RETURN }); } int checkBarcket = pos - 1; while (this.text[++checkBarcket] == ' ') { ; } if (this.text[checkBarcket] == '(') { start = FindFunction(nameVar); return(new TokenFunction(nameVar, start, EndBracket(start, nameVar))); } if (tree == null) { TokenVariable var = new TokenVariable(nameVar); return(var); } else { if (tree.VariableExist(nameVar)) { return(tree.GetVar(nameVar)); } else { TokenVariable var = new TokenVariable(nameVar); tree.PutVariableinStack(var); return(var); } } } if (text[pos] == '=') { ++pos; return(new Token() { type = TokenType.ASSIGN }); } if (text[pos] == '+') { ++pos; return(new Token() { type = TokenType.PLUS }); } if (text[pos] == '-') { ++pos; return(new Token() { type = TokenType.MINUS }); } if (text[pos] == '*') { ++pos; return(new Token() { type = TokenType.MULTIPLICATION }); } if (text[pos] == '/') { ++pos; return(new Token() { type = TokenType.PLUS }); } if (text[pos] == '(') { ++pos; return(new Token() { type = TokenType.ARITHMETIC_BRACKET_OPEN }); } if (text[pos] == ')') { ++pos; return(new Token() { type = TokenType.ARITHMETIC_BRACKET_CLOSE }); } if (text[pos] == ',') { ++pos; return(new Token() { type = TokenType.COMA }); } if (text[pos] == '\"') { int start = pos; char c; while ((c = text[++pos]) != '\"') { if (c == '\n') { throw new Exception("Not close string in line: " + pos.ToString()); } } string str = this.text.Substring(start + 1, pos - start - 1); ++pos; return(new TokenVariable(null) { type = TokenType.VARIABLE, varType = VariableType.STRING, data = str }); } if (char.IsDigit(this.text[pos])) // is Const { int start = pos; while (char.IsDigit(this.text[++pos])) { ; } string str = this.text.Substring(start, pos - start); double value = Convert.ToDouble(str); return(new TokenConst() { type = TokenType.NUMERIC_CONST, data = value }); } if (this.text[pos] == ';') { ++pos; return(new Token() { type = TokenType.END_OP }); } return(null); }