gpt4 book ai didi

c++ - 如何为玩具语言实现对象?

转载 作者:太空狗 更新时间:2023-10-29 22:53:37 24 4
gpt4 key购买 nike

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

最佳答案

让每个类都有指向父类的指针并在 STL 容器中实现属性和方法,如 <string,pointer_fun>这样您就可以动态添加/删除方法。
然后你可以在 obj 中查找一个方法,如果不存在则跟随 ptr 到父级并在那里查找直到你找到一个或失败不存在的方法。

对于属性,您可以使用一个模板将它们包装在 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 方法。
对于列表,我会创建一个简单的类对象来实现像 __add__() 这样的方法。或 __len__()__get__()例如在 python 中,那么当你解析你要替换的语言时 list_obj[3]对于 your_list_obj.method['__get__']在检查它当然存在之后。

关于c++ - 如何为玩具语言实现对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com