private void MoveNext() { _lastExtractedLexem = _lexer.NextLexem(); }
private Lexem Preprocess(Lexem directive) { if (directive.Token == Token.If) { PushBlock(); return(ResolveCondition()); } else if (directive.Token == Token.ElseIf) { if (BlockIsSolved()) { SolveExpression(); // проверить корректность условия SkipTillNextDirective(); return(Preprocess(_lastExtractedLexem)); } return(ResolveCondition()); } else if (directive.Token == Token.Else) { if (BlockIsSolved()) { SkipTillNextDirective(); if (_lastExtractedLexem.Token != Token.EndIf) { throw PreprocessorError("Ожидается директива препроцессора #КонецЕсли"); } return(Preprocess(_lastExtractedLexem)); } return(LexemFromNewLine()); } else if (directive.Token == Token.EndIf) { PopBlock(); return(LexemFromNewLine()); } else { if (LanguageDef.IsPreprocRegion(directive.Content)) { MoveNext(); if (_lexer.Iterator.OnNewLine) { throw PreprocessorError("Ожидается имя области"); } if (!LanguageDef.IsIdentifier(ref _lastExtractedLexem)) { throw PreprocessorError($"Недопустимое имя Области: {_lastExtractedLexem.Content}"); } _regionsNesting++; return(LexemFromNewLine()); } else if (LanguageDef.IsPreprocEndRegion(directive.Content)) { if (_regionsNesting == 0) { throw PreprocessorError("Пропущена директива препроцессора #Область"); } _regionsNesting--; return(LexemFromNewLine()); } } HandleUnknownDirective(_lastExtractedLexem); return(_lastExtractedLexem); }
public void SetOutput(Lexem lex) { _lex = lex; }