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()); } }
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"); } }
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(); }
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); }