小编pt3*_*Nyc的帖子

boost :: spirit :: qi关键字和标识符

我已经看过一些与qi语法中关键字/标识符使用细微差别相关的帖子,但是我无法理解在boost示例中演示的方法应该如何工作......

关键词声明:

qi::symbols<char> keywords;
Run Code Online (Sandbox Code Playgroud)

示例关键字集:

keywords.add
        ("foo")
        ("bar")
        ;
Run Code Online (Sandbox Code Playgroud)

标识符规则声明:

qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier;
Run Code Online (Sandbox Code Playgroud)

以下是qi calc和编译器示例中定义标识符规则的方法:

identifier = !keywords >> qi::raw[ qi::lexeme[ ( qi::alpha | '_' ) >> *( qi::alnum | '_' ) ] ];
Run Code Online (Sandbox Code Playgroud)

也许我正在阅读qi语法错误,但在我看来,这不会接受任何匹配或关键字开头的文字.拒绝完整关键字匹配是所需的行为.但是,我想接受"食物"作为标识符,即使它以关键字"foo"开头.这似乎是一个非常标准的用例,但无法找到真正指出这一点的文档.

任何人都可以提供仅拒绝与关键字完全匹配的标识符规则吗?

谢谢!

c++ boost boost-spirit boost-spirit-qi

5
推荐指数
1
解决办法
578
查看次数

矩阵向量 cwiseProduct 操作的 Eigen3 replicate()

我有以下代码:

Eigen::MatrixXf aMatrix( 3, 5 );
aMatrix <<
1, 0, 1, 0, 1,
0, 1, 0, 1, 0,
1, 1, 1, 1, 1;

Eigen::VectorXf aVector( 5 );
aVector << 3, 4, 5, 6, 7;

cout << aMatrix.cwiseProduct( aVector.replicate( 1, aMatrix.rows() ).transpose() ) << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

3 0 5 0 7
0 4 0 6 0
3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)

有没有比使用replicate()调用更有效的方法来实现这一目标?

c++ matrix-multiplication eigen eigen3

4
推荐指数
1
解决办法
1604
查看次数

在可变参数宏中分配参数

我想构造一个宏,它接受可变数量的参数,并以类似于下面示例的格式将第一个参数分配给每个后续参数:

Call:   MACRO(F,A)
Result: F:A

Call:   MACRO(F,A,B,C)
Result: F:A F:B F:C
Run Code Online (Sandbox Code Playgroud)

我见过https://github.com/swansontec/map-macro和递归的一般概念解决方法:

#define EVAL0(...) __VA_ARGS__
#define EVAL1(...) EVAL0 (EVAL0 (EVAL0 (__VA_ARGS__)))
#define EVAL2(...) EVAL1 (EVAL1 (EVAL1 (__VA_ARGS__)))
#define EVAL3(...) EVAL2 (EVAL2 (EVAL2 (__VA_ARGS__)))
#define EVAL4(...) EVAL3 (EVAL3 (EVAL3 (__VA_ARGS__)))
#define EVAL(...)  EVAL4 (EVAL4 (EVAL4 (__VA_ARGS__)))
Run Code Online (Sandbox Code Playgroud)

但是,我无法解决如何将此问题应用于我的问题.任何人都可以提供一个例子来实现上面显示的结果吗?谢谢!

c c++ c-preprocessor variadic-macros

3
推荐指数
1
解决办法
916
查看次数

Boost Spirit Qi - 使用两个组件序列列出解析

我正在尝试为参数列表编写一个解析器,这将允许以下内容:

myFunc( arg0, arg1, namedArg0 = valueA, namedArg1 = valueB )
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我希望前两个参数解析为TypeA的实体,然后由std :: vector <TypeA>包含.后两个参数将解析为TypeB,它将由std :: vector <TypeB>包含.所有TypeA参数都应该在所有TypeB参数之前.但是我想从一个以逗号分隔的列表中解析所有内容.应该可以只有TypeA参数,只有TypeB参数或TypeA元素序列,后跟一系列TypeB元素.

我无法定义规则,以便将最终的TypeA参数与第一个TypeB参数分开的逗号不会被误认为是另一个TypeA参数的期望.

我目前的实施情况如下.任何人都可以就如何解决这个问题提出任何建议吗?

这里的关键区别是TypeA参数应该是单个符号,而TypeB参数应采用以下形式:symbol = symbol.

问题似乎与TypeA参数等同于TypeB参数的第一部分这一事实有关,因此使得TypeA序列的结尾不清楚?

谢谢!

struct Params
{
    std::vector<TypeA> a_elements;
    std::vector<TypeB> b_elements;

    Params(const std::vector<TypeA>& a_vec, const std::vector<TypeB>& b_vec)
    : a_elements( a_vec ), b_elements( b_vec ) {}

    static Params create(const std::vector<TypeA>& a_vec, const std::vector<TypeB>& b_vec)
    {
        return Params( a_vec, b_vec );
    }
};

struct ParamsParser : qi::grammar<Iterator, Params(), Skipper>
{
    qi::rule<Iterator, Params(), Skipper>                           start_rule;
    qi::rule<Iterator, std::vector<TypeA>(), Skipper>               type_a_vec_opt_rule;
    qi::rule<Iterator, std::vector<TypeB>(), Skipper> …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit

3
推荐指数
1
解决办法
96
查看次数