Beispiel #1
0
        public static void Main(string[] args)
        {
            ArgumentParser  argumentParser = new ArgumentParser(new ConsoleArgument());
            ConsoleArgument dirArg         = new ConsoleArgument("d", ArgumentValueType.STRING);
            ConsoleArgument diagnoseArg    = new ConsoleArgument("diagnose");

            argumentParser.AddArgument(dirArg);
            argumentParser.AddArgument(diagnoseArg);
            argumentParser.Parse(args);

            string moduleName = argumentParser.DefaultRule.StringValue;

            if (dirArg.IsSet)
            {
                DirName = dirArg.StringValue;
            }

            // 1 模块加载
            VMModule mainModule = ModuleLoader.AddModule(LoadModule(moduleName), false);

            // 2 执行静态构造
            StaticInitWatch.Start();
            foreach (var vmClass in ModuleLoader.Classes.Values)
            {
                vmClass.Methods.TryGetValue(MethodArea.Singleton.StaticConstructorNameAddress, out List <VMMethod> sinit);
                VMExecutor executor = ThreadManager.CreateThread();
                executor.Execute(sinit[0]);
                // TODO 静态构造是可以多线程的,但是如何回收堆栈呢?
                ThreadManager.CollectThreadSpace(executor);
            }
            StaticInitWatch.Stop();

            // 3 执行Main函数
            if (!mainModule.Classes.TryGetValue(MethodArea.Singleton.StringProgramAddress, out VMClass entryClass))
            {
                throw new XiVMError("Program.Main() not found");
            }
            if (!entryClass.Methods.TryGetValue(MethodArea.Singleton.StringMainAddress, out List <VMMethod> entryMethodGroup))
            {
                throw new XiVMError("Program.Main() not found");
            }
            VMMethod entryMethod = entryMethodGroup.Find(m => m.DescriptorAddress == MethodArea.Singleton.StringMainDescriptorAddress);

            if (entryMethod == null)
            {
                throw new XiVMError("Program.Main(System.String) not found");
            }
            VMExecutor mainThread = ThreadManager.CreateThread();

            mainThread.Execute(entryMethod, null);

            // 4 诊断信息
            if (diagnoseArg.IsSet)
            {
                DisplaDiagnoseIndo(mainThread.GetDiagnoseInfo());
            }
        }
Beispiel #2
0
 private static void export(ConsoleArgument argument)
 {
     switch (argument.ExportType.ToLower())
       {
     case "xls":
       ExcelExport.ExportFullTaxonomy(argument.Path, argument.ManagedService, argument.SiteUrl);
       break;
     case "xml":
       XmlExport.ExportFullTaxonomy(argument.Path, argument.ManagedService, argument.SiteUrl);
       break;
     case "all":
       ExcelExport.ExportFullTaxonomy(argument.Path, argument.ManagedService, argument.SiteUrl);
       XmlExport.ExportFullTaxonomy(argument.Path, argument.ManagedService, argument.SiteUrl);
       break;
     default:
       throw new Exception("Export Type parameter not recognized, please check the help");
       }
 }
Beispiel #3
0
        static void Main(string[] args)
        {
            ConsoleArgument __p = new ConsoleArgument();

              if (args.Length < 4)
              {
            showHelp();
            return;
              }

              if (args[0].Equals("?"))
              {
            showHelp();
            return;

              }

              foreach (string item in args)
              {
            List<string> __split = new List<string>(2);
            int __index = item.IndexOf(':');
            if (__index > -1)
            {
              __split.Add(item.Substring(0, __index));
              __split.Add(item.Substring(__index + 1, item.Length - __index - 1));
            }
            string[] __arg = __split.ToArray();
            if (__arg.Length == 2)
            {
              switch (__arg[0])
              {
            case "-site":
              __p.SiteUrl = __arg[1];
              break;
            case "-path":
              __p.Path = __arg[1];
              break;
            case "-managedservice":
              __p.ManagedService = __arg[1];
              break;
            case "-operation":
              __p.Operation = __arg[1];
              break;
            case "-exporttype":
              __p.ExportType = __arg[1];
              break;
            case "-copyTermsID":
              __p.CopyId = bool.Parse(__arg[1]);
              break;
              }
            }
              }

              try
              {
            switch (__p.Operation)
            {
              case "import":
            XmlImport.Import(__p.Path, __p.ManagedService, __p.SiteUrl, __p.CopyId);
            break;
              case "export":
            export(__p);
            break;
              default:
            throw new Exception("Operation parameter not recognized, please check the help");
            }

              }
              catch (Exception err)
              {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(err);
            Console.ResetColor();
              }

              Console.ReadLine();
        }
Beispiel #4
0
        public static void Main(string[] args)
        {
            ArgumentParser  argumentParser = new ArgumentParser(new ConsoleArgument());
            ConsoleArgument dirArg         = new ConsoleArgument("d", ArgumentValueType.STRING);
            ConsoleArgument verboseArg     = new ConsoleArgument("verbose");

            argumentParser.AddArgument(dirArg);
            argumentParser.AddArgument(verboseArg);

            argumentParser.Parse(args);

            string moduleName = argumentParser.DefaultRule.StringValue;

            if (dirArg.IsSet)
            {
                DirName = dirArg.StringValue;
            }

            string fileName = null;

            foreach (string f in Directory.EnumerateFiles(DirName))
            {
                string fname = Path.GetFileName(f).ToString();
                if (fname.StartsWith(moduleName + "."))
                {
                    fileName = f;
                    break;  // TODO 不break,支持同模块多文件
                }
            }

            if (string.IsNullOrEmpty(fileName))
            {
                Console.Error.WriteLine($"Module {moduleName} not found in {DirName}");
                return;
            }

            string text = File.ReadAllText(fileName);

            TokenPassManager tokenPasses = new TokenPassManager(text);

            // 解析类信息之外的部分并生成AST
            AST root = (AST)tokenPasses.Run(new Parser());

            ASTPassManager astPasses = new ASTPassManager(root);

            //, 打印json文件
            if (verboseArg.IsSet)
            {
                string json = (string)astPasses.Run(new JsonPass());
                File.WriteAllText(fileName + ".ast.json", json);
            }

            // 编译生成ir与字节码,编译阶段会完成常量表达式的估值
            ModuleConstructor constructor = new ModuleConstructor(moduleName);

            ModuleHeaders.Add(moduleName, constructor.Module);
            List <Class> classes = (List <Class>)astPasses.Run(new ClassDeclarationPass(constructor));

            (List <Field> fields, List <Method> methods) = ((List <Field> fields, List <Method> methods))
                                                           astPasses.Run(new MemberDeclarationPass(constructor, classes));
            astPasses.Run(new CodeGenPass(constructor, classes, fields, methods));

            // 输出生成字节码
            constructor.Dump(DirName, verboseArg.IsSet);
        }