青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    Kernel FP的MakeFile可以指定輸出文件、報告文件以及代碼文件,并且可以繼承其他的MakeFile。首先我們來看一下MakeFile的例子:

    這是一個叫Project.txt的MakeFile,繼承自Default.txt和Default2.txt
 1 <kfpProject>
 2   <inherit path="Default.txt"/>
 3   <inherit path="Default2.txt"/>
 4   <code>
 5     <base path="CodeBase\"/>
 6     <include path="CodeA.txt"/>
 7     <include path="CodeB.txt"/>
 8   </code>
 9   <code>
10     <include path="CodeC.txt"/>
11     <include path="CodeD.txt"/>
12   </code>
13   <output path="Output.txt"/>
14   <report path="Report.txt"/>
15 </kfpProject>

    如果一部分代碼放在一個文件夾下面的話,可以使用code/base來節(jié)省書寫MakeFile的時間。讓我們看一下剩下的三個MakeFile,最后一個MakeFile被Default.txt和Default2.txt共同繼承:

    Default.txt
 1 <kfpProject>
 2   <inherit path="Library\Library.txt"/>
 3   <code>
 4     <base path="DefBase\"/>
 5     <include path="DefA.txt"/>
 6     <include path="DefB.txt"/>
 7   </code>
 8   <code>
 9     <include path="DefC.txt"/>
10     <include path="DefD.txt"/>
11   </code>
12   <output path="Output.txt"/>
13   <report path="Report.txt"/>
14 </kfpProject>

    Default2.txt
 1 <kfpProject>
 2   <inherit path="Library\Library.txt"/>
 3   <code>
 4     <base path="Def2Base\"/>
 5     <include path="Def2A.txt"/>
 6     <include path="Def2B.txt"/>
 7   </code>
 8   <code>
 9     <include path="Def2C.txt"/>
10     <include path="Def2D.txt"/>
11   </code>
12   <output path="Output.txt"/>
13   <report path="Report.txt"/>
14 </kfpProject>

    他們共同繼承的Library\Library.txt
 1 <kfpProject>
 2   <code>
 3     <base path="LibBase\"/>
 4     <include path="LibA.txt"/>
 5     <include path="LibB.txt"/>
 6   </code>
 7   <code>
 8     <include path="LibC.txt"/>
 9     <include path="LibD.txt"/>
10   </code>
11   <output path="LibOutput.txt"/>
12   <report path="LibReport.txt"/>
13 </kfpProject>

    MakeFile分析器的第一個作用是解析MakeFile,第二個作用是生成合并的MakeFile,也就是說,要將繼承下來的所有東西進行合并,并且為所有路徑制定直接路徑而不是相對路徑。讓我們看看Project.txt合并后的結果:
 1 <?xml version="1.0" encoding="gb2312" standalone="no" ?> 
 2 <kfpProject>
 3   <output path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Output.txt" /> 
 4   <report path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Report.txt" /> 
 5   <code>
 6     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Library\LibBase\LibA.txt" /> 
 7     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Library\LibBase\LibB.txt" /> 
 8     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Library\LibC.txt" /> 
 9     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Library\LibD.txt" /> 
10     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Def2Base\Def2A.txt" /> 
11     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Def2Base\Def2B.txt" /> 
12     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Def2C.txt" /> 
13     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\Def2D.txt" /> 
14     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\DefBase\DefA.txt" /> 
15     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\DefBase\DefB.txt" /> 
16     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\DefC.txt" /> 
17     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\DefD.txt" /> 
18     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\CodeBase\CodeA.txt" /> 
19     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\CodeBase\CodeB.txt" /> 
20     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\CodeC.txt" /> 
21     <include path="E:\Coding\VL++\Tools\KfpCompiler\TestData\CodeD.txt" /> 
22   </code>
23 </kfpProject>

    MakeFile分析器的代碼如下。

    頭文件:
 1 #ifndef KERNEL_COMPILER_PROJECTFILE
 2 #define KERNEL_COMPILER_PROJECTFILE
 3 
 4 #include "..\..\..\Library\Data\Data\VL_Data_String.h"
 5 #include "..\..\..\Library\Data\Data\VL_Data_List.h"
 6 
 7 using namespace vl;
 8 using namespace vl::collection;
 9 
10 class ProjectError : public VL_Base
11 {
12 public:
13     VUnicodeString                        Path;
14     VUnicodeString                        Message;
15 };
16 
17 class ProjectFile : public VL_Base
18 {
19 public:
20     typedef VL_AutoPtr<ProjectFile>                    Ptr;
21 
22     class CodeBlock : public VL_Base
23     {
24     public:
25         typedef VL_AutoPtr<CodeBlock>                Ptr;
26         typedef VL_List<Ptr , false , CodeBlock*>    List;
27 
28         VUnicodeString                    CodeBase;
29         VL_List<VUnicodeString , false>    CodePaths;
30     };
31 
32     VL_List<VUnicodeString , false>        InheritPaths;
33     VUnicodeString                        OutputPath;
34     VUnicodeString                        ReportPath;
35     CodeBlock::List                        Codes;
36 
37     void                                Load(VUnicodeString Path);
38     void                                LoadCombined(VUnicodeString Path);
39     void                                Save(VUnicodeString Path);
40 };
41 
42 #endif

    實現(xiàn)文件:
  1 #include "ProjectFile.h"
  2 #include "..\..\..\Library\Data\VL_Stream.h"
  3 #include "..\..\..\Library\Data\VL_System.h"
  4 #include "..\..\..\Library\XML\VL_XML.h"
  5 
  6 using namespace vl::stream;
  7 using namespace vl::system;
  8 using namespace vl::xml;
  9 
 10 /*********************************************************************************************************
 11 事件
 12 *********************************************************************************************************/
 13 
 14 #define THROW_ERROR(MESSAGE)            \
 15     do{                                    \
 16         ProjectError Error;                \
 17         Error.Path=Path;                \
 18         Error.Message=MESSAGE;            \
 19         throw Error;                    \
 20     }while(0)
 21 
 22 void ProjectFile::Load(VUnicodeString Path)
 23 {
 24     try
 25     {
 26         VL_XMLDocument Document;
 27         VL_FileStream Stream(Path,VL_FileStream::vfomRead);
 28         if(!Stream.IsAvailable())
 29         {
 30             THROW_ERROR(L"工程文件\""+Path+L"\"不存在。");
 31         }
 32         Document.Load(&Stream);
 33 
 34         OutputPath=L"";
 35         ReportPath=L"";
 36         InheritPaths.Clear();
 37         Codes.Clear();
 38 
 39         if(Document.GetRootElement()->GetName()!=L"kfpProject")
 40         {
 41             THROW_ERROR(L"工程文件根節(jié)點必須是kfpProject。");
 42         }
 43 
 44         for(VInt i=0;i<Document.GetRootElement()->GetChildren().GetCount();i++)
 45         {
 46             VL_XMLElement* Element=Document.GetRootElement()->GetChildren()[i]->GetElement();
 47             if(Element)
 48             {
 49                 if(Element->GetName()==L"inherit")
 50                 {
 51                     InheritPaths.Add(Element->GetAttributeByName(L"path")->GetText());
 52                 }
 53                 else if(Element->GetName()==L"output")
 54                 {
 55                     if(OutputPath!=L"")
 56                     {
 57                         THROW_ERROR(L"output節(jié)點只能有一個。");
 58                     }
 59                     OutputPath=Element->GetAttributeByName(L"path")->GetText();
 60                 }
 61                 else if(Element->GetName()==L"report")
 62                 {
 63                     if(ReportPath!=L"")
 64                     {
 65                         THROW_ERROR(L"report節(jié)點只能有一個。");
 66                     }
 67                     ReportPath=Element->GetAttributeByName(L"path")->GetText();
 68                 }
 69                 else if(Element->GetName()==L"code")
 70                 {
 71                     CodeBlock::Ptr CurrentCode=new CodeBlock;
 72                     for(VInt j=0;j<Element->GetChildren().GetCount();j++)
 73                     {
 74                         VL_XMLElement* SubElement=Element->GetChildren()[j]->GetElement();
 75                         if(SubElement)
 76                         {
 77                             if(SubElement->GetName()==L"base")
 78                             {
 79                                 if(CurrentCode->CodeBase!=L"")
 80                                 {
 81                                     THROW_ERROR(L"base節(jié)點只能有一個。");
 82                                 }
 83                                 CurrentCode->CodeBase=SubElement->GetAttributeByName(L"path")->GetText();
 84                             }
 85                             else if(SubElement->GetName()==L"include")
 86                             {
 87                                 CurrentCode->CodePaths.Add(SubElement->GetAttributeByName(L"path")->GetText());
 88                             }
 89                             else
 90                             {
 91                                 THROW_ERROR(L"節(jié)點"+SubElement->GetName()+L"沒有定義。");
 92                             }
 93                         }
 94                     }
 95                     Codes.Add(CurrentCode);
 96                 }
 97                 else
 98                 {
 99                     THROW_ERROR(L"節(jié)點"+Element->GetName()+L"沒有定義。");
100                 }
101             }
102         }
103     }
104     catch(const VL_XMLError& XMLError)
105     {
106         THROW_ERROR(L"XML格式錯誤:"+XMLError.Message);
107     }
108 }
109 
110 void ProjectFile::LoadCombined(VUnicodeString Path)
111 {
112     VL_List<ProjectFile::Ptr , false , ProjectFile*>    Projects;
113     VL_List<VUnicodeString , false>                        ProjectPaths;
114     VL_List<VUnicodeString , false>                        ToLoadPaths;
115     ToLoadPaths.Add(Path);
116 
117     while(ToLoadPaths.GetCount())
118     {
119         VUnicodeString CurrentPath=ToLoadPaths.Fetch(0);
120         ProjectPaths.Insert(0,CurrentPath);
121         ProjectFile::Ptr Project=new ProjectFile;
122         Project->Load(CurrentPath);
123         Projects.Insert(0,Project);
124         for(VInt i=0;i<Project->InheritPaths.GetCount();i++)
125         {
126             VUnicodeString InheritPath=VFileName(CurrentPath).GetPath().MakeAbsolute(Project->InheritPaths[i]).GetStrW();
127             if(!ToLoadPaths.Exists(InheritPath) && !ProjectPaths.Exists(InheritPath))
128             {
129                 ToLoadPaths.Add(InheritPath);
130             }
131         }
132     }
133 
134     OutputPath=L"";
135     ReportPath=L"";
136     InheritPaths.Clear();
137     Codes.Clear();
138 
139     VUnicodeString CodeBase;
140     CodeBlock::Ptr UniqueCode=new CodeBlock;
141     Codes.Add(UniqueCode);
142 
143     for(VInt i=0;i<Projects.GetCount();i++)
144     {
145         ProjectFile::Ptr Project=Projects[i];
146         if(Project->OutputPath!=L"")
147         {
148             OutputPath=VFileName(ProjectPaths[i]).GetPath().MakeAbsolute(Project->OutputPath).GetStrW();
149         }
150         if(Project->ReportPath!=L"")
151         {
152             ReportPath=VFileName(ProjectPaths[i]).GetPath().MakeAbsolute(Project->ReportPath).GetStrW();
153         }
154         for(VInt j=0;j<Project->Codes.GetCount();j++)
155         {
156             CodeBlock::Ptr CurrentCode=Project->Codes[j];
157             if(CurrentCode->CodeBase!=L"")
158             {
159                 CodeBase=VFileName(ProjectPaths[i]).GetPath().MakeAbsolute(CurrentCode->CodeBase).GetStrW();
160             }
161             else
162             {
163                 CodeBase=ProjectPaths[i];
164             }
165 
166             for(VInt k=0;k<CurrentCode->CodePaths.GetCount();k++)
167             {
168                 VUnicodeString CodePath=VFileName(CodeBase).GetPath().MakeAbsolute(CurrentCode->CodePaths[k]).GetStrW();
169                 UniqueCode->CodePaths.Add(CodePath);
170             }
171         }
172     }
173 }
174 
175 void ProjectFile::Save(VUnicodeString Path)
176 {
177     try
178     {
179         VL_XMLDocument Document;
180         Document.GetRootElement()->SetName(L"kfpProject");
181         for(VInt i=0;i<InheritPaths.GetCount();i++)
182         {
183             Document.GetRootElement()->CreateElement(L"inherit")->GetElement()->CreateAttribute(L"path",InheritPaths[i]);
184         }
185         if(OutputPath!=L"")
186         {
187             Document.GetRootElement()->CreateElement(L"output")->GetElement()->CreateAttribute(L"path",OutputPath);
188         }
189         if(ReportPath!=L"")
190         {
191             Document.GetRootElement()->CreateElement(L"report")->GetElement()->CreateAttribute(L"path",ReportPath);
192         }
193         for(VInt i=0;i<Codes.GetCount();i++)
194         {
195             CodeBlock::Ptr CurrentCode=Codes[i];
196             VL_XMLElement* CodeElement=Document.GetRootElement()->CreateElement(L"code")->GetElement();
197             if(CurrentCode->CodeBase!=L"")
198             {
199                 CodeElement->CreateElement(L"base")->GetElement()->CreateAttribute(L"path",CurrentCode->CodeBase);
200             }
201             for(VInt j=0;j<CurrentCode->CodePaths.GetCount();j++)
202             {
203                 CodeElement->CreateElement(L"include")->GetElement()->CreateAttribute(L"path",CurrentCode->CodePaths[j]);
204             }
205         }
206         VL_FileStream Stream(Path,VL_FileStream::vfomWrite);
207         Document.Save(&Stream,true);
208     }
209     catch(const VL_XMLError& XMLError)
210     {
211         THROW_ERROR(L"XML格式錯誤:"+XMLError.Message);
212     }
213 }
posted on 2008-12-24 05:20 陳梓瀚(vczh) 閱讀(1801) 評論(1)  編輯 收藏 引用 所屬分類: 腳本技術

評論:
# re: Kernel FP 編譯器MakeFile開發(fā)完成 2008-12-24 06:06 | 123
哇哇哇。。。更新夠快的Y。。。神神。。。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成网站影音先锋播放| 欧美大尺度在线观看| 日韩视频免费观看高清在线视频 | 亚洲一区欧美| 99国产精品久久久久老师| 欧美性jizz18性欧美| 久久精品欧美日韩| 久久蜜桃精品| 亚洲天堂av图片| 欧美在线一二三区| 亚洲片在线资源| 亚洲欧美国产制服动漫| 国产亚洲福利社区一区| 亚洲电影av在线| 国产精品一区二区在线| 免费日韩av电影| 国产精品激情av在线播放| 久久男人av资源网站| 欧美成人免费播放| 欧美在线亚洲在线| 欧美激情按摩在线| 久久久久久一区| 欧美日韩在线影院| 卡一卡二国产精品| 国产精品大全| 亚洲高清精品中出| 国产欧美一区二区精品性| 欧美激情1区| 国产午夜久久| 99精品视频免费| 在线免费观看日韩欧美| 亚洲一区二区三区免费观看| 亚洲欧洲精品一区| 香蕉成人啪国产精品视频综合网| 亚洲精品欧美在线| 久久精品亚洲| 欧美在线二区| 国产精品久久久久久久久免费樱桃 | 日韩网站免费观看| 久久精品中文| 欧美在线www| 欧美日韩免费精品| 欧美激情麻豆| 在线看国产日韩| 性做久久久久久免费观看欧美 | 国产精品一区二区久久精品| 欧美韩日精品| 亚洲福利视频网| 久久精品免视看| 久久久www成人免费精品| 久久精品人人做人人综合| 一区二区三区视频在线观看| 一本久久综合亚洲鲁鲁| 红桃视频欧美| 久久综合色婷婷| 女人色偷偷aa久久天堂| 国产精品视频观看| 亚洲精品少妇| 快射av在线播放一区| 香蕉久久夜色精品国产| 国产一区二区三区奇米久涩 | 久久久在线视频| 久久综合九色99| 久久一区精品| 在线观看精品一区| 美女久久一区| 亚洲国产精品一区二区www在线 | 欧美电影免费观看高清完整版| 久久综合九色欧美综合狠狠| 伊人久久婷婷色综合98网| 久久久久国产成人精品亚洲午夜| 久久免费视频网| 亚洲国产黄色片| 欧美精品一区二区三区蜜桃| 亚洲激情女人| 亚洲一区二区三区视频| 国产片一区二区| 久久精品一区四区| 欧美成人午夜| 亚洲视频免费在线| 国产欧美日本一区视频| 久久久噜噜噜久噜久久| 最新中文字幕亚洲| 亚洲欧美在线观看| 在线欧美日韩| 欧美日本在线播放| 亚洲欧美www| 欧美成人精品h版在线观看| 99av国产精品欲麻豆| 国产精品天天看| 久久婷婷色综合| 99香蕉国产精品偷在线观看| 欧美亚洲视频一区二区| …久久精品99久久香蕉国产| 欧美日韩免费高清| 久久aⅴ国产欧美74aaa| 亚洲人www| 欧美一区二区三区在线播放| 亚洲欧洲精品一区二区| 国产精品免费网站| 久久久亚洲午夜电影| 一本色道久久| 亚洲成人直播| 久久精品国产999大香线蕉| 亚洲精品中文字幕在线观看| 国产欧美日韩麻豆91| 欧美精品一卡二卡| 久久久久成人精品免费播放动漫| 日韩亚洲不卡在线| 欧美高清在线| 久久久久久久激情视频| 亚洲——在线| 99视频一区二区| 亚洲国产精品123| 国产亚洲午夜| 国产精品亚洲激情| 欧美日韩人人澡狠狠躁视频| 久久在线免费观看视频| 欧美一二区视频| 制服诱惑一区二区| 亚洲免费精品| 亚洲精品美女在线观看播放| 免费不卡视频| 开心色5月久久精品| 久久久噜噜噜久久人人看| 亚洲一区在线直播| 一区二区三区国产在线观看| 亚洲免费久久| 亚洲欧洲三级| 亚洲精品乱码久久久久| 亚洲大胆视频| 亚洲国产精品123| 亚洲国产三级在线| 亚洲高清免费视频| 在线观看国产日韩| 亚洲国产欧美一区二区三区丁香婷| 国产一区观看| 一区在线视频| 亚洲成色精品| 99国产一区| 亚洲深夜影院| 午夜精品免费| 久久精品视频在线看| 久久精品国产91精品亚洲| 久久久久久久波多野高潮日日 | 久久久精品免费视频| 久久久999| 久久综合婷婷| 亚洲国产成人精品女人久久久 | 久久精品国产亚洲精品 | 日韩午夜av电影| 中文在线资源观看视频网站免费不卡| 日韩五码在线| 午夜国产精品影院在线观看 | 91久久精品一区| 一区二区三区**美女毛片| 午夜久久黄色| 久久午夜羞羞影院免费观看| 欧美va天堂| 99re66热这里只有精品3直播| 99国产精品99久久久久久| 亚洲一区二区伦理| 久久久青草婷婷精品综合日韩 | 午夜国产一区| 免费成人av在线看| 国产精品jizz在线观看美国 | 国产精品第2页| 国内精品一区二区| 妖精成人www高清在线观看| 亚洲欧美在线免费| 欧美成年人视频| 亚洲深夜福利| 免费久久精品视频| 国产欧美精品日韩精品| 最近看过的日韩成人| 欧美亚洲免费| 亚洲国内高清视频| 性欧美大战久久久久久久免费观看 | 亚洲一区二区欧美日韩| 久久久精品动漫| 国产精品国产三级国产普通话99| 国产午夜精品全部视频播放| 99riav国产精品| 免费成人黄色片| 亚洲尤物视频网| 欧美精品一二三| 亚洲福利小视频| 久久久久久久久久看片| 99成人在线| 欧美激情视频在线播放| 黄色亚洲在线| 欧美一区二区视频在线| 日韩亚洲欧美一区| 麻豆精品视频在线观看| 国产丝袜一区二区| 亚洲欧美日本日韩| 亚洲免费观看高清在线观看| 老鸭窝毛片一区二区三区 | 欧美激情精品久久久久久变态| 国产综合在线看|