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); }
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); }
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); }
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); }
public void AddClass(ZCompileClassModel zCompileClassModel) { zCompileClassModel.Project = this; SouceFileList.Add(zCompileClassModel); }