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