Пример #1
0
        private static void Main(string[] args)
        {
            string dirName = ".";

            ModuleConstructor = new ModuleConstructor(ModuleName);

            List <AbstractClass> Classes = new List <AbstractClass>()
            {
                new System.IO.IO(),
                new System.String.String()
            };

            foreach (AbstractClass systemClass in Classes)
            {
                systemClass.DeclarationGen();
                foreach (var systemMethod in systemClass.Methods)
                {
                    systemMethod.DeclarationGen();
                }
            }

            foreach (AbstractClass systemClass in Classes)
            {
                systemClass.CodeGen();
            }

            // 输出生成字节码
            ModuleConstructor.Dump(dirName);

            Console.WriteLine($"System lib generated at {Path.GetFullPath(dirName)}.");
        }
Пример #2
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);
        }