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

标签 c++ compiler-construction scripting interpreter

我正在尝试用 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/

相关文章:

c++ - 创建一个具有默认构造函数的未初始化项目数组?

C 程序与共享库链接而不设置 LD_LIBRARY_PATH

scripting - 如何在Powershell上使用$字符作为字符串中的值?

windows - 如何使用 VBScript 读取文本文件?

c++ - 在使用 seekg 和 tellg 之前将数据流式传输到文件时出现奇怪的程序行为

c++ - C++17 std::shared_mutex 还不可用吗?

c++ - 在子类中重载虚函数

optimization - 编译器优化: Where/how can I get a feel for what the payoff is for different optimizations?

c++ - iPhone编译移植代码问题: sub class of template parameter base class inaccessible

ffmpeg - 使用去隔行提取每秒第一帧的脚本