【发布时间】:2014-03-24 11:47:52
【问题描述】:
假设我有这样的符号表:
struct jass_types : qi::symbols<char, jass_type> {
现在我想用它的父类型填充一个自定义声明的类型:
identifier %=
char_("a-zA-Z") >> -(*char_("a-zA-Z_0-9") >> char_("a-zA-Z0-9"))
;
type %=
lit("type") >> identifier >>
lit("extends") >> identifier[type_symbols.find(_1)]
结构如下:
BOOST_FUSION_ADAPT_STRUCT(
wc3lib::jass::jass_type,
(std::string, identifier)
(wc3lib::jass::jass_type*, parent)
)
如果在符号表中找不到“扩展”之后的标识符,我该如何编写将 0 存储到属性“父”中的代码,以及如何正确应对丢失的符号?
我的想法是制作类似的东西:
boost::variant<wc3lib::jass::jass_type*,std::string> parent
并根据是否在符号表中找到类型来填充指针或标识符,但之后我必须检测父级的类型信息。 另一种选择是将 0 存储为 parent 作为 Mentoined 并创建一个带有标识符信息的错误对象等。如果找不到符号,Boost 可能已经做了同样的事情???
编辑:
首先犯了使用 _2 而不是 _1 的错误,但它仍然不起作用,因为它显然需要一个 char* 值而不是 std::string,所以我添加了一个自定义函数:
inline jass_type* get_type_symbol(jass_types &types, const std::string &value) {
return types.find(value.c_str());
}
还有一个语义动作:
type =
lit("type") >> identifier >>
lit("extends") >> identifier[phoenix::bind(&get_type_symbol, ref(type_symbols), _1)]
;
但这种方式似乎仍然过于复杂,如果找不到符号,我无法解决正确的错误检测/标识符存储问题!
【问题讨论】:
标签: c++ parsing boost-spirit