2009-01-28 26 views
8

Tôi có một số chức năng trong chương trình của tôi trông như thế này:Làm C++ ứng dụng kịch bản

void foo(int x, int y) 

Bây giờ tôi muốn chương trình của tôi để có một chuỗi trông giống như:

foo(3, 5) 

Và thực hiện chức năng tương ứng. Cách đơn giản nhất để thực hiện điều này là gì?

Khi tôi nói đơn giản, tôi có nghĩa là mở rộng hợp lý và thanh lịch, nhưng không nên mất quá nhiều thời gian để mã hóa.

Edit:

Trong khi sử dụng một ngôn ngữ kịch bản thực sự sẽ tất nhiên giải quyết vấn đề của tôi, tôi vẫn muốn biết nếu có một cách nhanh chóng để thực hiện điều này trong C tinh khiết ++.

Trả lời

5

Tôi cũng muốn đi cho câu trả lời bằng ngôn ngữ kịch bản.

Sử dụng C++ thuần túy, tôi có thể sử dụng trình tạo trình phân tích cú pháp, sẽ nhận các quy tắc mã thông báo và ngữ pháp, và cung cấp cho tôi mã C chính xác có thể phân tích cú pháp ngôn ngữ cuộc gọi chức năng đã cho và cung cấp cho tôi cây cú pháp cuộc gọi đó. flex có thể được sử dụng để mã hóa đầu vào và bison có thể được sử dụng để phân tích cú pháp mã thông báo và chuyển đổi chúng thành một cây cú pháp.Ngoài cách tiếp cận đó, cũng có thể sử dụng Boost Spirit để phân tích cú pháp ngôn ngữ cuộc gọi chức năng. Tôi chưa bao giờ sử dụng bất kỳ công cụ nào trong số này, nhưng đã làm việc trên các chương trình sử dụng chúng, do đó tôi phần nào biết những gì tôi sẽ sử dụng trong trường hợp tôi phải giải quyết vấn đề đó.

Đối với trường hợp rất đơn giản, bạn có thể thay đổi cú pháp của bạn như thế này:

func_name arg1, arg2 

Sau đó, bạn có thể sử dụng:

std::istringstream str(line); 
std::string fun_name; str >> fun_name; 
map[fun_name](tokenize_args(str)); 

Bản đồ sẽ là một

std::map<std::string, boost::function<void(std::vector<std::string>)> > map; 

nào sẽ được phổ biến với các chức năng ở đầu chương trình của bạn. tokenize_args sẽ chỉ tách các đối số và trả lại vectơ của chúng dưới dạng chuỗi. Tất nhiên, điều này rất nguyên thủy, nhưng tôi nghĩ nó hợp lý nếu tất cả những gì bạn muốn là một số cách để gọi một hàm (tất nhiên, nếu bạn muốn hỗ trợ kịch bản thực sự, cách tiếp cận này sẽ không đủ).

+0

Tôi sẽ tăng cường :: tinh thần, vì bạn sẽ tìm hiểu rất nhiều về các trình phân tích cú pháp và về lập trình meta mẫu. – lothar

8

Bạn có thể xem Lua.

+0

xem xét Lua - để làm GÌ ??? Trang đó gần với vô dụng để mô tả cách nhúng ngôn ngữ. Ngay cả trang 3 của hướng dẫn (http://www.lua.org/manual/5.1/manual.html#3) gần hơn nhưng không giúp OP. – jim

+0

"Sử dụng lua" đang trở thành phản ứng đầu gối đối với các câu hỏi tương tự. – artificialidiot

10

Bạn có thể nhúng Python khá đơn giản và điều đó sẽ cung cấp cho bạn cách thực sự mạnh mẽ, có thể mở rộng để viết chương trình của bạn. Bạn có thể sử dụng sau đây để dễ dàng (nhiều hơn hoặc ít hơn) tiếp xúc với C++ mã của bạn để Python:

cá nhân tôi sử dụng Boost Python và tôi hài lòng với nó, nhưng nó rất chậm để biên dịch và có thể khó gỡ lỗi.

+1

SWIG rất tốt và rất linh hoạt. – vrdhn

3

Như Daniel nói:

Script ngôn ngữ như Lua và Python sẽ là ngôn ngữ kịch bản sử dụng nhiều nhất để gắn kết lại với nhau C++ thư viện.

Bạn sẽ phải thêm giao diện tập lệnh vào ứng dụng C++ của mình. Việc xây dựng giao diện này rõ ràng phụ thuộc vào ngôn ngữ kịch bản mà bạn đã chọn.

1

Nếu bạn chỉ muốn gọi hàm bằng tên theo nghĩa đen, bạn có thể sử dụng các hàm liên kết cụ thể.

Trên các hệ điều hành tuân thủ POSIX (như Linux), bạn có thể sử dụng dlopen() và dlsym(). Bạn chỉ cần phân tích cú pháp chuỗi đầu vào và tìm ra tên hàm và đối số. Sau đó, bạn có thể yêu cầu trình liên kết tìm hàm theo tên bằng cách sử dụng dlsym().

Tuy nhiên, trên Windows, các chức năng này không khả dụng (trừ khi có một số môi trường POSIX xung quanh, như Cygwin). Nhưng bạn có thể sử dụng API Windows.

Bạn có thể có một cái nhìn ở đây để biết chi tiết về những điều này: http://en.wikipedia.org/wiki/Dynamic_loading

0

Hệ thống của bạn có phải "lấy chuỗi" không? Bạn có thể trưng ra các giao diện COM (hoặc CORBA, hoặc bất kỳ thứ gì) trên ứng dụng của bạn và có bất cứ thứ gì tạo ra các lệnh này gọi trực tiếp vào ứng dụng của bạn.

1

C++ Phản ánh [2] của Fabio Lombardelli cung cấp đầy đủ lại flection cho C++ thông qua các mẫu công nghệ lập trình meta-niques. Trong khi đó là hoàn toàn phù hợp với các tiêu chuẩn C++, nó đòi hỏi các lập trình viên để chú thích các lớp theo thứ tự forthem được phản chiếu

http://cppreflect.sourceforge.net/

nếu không bạn sẽ muốn có một bảng chức năng con trỏ băm tôi nghĩ rằng

2

CERN cung cấp CINT, một trình thông dịch C/C++ có thể được nhúng trong ứng dụng của bạn để cung cấp khả năng viết kịch bản.

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