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 đủ).
Nguồn
2009-01-28 13:14:34
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