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