boost::spirit::qi - 在语法结构中使用实例成员

boost::spirit::qi - Working with instance members in grammar struct

我正在尝试创建用于解析 RTF 文件的语法。在某些时候,我需要在语法范围内存储一些信息。我知道,我可以使用继承的属性,但这会降低可读性。

所以我问自己语法的实例成员变量是否可以解决我的问题,如果可以,我应该如何在我的语法中使用它们?

例如,我需要跟踪字符转换的活动代码页。在我的语法结构中使用 int codepage 是好习惯吗?

我进一步想要的是,调用一些函数来将状态变量放入和弹出堆栈。我想我会将状态信息组合在一个 RtfState class 中,我可以根据需要对其进行扩展。调用语法结构的成员函数的最佳方式是什么?

可以。只需使用 phx::bind:

的语义操作
namespace phx = boost::phoenix;
switch_cp = qi::int_ [ phx::bind(&MyGrammar::_codepage, this) = _1 ];

但是,请记住,这会破坏可重入性:如果相关规则可以嵌套,请不要使用它。


或者,调用方法如下所示:例如

switch_cp = qi::int_ [ phx::bind(&MyGrammar::push_codepage, this, _1) ];

reset_cp = qi::eps [ phx::bind(&MyGrammar::pop_codepage, this) ]

一般阅读:Boost Spirit: "Semantic actions are evil"?