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 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); }