Пример #1
0
        private bool ProcesshDivisionSymbol()
        {
            LexemAnalisisState state = _analysState.Peek();

            if (state == LexemAnalisisState.LexemAnalys)
            {
                _analysState.Push(LexemAnalisisState.Division);
                return(true);
            }
            //Строчный комментарий
            if (state == LexemAnalisisState.Division)
            {
                _analysState.Pop();
                state = _analysState.Peek();
                if (state == LexemAnalisisState.BlockComment || state == LexemAnalisisState.LineComment) //не интересуют символы косой черты в комментариях
                {
                    return(true);
                }
                int endLineIndex = _code.IndexOf('\n', _position);
                if (endLineIndex == -1) //дошли до конца, а перевода строки нет
                {
                    endLineIndex = _codeLen;
                }
                _lexeme  += _code.Substring(_position + 1, endLineIndex - _position - 1); //весь комментарий в лексему
                _position = endLineIndex;
                //_lexemeList.AddLast(new Lexeme(_lexeme, LexemeTypes.SingleLineComment, _codeLine));
                _lexeme = null;
                _codeLine++;
                return(true);
            }
            //Если ранее было число - формируем 2 лексемы
            if (state == LexemAnalisisState.Digit || state == LexemAnalisisState.Decimal)
            {
                LexemeTypes type = LexemeTypes.Underfined;
                if (_analysState.Peek() == LexemAnalisisState.Decimal)
                {
                    _analysState.Pop();
                    type = LexemeTypes.Double;
                }
                if (_analysState.Peek() == LexemAnalisisState.Digit)
                {
                    _analysState.Pop();
                    if (type != LexemeTypes.Double)
                    {
                        type = LexemeTypes.Integer;
                    }
                }
                _lexemeList.AddLast(new Lexeme(_lexeme, type, _codeLine));
                _lexemeList.AddLast(new Lexeme("/", LexemeTypes.Division, _codeLine));
                _lexeme = null;
                return(true);
            }
            if (state == LexemAnalisisState.BlockComment || state == LexemAnalisisState.LineComment)
            {
                return(true);
            }
            return(false);
        }
Пример #2
0
        private bool ProcessLetter()
        {
            LexemAnalisisState state = _analysState.Peek();

            switch (state)
            {
            //Если комментарий или строка, добавляем символ к лексеме без дальнейшей обработки
            case LexemAnalisisState.BlockComment:
            case LexemAnalisisState.String:
            case LexemAnalisisState.LineComment:
                return(true);
            }
            return(false);
        }
Пример #3
0
        private bool ProcessDigit()
        {
            LexemAnalisisState state = _analysState.Peek();

            switch (state)
            {
            //Если комментарий, или число добавляем число к лексеме и обрабатываем дальше
            case LexemAnalisisState.BlockComment:
            case LexemAnalisisState.Digit:
            case LexemAnalisisState.LineComment:
            case LexemAnalisisState.Decimal:
                return(true);
            }
            return(false);
        }
Пример #4
0
        /// <summary>
        /// Обработка строкового комментария
        /// </summary>
        private void ProcessLineComment()
        {
            _analysState.Pop();
            LexemAnalisisState state = _analysState.Peek();

            if (state == LexemAnalisisState.BlockComment || state == LexemAnalisisState.LineComment) //не интересуют символы косой черты в комментариях
            {
                return;
            }
            int endLineIndex = _code.IndexOf('\n', _position);

            if (endLineIndex == -1) //дошли до конца, а перевода строки нет
            {
                endLineIndex = _codeLen;
            }
            _lexeme  += _code.Substring(_position + 1, endLineIndex - _position - 1); //весь комментарий в лексему
            _position = endLineIndex;
            //_lexemeList.AddLast(new Lexeme(_lexeme, LexemeTypes.SingleLineComment, _codeLine));
            _lexeme = null;
            _codeLine++;
        }
Пример #5
0
        private bool ProcessMultiplyingSymbol()
        {
            LexemAnalisisState state = _analysState.Peek();
            bool processSecceed      = false;

            switch (state)
            {
            //Если предыдущий символ был "/", то это блоковый комментарий
            case LexemAnalisisState.Division:
                _analysState.Pop();
                //Ищем конец блокового комментария
                int endLineIndex = _code.IndexOf("*/", _position);
                if (endLineIndex == -1)     //дошли до конца, а комментарий не закрыт!
                {
                    endLineIndex = _codeLen;
                    throw new NotImplementedException("Не реализована ошибка незакрытого комментария");
                }
                _lexeme  += _code.Substring(_position + 1, endLineIndex - _position - 1);    //весь комментарий в лексему
                _position = endLineIndex;
                //Посчитаем переводы строк:
                _codeLine += _lexeme.Where(x => x == '\n').Count();
                //Затираем лексему, т.к. комментарий нас не интересует совсем
                _lexeme        = null;
                processSecceed = true;
                break;

            //Если мы формируем строку или строчный комментарий - то добавляем лишь очередной символ игнорируя значение
            case LexemAnalisisState.String:
            case LexemAnalisisState.LineComment:
                processSecceed = true;
                break;

            case LexemAnalisisState.BlockComment:
                _analysState.Push(LexemAnalisisState.Multiplying);     //Возможно следующим символом будет закрыт блочный комментарий
                processSecceed = true;
                break;
            }
            return(processSecceed);
        }
Пример #6
0
        private void ProcessChars(char c)
        {
            LexemAnalisisState state = _analysState.Peek();

            switch (state)
            {
            case LexemAnalisisState.BlockComment:
            case LexemAnalisisState.LineComment:
                return;

            default:
                if (c == ' ')
                {
                    if (_lexeme.Length > 1)
                    {
                        _lexeme = _lexeme.Substring(0, _lexeme.Length - 1);
                        _lexemeList.AddLast(new Lexeme(_lexeme, LexemeTypes.String, _codeLine));
                        _lexeme = null;
                    }
                }
                break;
            }
        }
Пример #7
0
        private bool ProcessNewLine(char c)
        {
            LexemAnalisisState state = _analysState.Peek();

            switch (state)
            {
            case LexemAnalisisState.BlockComment:
                //Если формируется блоковый комментарий, просто увеличиваем счетчик новых строк
                if (c == '\n')
                {
                    _codeLine++;
                }
                return(true);

            case LexemAnalisisState.LexemAnalys:
                if (_lexeme.Length > 1)
                {
                    _lexeme = _lexeme.Substring(0, _lexeme.Length - 1);
                }
                else
                {
                    _lexeme = null;
                }
                _codeLine++;
                return(false);

            case LexemAnalisisState.String:
                //Если формировали строковую константу и был перевод строки, формируем лексему, увеличиваем счетчик и завершаем обработку
                //А так же добавляем ошибку
                _errors.Add(new StringStartError(_codeLine));
                _codeLine++;
                return(true);
            }

            return(false);
        }
Пример #8
0
        /// <summary>
        /// Обработка знака '=' (равно) - присваивания
        /// </summary>
        /// <returns></returns>
        private bool ProcessAssignment(char c, string lexeme, out string lexemeModificated)
        {
            bool result = false;
            LexemAnalisisState state = _analysState.Peek();

            switch (state)
            {
            case LexemAnalisisState.Multiplying: //*=
            case LexemAnalisisState.Division:    // /=
            case LexemAnalisisState.Summation:   // +=
            case LexemAnalisisState.Decrease:    // -=
                _analysState.Pop();
                string currLex = lexeme + c;
                _lexemeList.AddLast(new Lexeme(currLex, GetTwoCharLexemeType(currLex), _codeLine));
                lexemeModificated = null;
                break;

            default:
                result            = true;
                lexemeModificated = lexeme;
                break;
            }
            return(result);
        }