2010-05-24 20 views
8

tôi sử dụng để sử dụng OpenC++ (http://opencxx.sourceforge.net/opencxx/html/overview.html) để thực hiện sinh mã như:Nguồn-to-nguồn khuôn khổ biên dịch muốn

Nguồn:

class MyKeyword A { 
    public: 
    void myMethod(inarg double x, inarg const std::vector<int>& y, outarg double& z); 
}; 

tạo:

class A { 
    public: 
    void myMethod(const string& x, double& y); 
    // generated method below: 
    void _myMehtod(const string& serializedInput, string& serializedOutput) { 
     double x; 
     std::vector<int> y; 
     // deserialized x and y from serializedInput 
     double z; 
     myMethod(x, y, z); 
    } 
}; 

Kiểu này tạo mã trực tiếp khớp với trường hợp sử dụng trong hướng dẫn của OpenC++ (http://www.csg.is.titech.ac.jp/~chiba/opencxx/tutorial.pdf) bằng cách viết một chương trình siêu cấp để xử lý "MyKeyword", "inarg" và "outarg" và performin g tạo mã. Tuy nhiên, OpenC++ là loại lỗi thời và không hoạt động, và trình tạo mã của tôi chỉ có thể hoạt động trên g ++ 3.2 và nó gây ra lỗi khi phân tích cú pháp các tệp tiêu đề của g ++ ở phiên bản cao hơn.

Tôi đã xem VivaCore nhưng không cung cấp cấu trúc nội dung để biên dịch chương trình cấp meta. Tôi cũng đang tìm kiếm LLVM, nhưng tôi không thể tìm thấy tài liệu hướng dẫn tôi làm việc trong việc sử dụng biên dịch nguồn của tôi. Tôi cũng biết về khung công tác biên dịch ROSE, nhưng tôi không chắc liệu nó có phù hợp với việc sử dụng của tôi hay không, và liệu bản nhị phân đầu cuối C++ độc quyền có thể được sử dụng trong một sản phẩm thương mại hay không.

Bất kỳ nhận xét và chỉ dẫn nào về hướng dẫn/giấy/tài liệu cụ thể đều được đánh giá cao.

+1

Bạn không thể sử dụng khung công tác Rose trong ngữ cảnh thương mại mà không nhận được giấy phép của riêng bạn cho giao diện người dùng của EDG. Dunno nếu Rose có phiên bản Windows. –

Trả lời

3

Tôi không biết về bất kỳ giải pháp nào sẵn sàng để sử dụng, nhưng bạn có thể tự xây dựng với một nỗ lực tương đối nhỏ. Một lựa chọn có thể là trình phân tích cú pháp của Elsa C++, một chút lỗi thời, nhưng dễ sử dụng và khá mở rộng. Một tùy chọn khác là giả mạo với các AST XML được sản xuất bởi Clang ++. Tôi đã sử dụng cả hai cách tiếp cận trong các kịch bản khác nhau.

+0

Cảm ơn tất cả vì đã cung cấp câu trả lời cho vấn đề. Elas và Clang ++ là thông tin rất hữu ích. –

+1

Clang là những gì tôi rất muốn giới thiệu. LLVM là quá xa xuống con đường trình biên dịch cho nhu cầu của bạn, nhưng Clang là ở đúng chỗ. –

+0

Trang web của Elsa dường như không có bất kỳ cập nhật nào kể từ khoảng năm 2005; nó tuyên bố cố gắng phân tích cú pháp C++ 2003. –

0

Bạn có biết thực tiễn về lập trình mẫu meta không? Nếu bạn chưa từng sử dụng nó trước đây, đó là ứng dụng của bộ tiền xử lý C++ để tạo ra các chương trình meta kỳ quặc mà cảm thấy giống LISP hơn C++. Ý tưởng cũng giống như trên - có một bước biên dịch trước tạo ra mã lặp lại dựa trên các đầu vào nhất định. Tuy nhiên, tất cả được thực hiện tại thời gian biên dịch (trong khi có vẻ như OpenC++ thực hiện một số thứ trong thời gian chạy).

Xem xét có vẻ như bạn sẵn sàng học cái mới bất kể, bạn có sẵn lòng sử dụng ngôn ngữ đó làm ngôn ngữ thay thế không?

Boost cung cấp thư viện sử dụng kỹ thuật này để cung cấp tuần tự hóa dễ dàng, như những gì bạn đã trình bày ở trên. From the tutorial in its manual:

///////////////////////////////////////////////////////////// 
// gps coordinate 
// 
// illustrates serialization for a simple type 
// 
class gps_position 
{ 
private: 
    friend class boost::serialization::access; 
    // When the class Archive corresponds to an output archive, the 
    // & operator is defined similar to <<. Likewise, when the class Archive 
    // is a type of input archive the & operator is defined similar to >>. 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & degrees; 
     ar & minutes; 
     ar & seconds; 
    } 
    int degrees; 
    int minutes; 
    float seconds; 
public: 
    gps_position(){}; 
    gps_position(int d, int m, float s) : 
     degrees(d), minutes(m), seconds(s) 
    {} 
}; 

int main() { 
    // create and open a character archive for output 
    std::ofstream ofs("filename"); 

    // create class instance 
    const gps_position g(35, 59, 24.567f); 

    // save data to archive 
    { 
     boost::archive::text_oarchive oa(ofs); 
     // write class instance to archive 
     oa << g; 
     // archive and stream closed when destructors are called 
    } 

    // ... some time later restore the class instance to its orginal state 
    gps_position newg; 
    { 
     // create and open an archive for input 
     std::ifstream ifs("filename"); 
     boost::archive::text_iarchive ia(ifs); 
     // read class state from archive 
     ia >> newg; 
     // archive and stream closed when destructors are called 
    } 
    return 0; 
} 
+0

Cảm ơn ý tưởng về cách sử dụng bộ tiền xử lý. Tuy nhiên, một số vấn đề di sản và tính tương thích giới hạn tôi thay đổi việc sử dụng hiện tại quá nhiều. –

1

Bạn có thể xem xét DMS Software Reengineering Toolkit của chúng tôi. DMS là nền tảng chung để phân tích cú pháp văn bản nguồn theo ngôn ngữ tùy ý thành cấu trúc dữ liệu trình biên dịch (AST, biểu tượng, biểu đồ dòng điều khiển, biểu đồ luồng dữ liệu tùy thuộc vào khoảng cách bạn lấy nó).

DMS là mục đích chung Source-to-source program transformation system. Bạn có thể áp dụng các chuyển đổi hướng mẫu hướng nguồn hoặc viết các phép biến đổi thủ tục (giống như OpenC++), và sau đó tạo lại văn bản nguồn có thể đồng bộ tương ứng với chương trình được chuyển đổi.

DMS được tham số hóa theo định nghĩa ngôn ngữ rõ ràng và xử lý C, C#, COBOL, Java, Python, javascript, Fortran.

Nó có đầy đủ C++ Front End xử lý nhiều phương ngữ thực của C++ (ANSI, GNU, MS), với tên đầy đủ và độ phân giải loại.DMS với đầu cuối C++ có thể thực hiện các phép biến đổi được điều khiển bởi "metaprogram" bên trong và trên nhiều đơn vị biên dịch. Nó đã được sử dụng trong sự tức giận để thực hiện tái tổ chức triệt để các hệ thống phần mềm C++, bao gồm cả việc nghiên cứu các phần mềm điện tử truyền thống lớn (xem các giấy tờ tại trang web), cuối cùng được sử dụng trong UAV.

DMS chạy trên Windows.

CHỈNH SỬA 2/3/2011: DMS có vẻ hoạt động tốt dưới Wine trên Linux và Solaris. Đang thử nghiệm cho DMS trên Wine dưới OSX.

CHỈNH SỬA 3/1/2011: DMS dường như cũng chạy dưới Wine cho OSX.

EDIT 2/21/2013: Mặt trước C++ xử lý ANSI C++ 11, cũng như các phiên bản MS và GNU của C++ 11.

EDIT 2/24/2015: Bây giờ xử lý C++ 14 trong ANSI, MS và GNU.