【问题标题】:Error handling in Boost Spirit symbol tableBoost Spirit 符号表中的错误处理
【发布时间】: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


    【解决方案1】:

    你可以这样做:

    // simplified identifier rule exposes a `std::strirng`:
    qi::rule<It, std::string()> identifier = char_("a-zA-Z") >> *char_("a-zA-Z_0-9");
    
    struct jass_types : qi::symbols<char, jass_type*> {
            // ...
    };
    
    typedef boost::variant<jass_type*, std::string> jass_typeref;
    jass_types type_symbols;
    

    请注意,我使symbols&lt;&gt; 解析器直接返回指向jass_type 的指针。现在规则可以很简单:

    qi::rule<It, jass_typeref()> typeref_ = type_symbols | identifier;
    

    使用它,例如作为

    type %= "type" >> identifier >> "extends" >> typeref_;
    

    要提供默认值,您可以这样做

    type %= "type" >> identifier >> 
            ("extends" >> typeref_ | qi::attr(std::string("::object")));
    

    (假设所有类型最终扩展::object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多