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) { 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); }
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); }
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) { 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); }
public FullSourceLexer() { _iterator = new SourceCodeIterator(); }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { return(_lex); }