Example #1
0
        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 { }
            }
        }
Example #2
0
        /// <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);
        }