private ModuleImage CompileInternal(ICodeSource source)
        {
            RegisterScopeIfNeeded();

            var parser = new PreprocessingLexer();

            foreach (var variable in _preprocessorVariables)
            {
                parser.Define(variable);
            }
            parser.UnknownDirective += (sender, args) =>
            {
                // все неизвестные директивы возвращать назад и обрабатывать старым кодом
                args.IsHandled = true;
            };
            parser.Code = source.Code;

            var compiler = new Compiler.Compiler();

            compiler.ProduceExtraCode = ProduceExtraCode;
            compiler.DirectiveHandler = ResolveDirective;

            if (DirectiveResolver != null)
            {
                DirectiveResolver.Source = source;
            }

            ModuleImage compiledImage;

            try
            {
                compiledImage = compiler.Compile(parser, _currentContext);
            }
            catch (ScriptException e)
            {
                if (e.ModuleName == null)
                {
                    e.ModuleName = source.SourceDescription;
                }

                throw;
            }
            finally
            {
                if (DirectiveResolver != null)
                {
                    DirectiveResolver.Source = null;
                }
            }

            var mi = new ModuleInformation();

            mi.CodeIndexer = parser.Iterator;
            // пока у модулей нет собственных имен, будет совпадать с источником модуля
            mi.ModuleName            = source.SourceDescription;
            mi.Origin                = source.SourceDescription;
            compiledImage.ModuleInfo = mi;

            return(compiledImage);
        }
Example #2
0
        public void PreprocessingLexer_CompositeTest()
        {
            var pp = new PreprocessingLexer();

            string code = @"
            #Если Клиент Тогда
                К
            #ИначеЕсли Сервер или ВебКлиент Тогда
                СВ
            #ИначеЕсли ТолстыйКлиент и Не ВебКлиент Тогда
                ТнВ
            #Иначе
                И
            #КонецЕсли";

            pp.Define("Сервер");
            Assert.Equal("СВ", GetPreprocessedContent(pp, code));
            pp.Define("Клиент");
            Assert.True(GetPreprocessedContent(pp, code) == "К");
            pp.Undef("Сервер");
            pp.Undef("Клиент");
            pp.Define("ВебКлиент");
            Assert.True(GetPreprocessedContent(pp, code) == "СВ");
            pp.Define("ТолстыйКлиент");
            pp.Undef("ВебКлиент");
            Assert.True(GetPreprocessedContent(pp, code) == "ТнВ");
            pp.Undef("ТолстыйКлиент");
            Assert.True(GetPreprocessedContent(pp, code) == "И");
        }
Example #3
0
        public void Folded_PreprocessingLexer_Items()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");
            pp.Define("Клиент");
            pp.Define("ВебКлиент");

            var code = @"
            #Если Сервер Тогда
                #Если ВебКлиент Тогда
                    Б
                #КонецЕсли
                Х
            #Иначе
                В
            #КонецЕсли";

            var preprocessed = GetPreprocessedContent(pp, code);

            Assert.Equal("БХ", preprocessed);

            pp.Undef("ВебКлиент");
            preprocessed = GetPreprocessedContent(pp, code);
            Assert.Equal("Х", preprocessed);

            pp.Undef("Сервер");
            preprocessed = GetPreprocessedContent(pp, code);
            Assert.Equal("В", preprocessed);
        }
Example #4
0
        public void PreprocessingLexer_IfElse()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");
            pp.Define("Клиент");
            pp.Define("ВебКлиент");

            var code = @"
            #Если Сервер и Не Клиент Тогда
                А
            #ИначеЕсли ВебКлиент Тогда
                Б
            #ИначеЕсли СовсемНеКлиент Тогда
                Х
            #Иначе
                В
            #КонецЕсли";

            pp.Code = code;

            Lexem lex;

            lex = pp.NextLexem();
            Assert.True(lex.Content == "Б");
            lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
            Assert.Equal(LexemType.EndOfText, lex.Type);
        }
Example #5
0
        public void PreprocessingLexer_If_True()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");
            pp.Define("Клиент");

            var code = @"
            #Если Сервер и Клиент Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(LexemType.Identifier, lex.Type);
            Assert.Equal("F", lex.Content);

            lex = pp.NextLexem();
            Assert.Equal(LexemType.EndOperator, lex.Type);

            lex = pp.NextLexem();
            Assert.Equal(LexemType.EndOfText, lex.Type);
        }
Example #6
0
        public void PreprocessingLexer_Branching()
        {
            string code = @"
            Привет,
            #Если ТыВидишь Тогда
            ты видишь
                #Если Картошка Тогда
                    картошку
                #ИначеЕсли Морковка Тогда
                    морковку
                #ИначеЕсли Капуста Тогда
                    капусту
                #Иначе
                    шоколадку
                #КонецЕсли
            тогда ты молодец
            #Иначе
            тут ничего нет
            #КонецЕсли";

            var pp = new PreprocessingLexer();

            var preprocessed = GetPreprocessedContent(pp, code);

            Assert.Equal("Привет,тутничегонет", preprocessed);

            pp.Define("ТыВидишь");
            preprocessed = GetPreprocessedContent(pp, code);
            Assert.Equal("Привет,тывидишьшоколадкутогдатымолодец", preprocessed);

            pp.Define("Морковка");
            preprocessed = GetPreprocessedContent(pp, code);
            Assert.Equal("Привет,тывидишьморковкутогдатымолодец", preprocessed);
        }
Example #7
0
        public void PreprocessingLexer_BadRegionName()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область -reg
            #КонецОбласти
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #8
0
        public void PreprocessingLexer_NoRegionNameWithComment()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область // no name
            #КонецОбласти
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #9
0
        public void PreprocessingLexer_SymbolsAfterEndRegion()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg
            #КонецОбласти reg
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #10
0
        public void Definitions_Are_Defined()
        {
            var pp = new PreprocessingLexer();;

            pp.Define("Сервер");
            pp.Define("ВебКлиент");
            Assert.True(pp.IsDefined("сервер"));
            Assert.True(pp.IsDefined("вебКлиеНт"));
            Assert.False(pp.IsDefined("client"));
            pp.Undef("ВебКлиент");
            Assert.False(pp.IsDefined("ВебКлиент"));
        }
Example #11
0
        public void PreprocessingLexer_Endif_Without_If()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #КонецЕсли
                H;
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #12
0
        public void PreprocessingLexer_Else_Without_If()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Иначе
                F;
            #КонецЕсли";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #13
0
        public void PreprocessingLexer_ExpressionUnexpected()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Если Сервер ИЛИ + Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #14
0
        public void PreprocessingLexer_Unclosed_IfBlock()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Если Сервер и Клиент Тогда
                F;
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => pp.NextLexem());
        }
Example #15
0
        public void PreprocessingLexer_SimpleRegion()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg1
            
            #КонецОбласти
            F";

            pp.Code = code;
            var lex = pp.NextLexem();

            Assert.Equal("F", lex.Content);
        }
Example #16
0
        private string GetPreprocessedContent(PreprocessingLexer pp, string code)
        {
            pp.Code = code;
            Lexem lex = Lexem.Empty();

            StringBuilder builder = new StringBuilder();

            while (lex.Type != LexemType.EndOfText)
            {
                lex = pp.NextLexem();

                builder.Append(lex.Content);
            }
            return(builder.ToString().Trim());
        }
Example #17
0
        public void PreprocessingLexer_DirectiveNotOnNewLine()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg
            F; #КонецОбласти
            ";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
Example #18
0
        public void PriorityOperators()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Нет и СовсемНет ИЛИ Да Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal("F", lex.Content);
        }
Example #19
0
        public void PriorityOperators_WithParenthesis()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Нет и (Да или Да) Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
        }
Example #20
0
        public void ParsingFirstNot()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Не Да Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
        }
Example #21
0
        public void PreprocessingLexer_NoEndRegion()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Область reg1
            #Область reg2
            #КонецОбласти
            F";

            pp.Code = code;
            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
Example #22
0
        public void PreprocessingLexer_If_False()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Сервер");

            var code = @"
            #Если Сервер и Клиент Тогда
                F;
            #КонецЕсли";

            pp.Code = code;

            var lex = pp.NextLexem();

            Assert.Equal(Token.EndOfText, lex.Token);
            Assert.Equal(LexemType.EndOfText, lex.Type);
        }
Example #23
0
        public void PreprocessingLexer_Extra_Endif()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Да Тогда
                F;
            #КонецЕсли
            #КонецЕсли
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
Example #24
0
        public void PreprocessingLexer_Unclosed_ElseBlock()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Да и Не Да Тогда
                F;
            #Иначе
                G;
            ";

            pp.Code = code;

            Assert.Throws <SyntaxErrorException>(() => { while (pp.NextLexem().Token != Token.EndOfText)
                                                         {
                                                             ;
                                                         }
                                                 });
        }
Example #25
0
        public void PreprocessingLexer_ExcludedLines()
        {
            var pp = new PreprocessingLexer();

            pp.Define("Да");

            var code = @"
            #Если Да Тогда
            F;
            #Иначе
            !!
            #КонецЕсли
            ";

            pp.Code = code;

            Lexem lex;

            do
            {
                lex = pp.NextLexem();
            } while (pp.NextLexem().Token != Token.EndOfText);
            Assert.Equal(Token.EndOfText, lex.Token);
        }
Example #26
0
        public void PreprocessingLexer_MultipleNestedRegions()
        {
            var pp = new PreprocessingLexer();

            var code = @"
            #Region reg1
            #Область reg2
            
            #Область if // keywords are ok
            
            #endRegion
            #КонецОбласти // reg 1
            
            #endRegion
            # Область  reg1 // same name is ok

            #КонецОбласти
            F";

            pp.Code = code;
            var lex = pp.NextLexem();

            Assert.Equal("F", lex.Content);
        }