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)); } }