Ejemplo n.º 1
0
 private void MoveNext()
 {
     _lastExtractedLexem = _lexer.NextLexem();
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 public void SetOutput(Lexem lex)
 {
     _lex = lex;
 }