如何实现玩具语言的对象?

时间:2009-11-20 14:33:33

标签: c++ compiler-construction scripting interpreter

我正在尝试用c ++制作玩具语言。我已经使用了boost语法,并希望解析器/词法分析器。这个想法是一种玩具语言,其中“一切都是对象”,如javascript和基于原型的继承的一些实现。我想知道如何在c ++中实现该语言的'object'类型。我看过引擎spidermonkey的源代码,但大部分是使用结构完成的,在后期阶段也变得更加复杂。由于结构或多或少等同于C ++中的类,我希望我可以使用stdlib本身进行管理。我想要的只是如何实现基本对象以及如何创建/修改/销毁属性。我试着看看V8,但它让我很困惑!

1 个答案:

答案 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]检查它当然存在后。