예제 #1
0
        virtual public Token GetToken()
        {
            SavePreviousStatus(); //for step back
            StatusKey statusOfAnalyz = StatusKey.Start;

            if (currentStatus != AnalyzerStatus.OK)
            {
                return(new Token("End file", -1, -1, TokenType.Null)); //null;
            }
            string newString = "";                                     //пустая строка

            int       positionOfWord = currentPos.letter;
            int       positionOfline = currentPos.linePos; //для того чтобы запомнить место начала этого символа или слова
            TokenType typeOfToken    = TokenType.IncorrectData;

            while (statusOfAnalyz != StatusKey.Complete && statusOfAnalyz != StatusKey.Incorrect)
            {
                if (reader.Peek() == -1)
                {
                    currentStatus = AnalyzerStatus.Empty;

                    if (newString.Equals(""))
                    {
                        return(new Token("End file", -1, -1, TokenType.Null)); //null; }
                    }
                    typeOfToken = sTokens[statusOfAnalyz].endFileType;         //присваиваем получившееся значение
                    break;
                } //конец файла

                char symbol = ReadSymbol();

                StatusKey nextStatus = sTokens[statusOfAnalyz].CheckSym(symbol);

                if (nextStatus == StatusKey.Complete)
                {
                    typeOfToken = sTokens[statusOfAnalyz].type;
                }

                //до этого момента мы еще не перевелись на новый символ!
                if (nextStatus == StatusKey.SymBack) //не записываем новый символ!
                {
                    typeOfToken    = sTokens[statusOfAnalyz].type;
                    statusOfAnalyz = StatusKey.Complete;
                    GetBackSymbol();
                    break;
                }

                if (nextStatus == StatusKey.SymDotBack) //не записываем новый символ!
                {
                    typeOfToken    = TokenType.IntData;
                    statusOfAnalyz = StatusKey.Complete;
                    GetBackSymbol();
                    GetBackSymbol();
                    newString = newString.Substring(0, newString.Length - 1); //удаляем последний символ

                    //reader.DiscardBufferedData();
                    //reader.BaseStream.Seek(currentPos.globalPos, SeekOrigin.Begin);//перемещаем указатель ///!!!!! возможно с нуля нужно считать global pos
                    StepBack();
                    break;
                }

                reader.Read();

                if (nextStatus == StatusKey.NewLine) //для коментариев
                {
                    nextStatus = StatusKey.LinesComentaryP1;
                    NextLine();
                }

                if (nextStatus == StatusKey.NewLineWithBreak) //для других данных (в самом начале аппарата конечного), когда string = ""
                {
                    nextStatus = StatusKey.Start;
                    NextLine();
                    positionOfWord = currentPos.letter; //обновляем
                    positionOfline = currentPos.linePos;
                    continue;
                }

                if (nextStatus == StatusKey.SymNext) //только для начала конечного аппарата
                {
                    nextStatus     = StatusKey.Start;
                    positionOfWord = currentPos.letter; //обновляем
                    continue;
                }

                statusOfAnalyz = nextStatus;
                newString     += symbol; //добавляем символ
                //проверка на разные статусы, которые не равны основным перечисленным в словаре
            }

            //проверка на символ \r в конце

            if (typeOfToken != TokenType.IncorrectData)
            {
                if (typeOfToken == TokenType.Identificator && KeyWords.CheckOnKeyWord(newString))
                {
                    typeOfToken = TokenType.KeyWord;
                }

                Token nToken = new Token(newString, positionOfline, positionOfWord, typeOfToken);

                if (!nToken.Finalyze())
                {
                    currentStatus     = AnalyzerStatus.Error;
                    nToken.parseError = true;
                    return(nToken);
                }

                if (reader.Peek() == -1)
                {
                    currentStatus = AnalyzerStatus.Empty;
                }

                return(nToken);
            }
            else //if == incorrect
            {
                newString     = DeleteLF(newString); //проверка на такие данные [...]+\r
                currentStatus = AnalyzerStatus.Error;
                return(new Token(newString, positionOfline, positionOfWord, TokenType.IncorrectData));
            }
        }