2010-03-10 84 views
9

我目前正在使用大量硬編碼內存位置訪問一個硬件的項目。這些位置可以根據電氣工程師的心血來改變,所以我希望從工程師的存儲器映射中生成代碼。比方說,地圖是一個簡單的文本文件,如:類似有沒有簡單的方法從文本文件生成代碼?

Name, Type, Address, Description 
Foo, int, A001, Foo integer variable 
Bar, float, A002, Bar float variable 

我想自動生成代碼(不是IL):

class MachineMap 
{ 
    /// <summary> 
    /// Foo integer variable 
    /// </summary> 
    public readonly Addressable<int> Foo = new Addressable<int>("A001"); 
    /// <summary> 
    /// Bar float variable 
    /// </summary> 
    public readonly Addressable<float> Bar = new Addressable<float>("A002"); 
} 

有沒有人對工具,將使這一任務的想法容易,還是更容易?

+0

我不明白,爲什麼你需要比StreamWriter更多? – 2010-03-10 20:43:45

+0

上面的例子很幼稚。我有許多不同類型的可尋址類,並希望構建一些層次結構; .e.g MachineMap.Arm1.Sensor1.Value等 – 2010-03-10 23:11:33

回答

4

看看Visual Studio的內置代碼生成能力,稱爲T4。 或者其他選項可能是商業產品,如CodeSmith

看一看這篇文章從斯科特Hanselman的:
T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret

+0

您知道T4/CodeSmith是否允許您從其他來源生成代碼,例如Excel工作表? – 2010-03-10 23:12:18

+0

感謝Hanselman鏈接。我在看T4,但沒有認識到你基本上可以編寫任何C#代碼作爲模板的一部分。本教程非常適合我嘗試做的事情:http://aabs.wordpress.com/2008/06/26/state-machines-in-c-30-using-t4-templates/ – 2010-03-10 23:19:08

0

你也許能夠工藝您選擇的DSL,然後用M Grammar(奧斯陸的一部分)來解析它。

0

與Nick的奧斯陸建議類似,StringTemplate是另一種從定義良好的語法創建基於模板的源代碼的方法。它有一個C#端口,因此使用.NET很容易。

3

使用正則表達式所示(使用gvimvim):

:%s/\(.*\), \(.*\), \(.*\), \(.*\)/public readonly Addressable<\2> \1 = new Addressable<\2>("\3")/g 

這解決了主要解析部分。然後您連接內容與頁眉和頁腳文件:

type header.txt converted.txt footer.txt > source.c 

如果地圖是比較複雜的,然後使用語法解析取得的工具。否則,如果真的如此簡單,請避免使用油箱來處理這麼小的指甲。

+0

+1 This和一些反射動態創建可尋址<>對象,你就完成了。 – kenny 2010-03-10 19:37:13

相關問題