在语义操作中发现错误时停止解析器

时间:2011-03-30 13:55:04

标签: c++ boost boost-spirit

我希望在语义操作代码发现问题时停止令牌解析器。

  

IF x> 10

在语法上是正确的,但如果x不存在,则解析器应该停止

语法规则和语义操作如下所示

    condition
        =   ( tok.identifier >> tok.oper_ >> tok.value )
            [
                boost::phoenix::bind( &cRuleKit::AddCondition, &myRulekit, 
                        boost::spirit::_1, boost::spirit::_2, boost::spirit::_3 )
            ]
        ;

所以现在我添加一个检查标识符

的存在
    condition
        =   ( tok.identifier[boost::bind(&cRuleKit::CheckIdentifier, &myRulekit, ::_1, ::_3 ) ] 
               >> tok.oper_ >> tok.value )
            [
                boost::phoenix::bind( &cRuleKit::AddCondition, &myRulekit,
                      boost::spirit::_1, boost::spirit::_2, boost::spirit::_3 )
            ]
        ;

这有效!

我对优雅并不感到激动。语法语法现在很难阅读,混合使用boost :: bind和boost :: phoenix :: bind非常混乱。

我该如何改进?我想从phoenix :: bind获取'hit'参数,以便我可以在cRuleKit :: AddCondition()中进行检查,因此保持语法和动作分离并避免使用boost :: bind。


答案是使用占位符_pass

    condition
        =   ( tok.identifier >> tok.oper_ >> tok.value )
            [
                boost::phoenix::bind( &cRuleKit::AddCondition, &myRulekit, 
                        boost::spirit::_pass, boost::spirit::_1, boost::spirit::_2, boost::spirit::_3 )
            ]
        ;

1 个答案:

答案 0 :(得分:8)

Spirit具有一个特殊的值,您可以在语义操作中使用它来使解析失败。它被称为_pass,您应该将其设置为false

从我的一些代码:

variable_reference_impl_[_pass = lookup_symbol_(_1, false)][_val = _1]

在这种情况下,lookup_symbol是一个Phoenix仿函数,如果找到符号则返回true,如果没有则返回false