2010-03-10 42 views
9

Tôi hiện đang làm việc trên một dự án đang truy cập một phần cứng bằng cách sử dụng tấn vị trí bộ nhớ được mã hóa cứng. Những vị trí này có thể thay đổi dựa trên ý tưởng của kỹ sư điện, vì vậy tôi đang tìm cách tạo mã từ bản đồ bộ nhớ của bộ máy. Hãy nói rằng bản đồ là một tập tin văn bản đơn giản như:Có cách nào dễ dàng để tạo mã từ một tệp văn bản không?

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

Tôi muốn để tự động tạo mã (không IL) tương tự như:

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"); 
} 

Có ai có ý tưởng về các công cụ mà có thể làm nhiệm vụ này dễ dàng, hoặc dễ dàng hơn?

+0

Tôi không hiểu, tại sao bạn cần nhiều hơn StreamWriter? –

+0

Ví dụ trên khá ngây thơ. Tôi có một số loại khác nhau của các lớp địa chỉ và muốn xây dựng một số phân cấp; .e.g MachineMap.Arm1.Sensor1.Value vv –

Trả lời

4

Hãy xem khả năng tạo mã tích hợp của Visual Studio có tên là T4. Hoặc một tùy chọn khác có thể là sản phẩm thương mại như CodeSmith.

Có xem xét bài viết này từ Scott Hanselman:
T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret

+0

Bạn có biết nếu T4/CodeSmith cho phép bạn tạo mã từ một nguồn khác, ví dụ như một trang tính Excel? –

+0

Cảm ơn bạn đã liên kết Hanselman. Tôi đã nhìn vào T4, nhưng không hiểu rằng bạn về cơ bản có thể viết bất kỳ mã C# như là một phần của mẫu. Hướng dẫn này liên quan khá tốt đến những gì tôi đang cố gắng làm: http://aabs.wordpress.com/2008/06/26/state-machines-in-c-30-using-t4-templates/ –

0

Bạn có thể có thể đưa ra một DSL lựa chọn của bạn, và sau đó sử dụng M Grammar (một phần của Oslo) để phân tích nó.

0

Tương tự như đề xuất của Nick ở Oslo, StringTemplate là một cách khác để tạo mã nguồn dựa trên mẫu từ ngữ pháp được xác định rõ. Nó có một cổng C#, do đó, nó dễ dàng, đủ để sử dụng từ.

3

Sử dụng một biểu thức chính quy như thế này (sử dụng gvim hoặc vim):

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

này giải quyết được một phần phân tích chính. Sau đó, bạn nối các nội dung với các tệp đầu trang và chân trang:

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

Nếu bản đồ phức tạp hơn, hãy sử dụng công cụ để phân tích cú pháp ngữ pháp. Nếu không, nếu nó thực sự là đơn giản, tránh sử dụng một chiếc xe tăng cho một móng tay nhỏ như vậy.

+0

+1 Điều này và một số phản ánh để tạo động các đối tượng Addressable <> và bạn đã hoàn thành. – kenny

Các vấn đề liên quan