private TokenType GetTokenType(string text)
        {
            text = text?.ToLower();

            if (LexerHelper.IsStartOfExpression(text))
            {
                return(TokenType.StartExpr);
            }
            if (LexerHelper.IsEndOfExpression(text))
            {
                return(TokenType.EndExpr);
            }
            if (interpreter.GetComplexFunctionsList().Contains(text))
            {
                return(TokenType.ComplexFunction);
            }
            if (interpreter.GetOperationsList().Contains(text))
            {
                return(TokenType.Operation);
            }
            if (interpreter.GetFunctionsList().Contains(text))
            {
                return(TokenType.Function);
            }
            if (double.TryParse(text, out _))
            {
                return(TokenType.Numeric);
            }
            if (LexerHelper.IsTokenSeparator(text))
            {
                return(TokenType.Separator);
            }

            return(TokenType.Empty);
        }
        private void MakeNumericToken()
        {
            tokenStart = pointer;

            while (LexerHelper.IsNumeric(currChar))
            {
                token += currChar;
                MoveNext();
            }
            tokenStart--;
            AddTokenAndResetTemp(TokenType.Numeric);
        }
        private void AddTokenAndResetTemp(TokenType type)
        {
            if (type == TokenType.Empty)
            {
                if (LexerHelper.IsCorrectIdentifier(token))
                {
                    type = TokenType.Variable;
                }
            }

            Token t = new Token(type, token, tokenStart);

            tokens.Add(t);
            token      = "";
            tokenStart = pointer;
        }
        private bool IsEndOfToken()
        {
            if (LexerHelper.IsTokenSeparator(currChar))
            {
                return(true);
            }
            if (LexerHelper.IsCorrectIdentifier(token) != LexerHelper.IsCorrectIdentifier(currChar))
            {
                return(true);
            }
            if (LexerHelper.IsNumeric(token) != LexerHelper.IsNumeric(currChar))
            {
                return(true);
            }
            if (GetTokenType(token + currChar) != TokenType.Operation &&
                GetTokenType(token) == TokenType.Operation &&
                GetTokenType(currChar) == TokenType.Operation)
            {
                return(true);
            }

            return(false);
        }
        public List <Token> SplitToTokenList(string scriptText)
        {
            scriptText += ";";
            tokens      = new List <Token>();
            script      = scriptText;
            pointer     = -1;
            token       = "";
            length      = script.Length;

            while (MoveNext())
            {
                if (token == "/" && currChar == '/')
                {
                    MakeComment();
                }

                if (token == "\"")
                {
                    MakeTextToken();
                }

                if (LexerHelper.IsNumeric(token))
                {
                    MakeNumericToken();
                }

                if (LexerHelper.IsTokenSeparator(token) || (token.Length > 0 && IsEndOfToken()))
                {
                    AddTokenAndResetTemp(GetTokenType(token));
                }

                token += currChar;
            }

            return(tokens);
        }
Beispiel #6
0
        public List <Token> SplitToTokenList(string scriptText)
        {
            scriptText += ";";

            List <Token> tokens = new List <Token>();
            string       token  = "";

            bool isStringValue = false;
            bool isLineComment = false;

            int index       = 0;
            int globalIndex = 0;

            foreach (char s in scriptText)
            {
                globalIndex++;

                if (s == '\r' || s == '\n')
                {
                    if (isLineComment)
                    {
                        isLineComment = false;
                    }
                    continue;
                }

                if (isLineComment)
                {
                    continue;
                }

                if (token.Length == 0 && !isStringValue && s != '"')
                {
                    index  = globalIndex - 1;
                    token += s;
                    continue;
                }

                if (isStringValue)
                {
                }
                else if (s == '/' && token.Length > 0 && token == "/")
                {
                    ResetTemp();
                    isLineComment = true;
                    continue;
                }
                else if (LexerHelper.IsTokenSeparator(token))
                {
                    AddTokenAndResetTemp(token, index);
                }
                else if (LexerHelper.IsTokenSeparator(s))
                {
                    AddTokenAndResetTemp(token, index);
                }
                else if (GetTokenType(token) == TokenType.Operation &&
                         GetTokenType(token + s) != TokenType.Operation)
                {
                    AddTokenAndResetTemp(token, index);
                }
                else if (int.TryParse(token, out _) && !int.TryParse(token + s, out _))
                {
                    AddTokenAndResetTemp(token, index);
                }
                else if (LexerHelper.IsCorrectIdentifier(token) && !LexerHelper.IsCorrectIdentifier(token + s))
                {
                    AddTokenAndResetTemp(token, index);
                }

                if (s == '"')
                {
                    if (isStringValue)
                    {
                        if (token.Length > 0 && token.Last() == '\\')
                        {
                            token  = token.Remove(token.Length - 1, 1);
                            token += '"';
                            continue;
                        }

                        isStringValue = false;

                        AddTokenByTypeAndResetTemp(TokenType.Text, token, index);
                        continue;
                    }
                    else
                    {
                        isStringValue = true;
                        continue;
                    }
                }

                token += s;
            }

            return(tokens);

            void AddTokenAndResetTemp(string tokenText, int textIndex)
            {
                TokenType tokenType = GetTokenType(tokenText);

                if (tokenType != TokenType.Separator)
                {
                    if (tokenType == TokenType.Empty)
                    {
                        tokenType = TokenType.Variable;
                    }

                    tokens.Add(new Token(tokenType, tokenText, textIndex));
                }

                ResetTemp();
            }

            void AddTokenByTypeAndResetTemp(TokenType tokenType, string tokenText, int textIndex)
            {
                tokens.Add(new Token(tokenType, tokenText, textIndex));
                ResetTemp();
            }

            void ResetTemp()
            {
                token = "";
                index = globalIndex - 1;
            }
        }