我已经看过一些与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"开头.这似乎是一个非常标准的用例,但无法找到真正指出这一点的文档.
任何人都可以提供仅拒绝与关键字完全匹配的标识符规则吗?
谢谢!
我有以下代码:
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()调用更有效的方法来实现这一目标?
我想构造一个宏,它接受可变数量的参数,并以类似于下面示例的格式将第一个参数分配给每个后续参数:
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)
但是,我无法解决如何将此问题应用于我的问题.任何人都可以提供一个例子来实现上面显示的结果吗?谢谢!
我正在尝试为参数列表编写一个解析器,这将允许以下内容:
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)