- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每次检测到匹配项时,我都试图将数据结构插入到向量中,但我什至在编译时都失败了。接下来是代码:
#include <string>
#include <boost/xpressive/xpressive.hpp>
#include <boost/xpressive/regex_actions.hpp>
using namespace boost::xpressive;
struct Data
{
int integer;
double real;
std::string str;
Data(const int _integer, const double _real, const std::string& _str) : integer(_integer), real(_real), str(_str) { }
};
int main()
{
std::vector<Data> container;
std::string input = "Int: 0 - Real: 18.8 - Str: ABC-1005\nInt: 0 - Real: 21.3 - Str: BCD-1006\n";
sregex parser = ("Int: " >> (s1 = _d) >> " - Real: " >> (s2 = (repeat<1,2>(_d) >> '.' >> _d)) >> " - Str: " >> (s3 = +set[alnum | '-']) >> _n)
[::ref(container)->*push_back(Data(as<int>(s1), as<double>(s2), s3))];
sregex_iterator cur(input.begin(), input.end(), parser);
sregex_iterator end;
for(; cur != end; ++cur)
smatch const &what = *cur;
return 0;
}
编译“push_back”语义 Action 失败,因为我在内部使用了一个数据对象,它不能懒惰地使用它(我想,我不太确定)。
拜托,有人可以帮我解决这个问题吗?
注意 - 不幸的是,我使用的是 MS VS 2010(不完全符合 c++11),所以请不要使用可变参数模板和 emplace_back 解决方案。谢谢。
最佳答案
你应该让这个 Action 成为一个懒惰的 Actor 。您的 Data
构造函数调用不是。
#include <string>
#include <boost/xpressive/xpressive.hpp>
#include <boost/xpressive/regex_actions.hpp>
namespace bex = boost::xpressive;
struct Data {
int integer;
double real;
std::string str;
Data(int integer, double real, std::string str) : integer(integer), real(real), str(str) { }
};
#include <iostream>
int main() {
std::vector<Data> container;
std::string const& input = "Int: 0 - Real: 18.8 - Str: ABC-1005\nInt: 0 - Real: 21.3 - Str: BCD-1006\n";
using namespace bex;
bex::sregex const parser = ("Int: " >> (s1 = _d) >> " - Real: " >> (s2 = (repeat<1,2>(_d) >> '.' >> _d)) >> " - Str: " >> (s3 = +set[alnum | '-']) >> _n)
[bex::ref(container)->*bex::push_back(bex::construct<Data>(as<int>(s1), as<double>(s2), s3))];
bex::sregex_iterator cur(input.begin(), input.end(), parser), end;
for (auto const& what : boost::make_iterator_range(cur, end)) {
std::cout << what.str() << "\n";
}
for(auto& r : container) {
std::cout << "[ " << r.integer << "; " << r.real << "; " << r.str << " ]\n";
}
}
打印
Int: 0 - Real: 18.8 - Str: ABC-1005
Int: 0 - Real: 21.3 - Str: BCD-1006
[ 0; 18.8; ABC-1005 ]
[ 0; 21.3; BCD-1006 ]
我会为此使用 spirit 。 Spirit 具有直接解析为底层数据类型的原语,这样更不易出错且效率更高。
使用 Phoenix,它非常相似: Live On Coliru
使用 Fusion 适配,它变得更有趣,也更简单:
现在想象一下:
你会如何在 Xpressive 中做到这一点?这就是你如何使用 Spirit 来做到这一点。请注意,附加约束本质上是如何不改变语法的。将其与基于正则表达式的解析器进行对比。
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/struct.hpp>
namespace qi = boost::spirit::qi;
struct Data {
int integer;
double real;
std::string str;
};
BOOST_FUSION_ADAPT_STRUCT(Data, integer, real, str);
#include <iostream>
int main() {
std::vector<Data> container;
using It = std::string::const_iterator;
std::string const& input = "iNT: 0 - Real: 18.8 - Str: ABC-1005\n\nInt: 1-Real:21.3 -sTR:BCD-1006\n\n";
qi::rule<It, Data(), qi::blank_type> parser = qi::no_case[
qi::lit("int") >> ':' >> qi::auto_ >> '-'
>> "real" >> ':' >> qi::auto_ >> '-'
>> "str" >> ':' >> +(qi::alnum|qi::char_('-')) >> +qi::eol
];
It f = input.begin(), l = input.end();
if (parse(f, l, qi::skip(qi::blank)[*parser], container)) {
std::cout << "Parsed:\n";
for(auto& r : container) {
std::cout << "[ " << r.integer << "; " << r.real << "; " << r.str << " ]\n";
}
} else {
std::cout << "Parse failed\n";
}
if (f != l) {
std::cout << "Remaining input: '" << std::string(f,l) << "'\n";
}
}
静态打印
Parsed:
[ 0; 18.8; ABC-1005 ]
[ 1; 21.3; BCD-1006 ]
进一步思考:你会怎样
如果你可以使用 c++14,Spirit X3 会比 Spirit Qi 或 Xpressive 方法更高效,编译快很多:
#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/adapted/struct.hpp>
struct Data {
int integer;
double real;
std::string str;
};
BOOST_FUSION_ADAPT_STRUCT(Data, integer, real, str);
namespace Parsers {
using namespace boost::spirit::x3;
static auto const data
= rule<struct Data_, ::Data> {}
= no_case[
lit("int") >> ':' >> int_ >> '-'
>> "real" >> ':' >> double_ >> '-'
>> "str" >> ':' >> +(alnum|char_('-')) >> +eol
];
static auto const datas = skip(blank)[*data];
}
#include <iostream>
int main() {
std::vector<Data> container;
std::string const& input = "iNT: 0 - Real: 18.8 - Str: ABC-1005\n\nInt: 1-Real:21.3 -sTR:BCD-1006\n\n";
auto f = input.begin(), l = input.end();
if (parse(f, l, Parsers::datas, container)) {
std::cout << "Parsed:\n";
for(auto& r : container) {
std::cout << "[ " << r.integer << "; " << r.real << "; " << r.str << " ]\n";
}
} else {
std::cout << "Parse failed\n";
}
if (f != l) {
std::cout << "Remaining input: '" << std::string(f,l) << "'\n";
}
}
打印(越来越无聊):
Parsed:
[ 0; 18.8; ABC-1005 ]
[ 1; 21.3; BCD-1006 ]
关于boost - 如何使用 boost::xpressive 在语义操作中使用结构填充向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48918172/
我想在我的 C++ 作业中使用 Boost.Xpressive,并将其包含在我的源代码中。但是整个boost头文件有70MB+,那么有没有只包含依赖文件的独立xpressive发行版? 最佳答案 使用
我正在尝试解析一种自定义语言(与 JSON 不太相似),我决定尝试使用 boost expressive,因为它看起来很有趣。 但是,当表达匹配失败时,它就失败了。有什么办法可以实现某种错误报告吗?就
假设我有一个像这样的 sregex 对象: boost::xpressive::sregex::compile("(?P\\w+) (?\\w+)!"); 尽管 xpressive 支持命名组,但我无
我正在使用 boost::xpressive 来解析我的文本文件。我想看看是否仅当该行以“#”开头(多次)。 我正在使用下面的代码 std::string str1 = "## this could
每次检测到匹配项时,我都试图将数据结构插入到向量中,但我什至在编译时都失败了。接下来是代码: #include #include #include using namespace boost::
我在尝试使用 boost::xpressive 时收到一长串编译警告;特别是当我使用 sregex_compiler 的 compile() 函数时。 我关注了 documentation并将这个小程
我无法使用 regex_match 函数来查找不区分大小写的匹配项。尽管 boost::xpressive::regex_constants::icase 是 defined并且我使用了一个强制转换(
我有一个字符串可以是"/""+""."或描述性名称 我正在尝试弄清楚如何使用正则表达式来检查字符串是否与上面的 3 个特殊字符(/+ 或 .)中的任何一个匹配 读了一些书后,我决定采用 boost::
我注意到 boost xpressive sregex 分配中的奇怪行为。请参阅下面的代码。第一个不起作用的代码片段有 sregex 有对象初步分配,然后在主表达式中使用。第二个运行良好的代码片段没有
Edit8:我已经首先为可能遇到相同问题的人发布了解决方案。 解决方案: 使用 = 分配正则表达式,而不是调用 () 运算符。工作正常。那是愚蠢的。 #include #include #incl
嗨 boost::xpressive 用户, 尝试使用 boost::xpressive 解析某些决策树时出现堆栈溢出错误。它似乎适用于达到一定大小的树,但在“大”树上失败,其中“大”似乎意味着大约
我有以下代码。 sregex rex = sregex::compile( "(\\w+) (\\w+)!" ); 如何得到“(\w+) (\w+)!”从雷克斯出来? 最佳答案 查看 document
我有一个 boost xpressive sregex 和语义 Action 等同于以下内容: Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as(s
我尝试用出色的 Boost.XPressive 编写一个 mustache 解析器来自杰出的 Eric Niebler。但由于这是我的第一个解析器,我不熟悉编译器编写者的“正常”方法和行话,经过几天的
我想在 VC 2008 中使用正则表达式,但是我不能使用 boost 库(或者至少是整个 boost 库)。 我看到 boost.xpressive 中的文件正在使用其他 boost 目录中的文件。
我正在使用 boost.xpressive 静态模板构建动态连接成最终表达式的正则表达式。 动态版本有一个可变宽度的重复,但由于在 int vector 中操作,我确实需要使用静态结构。 我确实需要创
似乎 boost::xpressive 没有提供 new 运算符的惰性评估版本,所以这个语义操作不会编译: using namespace boost::xpressive ; std::vector
我想在 C++ 中做一些正则表达式,所以我查看了 interwebz(是的,我是 C++ 的初学者/中级)并发现 this SO answer . 我真的不知道在 boost::regex 和 boo
我认为 boost 正则表达式引擎会比 boost::algorithm 更快 这个简单的测试表明算法大大击败了正则表达式引擎 这是整个测试程序 我错过了什么吗? #include "boost/al
我们使用 boost::xpressive 在 C++/ObjC 应用程序中处理正则表达式。自从更新到 Mac OS 10.6 后,我们发现编译时间非常长(在 Dual-Quad MacPro 上每个
我是一名优秀的程序员,十分优秀!