在boost :: spirit mini_c中实现“NOT”

时间:2010-08-28 16:36:16

标签: c++ boost boost-spirit

我尝试修改boost :: spirit的mini_c示例以匹配我现有的词汇表。

因此我添加了一个“不应该表现得相同”的运算符!“:

unary_expr =
        primary_expr
    |   ("NOT" > primary_expr           [op(op_not)]) // This does not work
    |   ('!' > primary_expr             [op(op_not)])
    |   ('-' > primary_expr             [op(op_neg)])
    |   ('+' > primary_expr)
    ;

我可以编译修改后的源代码,但是当我尝试执行它时,它无法解析。我该如何解决这个问题?

修改 由于我想访问外部变量,我进行了另一次修改,以便在编译时构建这些变量的列表:

identifier %=
    raw[lexeme[alpha >> *(alnum | '§' | '_' | '.' | '-' )]]
    ;
variable =
       identifier      [add_var(_1)]
    ;

其中add_var和identifier定义为

rule<Iterator, std::string(), white_space> identifier;
function<var_adder> add_var;

如果我不使用此修改,可以使用“NOT”。通过修改,使用“NOT”会生成解析错误。

编辑2: 以下条件表达式可以正常工作:

logical_expr =
    relational_expr
    >> *(  ("AND" > relational_expr     [op(op_and)])
        |   ("OR" > relational_expr     [op(op_or)])
        )
    ;

1 个答案:

答案 0 :(得分:2)

随着你的改变,小测试:

int main()
{
    return NOT 1;
}

成功解析并返回0。所以对我来说不明显的是什么对你不起作用。你能提供一个失败的输入例子吗?