public MipsProgram VisitProgram(ASTCILProgramNode Program)
        {
            var bufferlabel = MipsGenerationHelper.BufferLabel;

            var result = new MipsProgram();

            result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript().GlobalSection(bufferlabel));
            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(bufferlabel, new[] { MipsGenerationHelper.AddDynamycString(MipsGenerationHelper.BufferSize) }));

            List <string> all = new List <string>();

            foreach (var item in RuntimeErrors.GetRuntimeErrorString)
            {
                var exception = labelGenerator.GetException(item.Key);
                all.Add(exception);
                result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript()
                                                 .GlobalSection(exception));
                result.SectionData.Append(MipsGenerationHelper.NewScript()
                                          .AddData(exception, new[] { MipsGenerationHelper.AddStringData(item.Value) }));
            }

            var exceptions = MipsGenerationHelper.Exceptions;

            result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript()
                                             .GlobalSection(exceptions));
            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(exceptions, all.Select(x => MipsGenerationHelper.AddIntData(x))));

            CompilationUnit.TypeEnvironment.GetTypeDefinition("Main", null, out var main);
            var entryPoint = new ASTCILAllocateNode(main).Accept(this).SectionCode
                             .Append(MipsGenerationHelper.NewScript().Push(MipsRegisterSet.a0))
                             .Append(new ASTCILFuncVirtualCallNode(main, Functions.Init, new ASTCILExpressionNode[] { }).Accept(this).SectionCode)
                             .Append(new ASTCILFuncVirtualCallNode(main, "main", new ASTCILExpressionNode[] { }).Accept(this).SectionCode)
                             .Append(MipsGenerationHelper.NewScript().Add(MipsRegisterSet.sp, 12))
                             .Append(MipsGenerationHelper.NewScript().Exit());


            result.SectionCode.Append(MipsGenerationHelper.NewScript().MainTag()).Append(entryPoint);

            var voidLabel = labelGenerator.GenerateVoid();

            result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript()
                                             .GlobalSection(voidLabel).GlobalSection(labelGenerator.GetNewLine()));
            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(voidLabel, new[] { MipsGenerationHelper.AddStringData(String.Empty) }).AddData(
                                          labelGenerator.GetNewLine(), new[]
            {
                MipsGenerationHelper.AddStringData(Environment.NewLine)
            }));

            result.SectionTextGlobals.Append(MipsGenerationHelper.NewScript().GlobalSection(MipsGenerationHelper.StringEqualsLabel));
            result.SectionCode.Append(MipsGenerationHelper.NewScript().StringEquals());

            foreach (var item in Program.Types)
            {
                result += item.Accept(this);
            }

            return(result);
        }