예제 #1
0
        private List <Token> scanFileCode(ZCompileClassModel zCompileClassModel)
        {
            SourceReader reader  = new SourceReader();
            string       srcFile = zCompileClassModel.SourceFileInfo.FullName;// zCompileClassModel.GetSrcFullPath();

            reader.ReadFile(srcFile);
            List <Token> tokens2 = scanTokens(reader);

            return(tokens2);
        }
예제 #2
0
        private Type CompileClass(ZCompileClassModel zCompileClassModel, ProjectContext projectContext, ProjectCompileResult result)
        {
            FileCompiler fc   = new FileCompiler();
            Type         type = fc.Compile(projectContext, zCompileClassModel);

            if (type != null)
            {
                //projectContext.LoadProjectType(type);
                result.CompiledTypes.Add(type);
            }
            else
            {
                result.Errors.AddRange(Messager.Results.Errors);
                result.Errors.AddRange(Messager.Results.Warnings);
                Messager.Clear();
            }
            return(type);
        }
예제 #3
0
        private List <Token> scanPreCode(ZCompileClassModel zCompileClassModel)
        {
            if (string.IsNullOrEmpty(zCompileClassModel.PreSourceCode))
            {
                return(new List <Token>());
            }
            SourceReader reader = new SourceReader();

            reader.ReadString(zCompileClassModel.PreSourceCode);
            List <Token> tokens2 = scanTokens(reader);

            foreach (var token in tokens2)
            {
                token.Line = -token.Line - 1;
                token.Col  = token.Col - 1000;//方法体以行列区分,所以减去一些。
            }
            return(tokens2);
        }
예제 #4
0
        public Type Compile(ProjectContext context, ZCompileClassModel zCompileClassModel)
        {
            string srcPath = zCompileClassModel.SourceFileInfo.FullName;// zCompileClassModel.GetSrcFullPath();

            if (!File.Exists(srcPath))
            {
                Messager.Error("文件" + zCompileClassModel.SourceFileInfo + "不存在");
                return(null);
            }
            FileInfo fi = new FileInfo(srcPath);

            Messager.FileName = fi.Name;

            //Console.WriteLine("--------------- 词法分析 " + Messager.FileName + "--------------- ");
            List <Token> tokens    = new List <Token>( );
            List <Token> preTokens = scanPreCode(zCompileClassModel);

            tokens.AddRange(preTokens);

            List <Token> fileTokens = scanFileCode(zCompileClassModel);

            tokens.AddRange(fileTokens);

            //outTokenList(tokens);//Console.ReadKey(); return null;
            //Console.WriteLine("--------------- 语法分析 (LEX) " + Messager.FileName + "-------------");
            Parser lexparser = new Parser(tokens);
            var    fileAST   = lexparser.ParseFile();

            fileAST.Init(srcPath, context);
            //Console.WriteLine(fileAST.ToCode());
            //Console.ReadKey(); return null;
            //Console.WriteLine("--------------- 语义分析 文件生成 " + Messager.FileName + "---------------");
            Type type = fileAST.CompileFile();

            return(type);
        }
예제 #5
0
 public void AddClass(ZCompileClassModel zCompileClassModel)
 {
     zCompileClassModel.Project = this;
     SouceFileList.Add(zCompileClassModel);
 }