private void UpdateVar() { if (IsVarable) { try { var vars = TWS.Vars.Where(v => v.VarName.ToLower() == VarName.ToLower()); if (vars.Count() > 0) { vars.Single().Update(Value); } else { TWS.Vars.Add(new Param(VarName, Value)); } } catch { } } }
/// <summary> /// Find next Token in Program /// </summary> /// <returns>Found Token Type</returns> private Token FindNextToken(ref ArrayList ProgramToTokenize) { /* Workings of method * 1. Search for End of Program * 2. Search for Numbers * 3. Search for Special characters * 4. Search for Quoted Strings * 5. Search for Keywords * 6. Search for Known variables * 7. Search for New variables */ /////////////////////////////////////////////////////////////////////////// // // Search for End of Program // /////////////////////////////////////////////////////////////////////////// // Check for End of program if ((SourceCode[SourceCodePosition] == (char)0) || (SourceCodePosition > SourceCode.Length)) { return(new EndOfInputToken(this, "")); } /////////////////////////////////////////////////////////////////////////// // // Search for Numbers // /////////////////////////////////////////////////////////////////////////// // Token is a Number if (CHECK_FOR_NUMBER.IndexOf(SourceCode[SourceCodePosition]) != -1) { // Retrieve number for (int i = 0; i < (MAX_NUM_LENGTH + 1); ++i) { // Check if next char is numeric if (CHECK_FOR_NUMBER.IndexOf(SourceCode[SourceCodePosition + i]) == -1) { // Check number length if (i > 0) { // Incease Program Search Position SourceCodeNextPosition = SourceCodePosition + i; // If we expect a Line number return LineNumberToken else return NumberToken if (ExpectLineNumber) { ExpectLineNumber = false; return(new LineNumberToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } else { ExpectLineNumber = false; return(new NumericToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } } else { throw new BasicParserException(BasicParserException.UNKNOWN_ERROR); } } } throw new BasicParserException(BasicParserException.NUMBER_TO_LONG); } // Reset ExectLineNumber ExpectLineNumber = false; /////////////////////////////////////////////////////////////////////////// // // Search for Special characters // /////////////////////////////////////////////////////////////////////////// // Check for Single character tokens switch (SourceCode[SourceCodePosition]) { // NewLine Character case '\n': // Increase Program Search Position SourceCodeNextPosition = SourceCodePosition + 1; // After new line expect line number ExpectLineNumber = true; // A Single Text Token on a Line is a LabelToken if (ProgramToTokenize.Count >= 2) { if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(TextToken)) && ProgramToTokenize[ProgramToTokenize.Count - 2].GetType().Equals(typeof(EndOfLineToken))) { ProgramToTokenize[ProgramToTokenize.Count - 1] = new LabelToken(this, ((TextToken)ProgramToTokenize[ProgramToTokenize.Count - 1]).Content); } } else if (ProgramToTokenize.Count == 1) { if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(TextToken))) { ProgramToTokenize[ProgramToTokenize.Count - 1] = new LabelToken(this, ((TextToken)ProgramToTokenize[ProgramToTokenize.Count - 1]).Content); } } // Return EndOfLine Token return(new EndOfLineToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // NewLine within CodeLine case ':': // Increase Program Search Position SourceCodeNextPosition = SourceCodePosition + 1; // After new line expect line number ExpectLineNumber = true; // A Single Text Token on a Line is a LabelToken if (ProgramToTokenize.Count >= 2) { if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(TextToken)) && ProgramToTokenize[ProgramToTokenize.Count - 2].GetType().Equals(typeof(EndOfLineToken))) { ProgramToTokenize[ProgramToTokenize.Count - 1] = new LabelToken(this, ((TextToken)ProgramToTokenize[ProgramToTokenize.Count - 1]).Content); } } else if (ProgramToTokenize.Count == 1) { if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(TextToken))) { ProgramToTokenize[ProgramToTokenize.Count - 1] = new LabelToken(this, ((TextToken)ProgramToTokenize[ProgramToTokenize.Count - 1]).Content); } } // Return EndOfLine Token return(new EndOfLineToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Comma case ',': SourceCodeNextPosition = SourceCodePosition + 1; return(new CommaToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Semicolon case ';': SourceCodeNextPosition = SourceCodePosition + 1; return(new SemicolonToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Plus case '+': SourceCodeNextPosition = SourceCodePosition + 1; return(new PlusToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Minus case '-': SourceCodeNextPosition = SourceCodePosition + 1; return(new MinusToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Logical And case '&': SourceCodeNextPosition = SourceCodePosition + 1; return(new AndToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Logical Or case '|': SourceCodeNextPosition = SourceCodePosition + 1; return(new OrToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Multiply case '*': SourceCodeNextPosition = SourceCodePosition + 1; return(new MultiplyToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Divide case '/': SourceCodeNextPosition = SourceCodePosition + 1; return(new DivideToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Modulus case '%': SourceCodeNextPosition = SourceCodePosition + 1; return(new ModulusToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Left Parenthis case '(': SourceCodeNextPosition = SourceCodePosition + 1; return(new LeftParenToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Right Parenthis case ')': SourceCodeNextPosition = SourceCodePosition + 1; return(new RightParenToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Less Than case '<': SourceCodeNextPosition = SourceCodePosition + 1; if (SourceCodeNextPosition < SourceCode.Length) { // <> becomes NotEqual if (SourceCode[SourceCodeNextPosition] == '>') { SourceCodeNextPosition = SourceCodeNextPosition + 1; return(new NotEqualToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } // <= becomes LessOrEqual if (SourceCode[SourceCodeNextPosition] == '=') { SourceCodeNextPosition = SourceCodeNextPosition + 1; return(new LessOrEqualToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } } // Return Less Than return(new LessThenToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // In combination with = becomes NotEqual Token case '!': SourceCodeNextPosition = SourceCodePosition + 1; if (SourceCodeNextPosition < SourceCode.Length) { // Check if next Token is EqualToken if (SourceCode[SourceCodeNextPosition] == '=') { SourceCodeNextPosition = SourceCodeNextPosition + 1; return(new NotEqualToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } } // If not != then ignore break; // Greater Than case '>': SourceCodeNextPosition = SourceCodePosition + 1; if (SourceCodeNextPosition < SourceCode.Length) { // >= becomes MoreOrEqual if (SourceCode[SourceCodeNextPosition] == '=') { SourceCodeNextPosition = SourceCodeNextPosition + 1; return(new MoreOrEqualToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } } // return GreaterThen return(new GreaterThenToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // Equals case '=': SourceCodeNextPosition = SourceCodePosition + 1; // If previous token is an Text token make it a variables // (Equal becomes assignment character) if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(TextToken))) { String VariableName = ((TextToken)ProgramToTokenize[ProgramToTokenize.Count - 1]).Content; VariableNames.Add(VariableName); // If $ then it is an String variable else Numeric if (VariableName[VariableName.Length - 1] == '$') { ProgramToTokenize[ProgramToTokenize.Count - 1] = new StringVariableToken(this, VariableName); } else { ProgramToTokenize[ProgramToTokenize.Count - 1] = new NumericVariableToken(this, VariableName); } } // Return Equals return(new EqualToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); // REM case '\'': SourceCodeNextPosition = SourceCodePosition + 1; // Skip source until EndOfLine or EndOfProgram while (SourceCodeNextPosition < SourceCode.Length) { if (SourceCode[SourceCodeNextPosition] == '\n') { break; } SourceCodeNextPosition++; } return(new RemToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } /////////////////////////////////////////////////////////////////////////// // // Search for Quoted Strings // /////////////////////////////////////////////////////////////////////////// // Check for quote if (SourceCode[SourceCodePosition] == '\"') { SourceCodeNextPosition = SourceCodePosition; // Use extra string to check for backslashes String QuotedString = ""; bool IgnoreNextQuote = false; // Search for end of string do { // Check for backslash, Don't ignore a second backslash if ((!IgnoreNextQuote) && (SourceCode[SourceCodeNextPosition] == '\\')) { // Backslash found, ignore next quote as string end // Don't add to string IgnoreNextQuote = true; } else { // Add to string QuotedString += SourceCode[SourceCodeNextPosition]; // Reset quote search IgnoreNextQuote = false; } SourceCodeNextPosition++; } while ((IgnoreNextQuote) || (SourceCode[SourceCodeNextPosition] != '\"')); SourceCodeNextPosition++; // Return String return(new StringToken(this, QuotedString + "\"")); } /////////////////////////////////////////////////////////////////////////// // // Search for Keywords // /////////////////////////////////////////////////////////////////////////// // Check for keywords foreach (KeywordTokenConstructor kt in KeywordTokens) { // Check if keyword is not longer then remaining program code if (kt.Keyword.Length <= (SourceCode.Length - SourceCodePosition)) { // Check for token if (SourceCodeLower.Substring(SourceCodePosition, kt.Keyword.Length) == kt.Keyword) { // Check if it's the whole keyword that we've found if ((SourceCode.Length - SourceCodePosition - kt.Keyword.Length) != 0) { if (CHECK_END_OF_TOKEN.IndexOf(SourceCode[SourceCodePosition + kt.Keyword.Length]) == -1) { continue; } } // Return keyword if found SourceCodeNextPosition = SourceCodePosition + kt.Keyword.Length; if (kt.Keyword == "rem") { SourceCodeNextPosition = SourceCodePosition + 1; while (SourceCodeNextPosition < SourceCode.Length) { if (SourceCode[SourceCodeNextPosition] == '\n') { break; } SourceCodeNextPosition++; } } return(kt.TokenConstructor(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } } } /////////////////////////////////////////////////////////////////////////// // // Search for Known variables // /////////////////////////////////////////////////////////////////////////// // Check for variables foreach (String VarName in VariableNames) { // Check if variable name is not longer then remaining program code if (VarName.Length <= (SourceCode.Length - SourceCodePosition)) { // Check for token if (SourceCodeLower.Substring(SourceCodePosition, VarName.Length) == VarName.ToLower()) { // Check if it's the whole keyword that we've found if ((SourceCode.Length - SourceCodePosition - VarName.Length) != 0) { if (CHECK_END_OF_VARIABLE_NAME.IndexOf(SourceCode[SourceCodePosition + VarName.Length]) == -1) { continue; } } // Return keyword if found SourceCodeNextPosition = SourceCodePosition + VarName.Length; if (VarName[VarName.Length - 1] == '$') { return(new StringVariableToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } else { return(new NumericVariableToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } } } } /////////////////////////////////////////////////////////////////////////// // // Search for New variables // /////////////////////////////////////////////////////////////////////////// // Search for new Variable Names, If preceeded by LET or FOR then make it a new variable for (int i = 0; i < (MAX_VARIABLENAME_LENGTH + 1); ++i) { // Search for End of TextToken if ((CHECK_END_OF_VARIABLE_NAME.IndexOf(SourceCode[SourceCodePosition + i])) != -1) { if (i > 0) { SourceCodeNextPosition = SourceCodePosition + i; String TxtPart = SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition); if (ProgramToTokenize.Count > 0) { if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(ForToken))) { String VariableName = SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition); VariableNames.Add(VariableName); if (VariableName[VariableName.Length - 1] == '$') { return(new StringVariableToken(this, VariableName)); } else { return(new NumericVariableToken(this, VariableName)); } } if (ProgramToTokenize[ProgramToTokenize.Count - 1].GetType().Equals(typeof(LetToken))) { String VariableName = SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition); VariableNames.Add(VariableName); if (VariableName[VariableName.Length - 1] == '$') { return(new StringVariableToken(this, VariableName)); } else { return(new NumericVariableToken(this, VariableName)); } } } // No FOR or LET make it a TextToken return(new TextToken(this, SourceCode.Substring(SourceCodePosition, SourceCodeNextPosition - SourceCodePosition))); } else { throw new BasicParserException(BasicParserException.VARIABLENAME_UNEXPECTED_END); } } } // Failed to find next token throw new BasicParserException(BasicParserException.UNKNOWN_ERROR); }