我正在尝试用C ++创建一个简单的动态语言解释器。我希望能够声明动态类型数组,但我不确定如何将它们存储在C ++中的某个对象中。
在Ruby / Python中,我可以存储任何我想要的东西,但是在C ++中这样做的有效方法是什么?
(另外,如果某人有一个指向动态语言的简单开源词法分析器/解析器/解释器的链接,我会很感激链接)。
答案 0 :(得分:1)
您必须根据语言的语义推出一些自定义解决方案。例如,您可以使用boost::any
存储任何对象,但您将无法执行名称查找等。一些汇编程序的知识在这里很有用,因为你基本上是在模仿它。大多数人做的事情就像是
struct Object {
boost::any cppobject;
std::unordered_map<std::string, std::function<void(boost::any&, std::vector<boost::any>&)> funcs;
};
std::vector<Object> stuff;
用你的假设语言,你有类似的东西
stuff[0].hi();
然后你可以把它转换成类似
的东西std::vector<boost::any> args;
// fill args
stuff.at(0).funcs["hi"](stuff.at(0).cppobject, args);
// now args holds the result
很有可能进一步优化这个方案,但不要进一步概括它,因为它已经是最极端的。
答案 1 :(得分:0)
动态语言存储通用对象的方式是通过指针,你可以在C ++中做同样的事情。存储指向您在C ++类中定义的通用“对象”的指针,这是一种有效的方法。
答案 2 :(得分:0)
使用联合或动态分配公共基类型对象(并通过dynamic_cast或等效构造适当地向下转换它们)的替代方法是boost::variant,它允许您编写如下代码:
typedef boost::variant<int, float, char, std::string> LangType;
std::vector<LangType> langObjects;
如果你的设计允许这样的实现,那么它具有编译时安全的优点,并且避免了使用堆,虚函数和多态向下转换所造成的任何惩罚。