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); }
private bool ProcessLetter() { LexemAnalisisState state = _analysState.Peek(); switch (state) { //Если комментарий или строка, добавляем символ к лексеме без дальнейшей обработки case LexemAnalisisState.BlockComment: case LexemAnalisisState.String: case LexemAnalisisState.LineComment: return(true); } return(false); }
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); }
/// <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++; }
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); }
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; } }
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); }
/// <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); }