如何为toy语言实现对象? 我正在尝试用C++制作玩具语言。我在语法中使用了boostspirit,希望在解析器/词法分析器中也使用了boostspirit。这个想法是一种玩具语言,其中“一切都是对象”,比如javascript和一些基于原型的继承实现。我想知道如何在C++中实现语言的“对象”类型。我看过engine spidermonkey的源代码,但大部分代码都是使用结构完成的,在后期也变得更加复杂。由于结构或多或少等价于C++中的类,所以我希望自己能够用STDLIB本身来管理。我想要的只是一个如何实现基本对象以及如何创建/修改/销毁属性的可靠想法。我试图看看V8,但它真的让我很困惑

如何为toy语言实现对象? 我正在尝试用C++制作玩具语言。我在语法中使用了boostspirit,希望在解析器/词法分析器中也使用了boostspirit。这个想法是一种玩具语言,其中“一切都是对象”,比如javascript和一些基于原型的继承实现。我想知道如何在C++中实现语言的“对象”类型。我看过engine spidermonkey的源代码,但大部分代码都是使用结构完成的,在后期也变得更加复杂。由于结构或多或少等价于C++中的类,所以我希望自己能够用STDLIB本身来管理。我想要的只是一个如何实现基本对象以及如何创建/修改/销毁属性的可靠想法。我试图看看V8,但它真的让我很困惑,c++,compiler-construction,scripting,interpreter,C++,Compiler Construction,Scripting,Interpreter,让每个类都有指向父类的指针,并在STL容器(如中实现属性和方法,以便您可以动态添加/删除方法。 然后,您可以只在obj中查找一个方法,如果没有,则按照ptr到父级并在那里查找,直到找到一个或失败的不存在的方法 对于属性,您可以使用一个模板将它们包装在STL容器中,以便它们共享一个共同的祖先,并且您可以存储类似的指针,其中属性使创建的类型从公共类型继承 通过这种方法和一些运行时检查,您可以动态地支持任何内容,只需在对象中调用方法时明确方法的查找规则 因此,系统中的每个obj实例基本上都可以是:

让每个类都有指向父类的指针,并在STL容器(如
中实现属性和方法,以便您可以动态添加/删除方法。
然后,您可以只在obj中查找一个方法,如果没有,则按照ptr到父级并在那里查找,直到找到一个或失败的不存在的方法

对于属性,您可以使用一个模板将它们包装在STL容器中,以便它们共享一个共同的祖先,并且您可以存储类似
的指针,其中属性使创建的类型从公共类型继承

通过这种方法和一些运行时检查,您可以动态地支持任何内容,只需在对象中调用方法时明确方法的查找规则

因此,系统中的每个obj实例基本上都可以是:

 class obj{
    type_class parent*;
    string type;
    std::map<string,pointer_fun> methods;
    std::map<string,property_parent_class> properties;
 }
类obj{
类型_类父*;
字符串类型;
std::map方法;
地图属性;
}
并使构造函数/析构函数成为具有特殊名称的普通方法。
然后在obj创建中,您可以在type_objs中查找type_name,并将成员和属性从该类型复制到impl obj

编辑: 关于函数对象,您可以使用从公共对象继承来使用容器指针方法。

对于列表,我会创建一个简单的类对象,它实现了类似python中的
\uuuu add\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo()
\uu len\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo()
之类的方法,然后在解析语言时用
列表对象[3]
方法[']当然,在检查它是否存在后。

如果函数本身是对象,如何实现?你能给我这些东西的主干吗?我有4种基本对象(数字、字符串、列表、函数),其中列表可以是所有四种类型的递归对象。列表的行为有点像玩具脚本的类。这就是我的想法!我只是把这个放在编辑上,不知道它是否会起作用。。!这只是一根脊梁,我还没试过呢//type class->为数据类type{public:std::string type_name;std::string get_type(void);void set_type(std::string&s);}//数据类->为对象模板类data{public:type uu type;T_udata;}//对象->保存数据及其方法模板类对象{public:std::map property;}有什么想法吗?