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);
        }
Exemple #2
0
        public virtual Lexem NextLexem()
        {
            _state = _emptyState;

            while (true)
            {
                if (_iterator.MoveToContent())
                {
                    SelectState();

                    Lexem lex;
                    try
                    {
                        lex = _state.ReadNextLexem(_iterator);

                        if (lex.Type == LexemType.NotALexem) // обработанные синтакс-ошибки
                        {
                            _state = _emptyState;
                            continue;
                        }
                    }
                    catch (SyntaxErrorException exc)
                    {
                        if (HandleError(exc))
                        {
                            lex = Lexem.Empty();
                        }
                        else
                        {
                            throw;
                        }
                    }

                    return(lex);
                }
                else
                {
                    return(Lexem.EndOfText());
                }
            }
        }
        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);
        }