代码之家  ›  专栏  ›  技术社区  ›  RED SOFT ADAIR

在boost中实现“not”:spirit mini_c

  •  0
  • RED SOFT ADAIR  · 技术社区  · 15 年前

    我试图修改boost::spirit的迷你示例,以匹配我现有的词汇表。

    因此,我添加了一个运算符“not that should behave equal as”!:

    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)]
        ;
    

    其中,添加变量和标识符定义为

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

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

    编辑2: 但以下条件表达式确实有效:

    logical_expr =
        relational_expr
        >> *(  ("AND" > relational_expr     [op(op_and)])
            |   ("OR" > relational_expr     [op(op_or)])
            )
        ;
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   hkaiser    15 年前

    用你的零钱,小测试:

    int main()
    {
        return NOT 1;
    }
    

    成功分析并返回 0 . 所以我不清楚什么对你不起作用。您也可以提供一个失败的输入示例吗?