我正在尝试用c ++制作玩具语言。我已经使用了boost语法,并希望解析器/词法分析器。这个想法是一种玩具语言,其中“一切都是对象”,如javascript和基于原型的继承的一些实现。我想知道如何在c ++中实现该语言的'object'类型。我看过引擎spidermonkey的源代码,但大部分是使用结构完成的,在后期阶段也变得更加复杂。由于结构或多或少等同于C ++中的类,我希望我可以使用stdlib本身进行管理。我想要的只是如何实现基本对象以及如何创建/修改/销毁属性。我试着看看V8,但它让我很困惑!
答案 0 :(得分:2)
让每个类都有指向父类的指针,并在<string,pointer_fun>
等STL容器中实现属性和方法,以便可以添加/删除动态方法。
然后你可以在obj中查找一个方法,如果没有那么跟随ptr到parent并在那里查找,直到你找到一个或失败的非存在方法。
对于属性,您可以使用模板将它们包装在STL容器中,以便它们共享一个共同的祖先,并且您可以存储像<string,property<type>* >
这样的指针,其中属性使得创建的类型继承自常见类型。
使用这种方法和一些运行时检查,你可以动态地支持任何东西,只需要清楚当你在一个对象中调用它时,哪个是方法的查找规则。
所以基本上你系统中的每个obj实例都可以是:
class obj{
type_class parent*;
string type;
std::map<string,pointer_fun> methods;
std::map<string,property_parent_class> properties;
}
并且构造函数/析构函数是具有特殊名称的常规方法 然后在obj创建中,您只需在type_objs中查找type_name,并将该类型的成员和属性复制到impl obj。
修改强>
关于函数对象,您可以使用从常用对象继承的functors来使用container_of_pointers方法。
对于列表,我创建了一个简单的类对象,例如在python中实现像__add__()
或__len__()
或__get__()
这样的方法,然后在解析语言时用{{1 }} list_obj[3]
检查它当然存在后。