Exemplo n.º 1
0
        /// <summary>
        /// Генерация токена распознанной лексемы.
        /// </summary>
        /// <returns>Токен распознанной лексемы.</returns>
        Token GenerateToken()
        {
            switch (State)
            {
            case States.Const:
            {
                Constants.Add(Buffer);
                return(Constants.GetToken(Buffer));
            }

            case States.Id:
            {
                if (KeyWords.Contains(Buffer))
                {
                    return(KeyWords.GetToken(Buffer));
                }
                else
                {
                    Identifiers.Add(Buffer);
                    return(Identifiers.GetToken(Buffer));
                }
            }

            case States.Op1:
            case States.Op2:
            {
                return(Operations.GetToken(Buffer));
            }

            case States.Final:
            {
                return(Delimiters.GetToken(Buffer));
            }

            default: return(null);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Обработка очередного символа.
        /// </summary>
        /// <param name="C">Обрабатываемый символ.</param>
        public void ProcessSymbol(char C)
        {
            string CStr = Char.ToLower(C).ToString();

            switch (State)
            {
            case States.Start:
            {
                Buffer = "" + C;
                if (Digits.Contains(CStr))
                {
                    State = States.Const;
                }
                else if (Letters.Contains(CStr))
                {
                    State = States.Id;
                }
                else if (Operations.Contains(CStr))
                {
                    State = States.Op1;
                }
                else if (C == '/')
                {
                    State = States.Slash;
                }
                else if (Delimiters.Contains(CStr))
                {
                    State        = States.Final;
                    CurrentToken = GenerateToken();
                }
                else if (Char.IsWhiteSpace(C))
                {
                    State        = States.Final;
                    CurrentToken = null;
                }
                else
                {
                    throw new Exception("Недопустимый символ");
                }
            }
            break;

            case States.Const:
            {
                if (Digits.Contains(CStr))
                {
                    Buffer += C;
                }
                else if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Operations.Contains(CStr))
                {
                    CurrentToken = GenerateToken();
                    StepBack     = true;
                    State        = States.Final;
                }
                else
                {
                    throw new Exception("Недопустимый символ в константе");
                }
            }
            break;

            case States.Id:
            {
                if (Letters.Contains(CStr) || Digits.Contains(CStr))
                {
                    Buffer += C;
                }
                else if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Operations.Contains(CStr))
                {
                    CurrentToken = GenerateToken();
                    StepBack     = true;
                    State        = States.Final;
                }
                else
                {
                    throw new Exception("Недопустимый символ в идентификаторе");
                }
            }
            break;

            case States.Op1:
            {
                if (C == '=')
                {
                    Buffer += C;
                    State   = States.Op2;
                }
                else if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Letters.Contains(CStr) || Digits.Contains(CStr))
                {
                    CurrentToken = GenerateToken();
                    StepBack     = true;
                    State        = States.Final;
                }
                else
                {
                    throw new Exception("Недопустимый символ после знака операции");
                }
            }
            break;

            case States.Op2:
            {
                if (Delimiters.Contains(CStr) || Char.IsWhiteSpace(C) || Letters.Contains(CStr) || Digits.Contains(CStr))
                {
                    CurrentToken = GenerateToken();
                    StepBack     = true;
                    State        = States.Final;
                }
                else
                {
                    throw new Exception("Недопустимый символ после знака операции");
                }
            }
            break;

            case States.Slash:
            {
                if (C == '/')
                {
                    State = States.LineComm;
                }
                else if (C == '*')
                {
                    State = States.BlockComm;
                }
                else
                {
                    throw new Exception("Ошибка в комментарии");
                }
            }
            break;

            case States.BlockComm:
            {
                if (C == '*')
                {
                    State = States.BlockCommEnd;
                }
            }
            break;

            case States.BlockCommEnd:
            {
                if (C == '/')
                {
                    State = States.Final;
                }
                else
                {
                    State = States.BlockComm;
                }
            }
            break;
            }
        }