Bison默认使用union来存储语义类型值。由于union不支持除指针,基元,数组和普通旧数据以外的字段,因此最终得到了指向shared_ptrs的原始指针,我必须手动释放...
虽然它有效,但它很丑陋且容易出错,我想用更好的东西替换它。 Here建议我可以使用YYSTYPE
宏来提供我自己的语义类型,它将取代union。然而,建议替换对我来说似乎太冗长了。
是否有一些示例或参考页面或任何其他建议可以帮助我编写更安全的野牛解析器?我不打算转换到其他解析器生成器。
答案 0 :(得分:2)
我使用的一种技术是#define YYSTYPE std::shared_ptr<Object>
,其中Object
是一个抽象基类,带有一个虚拟析构函数和大量虚函数,可以完成所有各种子类所需的操作。宾语。这有点令人讨厌的代码味道&#34;因为你有效地将对象指针向下转移到各个派生类指针。
只使用原始指针并确保正确清理并不是那么困难 - 每个操作都需要确保它清除它直接使用的规则所分配的所有指针(通过显式调用delete或将它们复制到$$
所以它拥有它们),但由于动作通常很小(它们通常只调用其他函数),这并不太难。然后,您只需使用%destructor
声明来确保正确清除错误后丢弃的内容。