private void SkipSpacesAndComments(SourceCodeIterator iterator) { while (true) { /* Пропускаем все пробелы и комментарии */ iterator.SkipSpaces(); if (iterator.CurrentSymbol == '/') { if (!iterator.MoveNext()) { throw CreateExceptionOnCurrentLine("Некорректный символ", iterator); } if (iterator.CurrentSymbol != '/') { throw CreateExceptionOnCurrentLine("Некорректный символ", iterator); } do { if (!iterator.MoveNext()) { break; } } while (iterator.CurrentSymbol != '\n'); } else { break; } } }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { StringBuilder contentBuilder = new StringBuilder(); while (iterator.MoveNext()) { var cs = iterator.CurrentSymbol; if (cs == SpecialChars.StringQuote) { if (iterator.MoveNext()) { if (iterator.CurrentSymbol == SpecialChars.StringQuote) { /* Двойная кавычка */ contentBuilder.Append("\""); continue; } /* Завершение строки */ SkipSpacesAndComments(iterator); if (iterator.CurrentSymbol == SpecialChars.StringQuote) { /* Сразу же началась новая строка */ contentBuilder.Append('\n'); continue; } } var lex = new Lexem { Type = LexemType.StringLiteral, Content = contentBuilder.ToString() }; return(lex); } if (cs == '\n') { iterator.MoveNext(); SkipSpacesAndComments(iterator); if (iterator.CurrentSymbol != '|') { throw CreateExceptionOnCurrentLine("Некорректный строковый литерал!", iterator); } contentBuilder.Append('\n'); } else if (cs != '\r') { contentBuilder.Append(cs); } } throw CreateExceptionOnCurrentLine("Незавершённый строковой интервал!", iterator); }
private LexerState SelectState() { char cs = _iterator.CurrentSymbol; if (Char.IsLetter(cs) || cs == SpecialChars.Underscore) { _state = _wordState; } else if (Char.IsDigit(cs)) { _state = _numberState; } else if (cs == SpecialChars.DateQuote) { _state = _dateState; } else if (cs == SpecialChars.StringQuote) { _state = _stringState; } else if (SpecialChars.IsOperatorChar(cs)) { _state = CommentOrOperatorState(cs); } else if (cs == SpecialChars.EndOperator) { SetFixedState(LexemType.EndOperator, Token.Semicolon); } else if (cs == SpecialChars.QuestionMark) { SetFixedState(LexemType.Operator, Token.Question); } else if (cs == SpecialChars.Preprocessor) { _state = _directiveState; } else if (cs == SpecialChars.Annotation) { _iterator.GetContents(); _iterator.MoveNext(); _state = _annotationState; } else { var cp = _iterator.GetPositionInfo(); var exc = new SyntaxErrorException(cp, string.Format("Неизвестный символ {0}", cs)); if (!HandleError(exc)) { throw exc; } } return(_state); }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { bool hasDecimalPoint = false; while (true) { if (Char.IsDigit(iterator.CurrentSymbol)) { if (!iterator.MoveNext()) { var lex = new Lexem() { Type = LexemType.NumberLiteral, Content = iterator.GetContents() }; return(lex); } } else if (SpecialChars.IsDelimiter(iterator.CurrentSymbol)) { if (iterator.CurrentSymbol == '.') { if (!hasDecimalPoint) { hasDecimalPoint = true; iterator.MoveNext(); continue; } else { throw CreateExceptionOnCurrentLine("Некорректно указана десятичная точка в числе", iterator); } } var lex = new Lexem() { Type = LexemType.NumberLiteral, Content = iterator.GetContents() }; return(lex); } else { throw CreateExceptionOnCurrentLine("Некорректный символ", iterator); } } }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { System.Diagnostics.Debug.Assert(iterator.CurrentSymbol == SpecialChars.Preprocessor); if (!iterator.OnNewLine) { throw CreateExceptionOnCurrentLine("Недопустимое начало директивы препроцессора", iterator); } iterator.MoveNext(); var position = iterator.GetPositionInfo(); if (!iterator.MoveToContent()) { throw CreateExceptionOnCurrentLine(MESSAGE_DIRECTIVE_EXPECTED, iterator); } if (position.LineNumber != iterator.CurrentLine) { throw new SyntaxErrorException(position, MESSAGE_DIRECTIVE_EXPECTED); } if (!Char.IsLetter(iterator.CurrentSymbol)) { throw CreateExceptionOnCurrentLine(MESSAGE_DIRECTIVE_EXPECTED, iterator); } var lex = _wordExtractor.ReadNextLexem(iterator); lex.Type = LexemType.PreprocessorDirective; return(lex); }
private void SetFixedState(LexemType lexemType, Token token) { _iterator.MoveNext(); _fixedState.SetOutput(new Lexem() { Type = lexemType, Token = token }); _state = _fixedState; }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { var numbers = new StringBuilder(); while (iterator.MoveNext()) { var cs = iterator.CurrentSymbol; if (cs == SpecialChars.DateQuote) { iterator.GetContents(1, 1); iterator.MoveNext(); try { var lex = new Lexem() { Type = LexemType.DateLiteral, Content = FullDateTimeString(numbers) }; return(lex); } catch (FormatException) { throw CreateExceptionOnCurrentLine("Некорректный литерал даты", iterator); } } if (Char.IsDigit(cs)) { numbers.Append(cs); } if (numbers.Length > 14) { throw CreateExceptionOnCurrentLine("Некорректный литерал даты", iterator); } } throw CreateExceptionOnCurrentLine("Незавершенный литерал даты", iterator); }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { System.Diagnostics.Debug.Assert(iterator.CurrentSymbol == SpecialChars.Preprocessor); iterator.MoveNext(); if (!iterator.MoveToContent()) { throw CreateExceptionOnCurrentLine("Ожидается директива", iterator); } if (!Char.IsLetter(iterator.CurrentSymbol)) { CreateExceptionOnCurrentLine("Ожидается директива препроцессора", iterator); } var lex = _wordExtractor.ReadNextLexem(iterator); lex.Type = LexemType.PreprocessorDirective; return(lex); }