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"?
我正在尝试创建用于解析 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"?