在提升精神中将定界符传递给子规则
Passing delimiter to a child rule in boost spirit
这是我在此处提到的问题的延续
我想将该规则包装到另一个规则中,并在这样做时将列指令传递给子规则,但我不知道这样做的正确方法是什么。
下面是代码
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/struct.hpp>
#include <boost/fusion/include/nview.hpp>
///////////////////////////////////////////////////////////////////////////////
namespace client
{
struct BoxData
{
int num;
std::string datatype;
std::string dataname;
std::string inputicon;
};
struct Box
{
std::vector<BoxData> box_data;
};
typedef std::back_insert_iterator<std::string> iterator_type;
}
BOOST_FUSION_ADAPT_STRUCT(
client::BoxData,
// (int, num)
(std::string, datatype)
(std::string, dataname)
(std::string, inputicon)
)
BOOST_FUSION_ADAPT_STRUCT(
client::Box,
(std::vector<client::BoxData>, box_data)
)
///////////////////////////////////////////////////////////////////////////////
int main()
{
// some employees
std::vector<client::BoxData> const employees{
{25, "int", "sra_command", "fa fa-wrench"},
{26, "float", "swt_command", "fa fa-wrench"},
{27, "double", "msc_command", "fa fa-mobile"},
{28, "int", "sra_command", "fa fa-wrench"},
{29, "float", "swt_command", "fa fa-wrench"},
{30, "double", "msc_command", "fa fa-mobile"},
{31, "int", "sra_command", "fa fa-wrench"},
{32, "float", "swt_command", "fa fa-wrench"},
{33, "double", "msc_command", "fa fa-mobile"},
};
client::Box box;
///TODO prevent copying of the vector
box.box_data = employees;
// now print them all
std::string generated;
{
using namespace boost::spirit::karma;
using Sink = client::iterator_type;
using BoxDataAttr = client::BoxData;
using BoxAttr = client::Box;
rule<Sink, BoxDataAttr(),space_type> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";
rule<Sink , BoxAttr()> big_box = "<Start>" << *small_box << "<End>" ;
generate(Sink(generated),[big_box],box);
}
std::cout << generated << std::endl;
}
行中
rule<Sink , BoxAttr()> big_box = "<Start>" << *small_box << "<End>" ;
我想通过
columns(2, "delimiter\n")[small_box]
delimiter 以便将列分隔符应用于 small_box rule
.
因此预期输出变为
<Start><B>int<1>sra_command<2>fa fa-wrench<3><B>float<1>swt_command<2>fa fa-wrench<3>delimiter
<B>double<1>msc_command<2>fa fa-mobile<3><B>int<1>sra_command<2>fa fa-wrench<3>delimiter
<B>float<1>swt_command<2>fa fa-wrench<3><B>double<1>msc_command<2>fa fa-mobile<3>delimiter
<B>int<1>sra_command<2>fa fa-wrench<3><B>float<1>swt_command<2>fa fa-wrench<3>delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>delimiter<End>
最终,因为会有向量将另一个自定义分隔符传递给 big_box
规则。
背景
我打算编写一个诊断接口作为学习各种 C++ 概念的练习,其中涉及以下内容。
1.Parsing 来自 IDL 文件的数据。我还没有定义确切的格式,但看起来类似于
struct Data1
{
int command_one output "fa fa-wrench";
float commmand_two output "fa fa-sensor";
}
struct Data2
{
bool a input switch;
int b input progress_bar {0,100} ;
}
正在从 IDL 文件生成 HTML 元素。每个结构都包装在一个盒子中,盒子中包含它们内部的各个元素,这些元素位于带有 icons/optional 部分的较小盒子中。第 n 个分隔符对于生成用于在屏幕上放置这些框的 bootstrap 网格很有用。
使用 websocket 实现完成 HTML 页面,当收到包含 DOM 元素名称 - 值的 JSON 数据时自动更新 DOM 元素一对 。类似地,对于每个输入,执行发送命令以将其包装在 JSON 中并发送到 Web 服务器。
自动为网络服务器生成代码,这样唯一要实现的代码就是来自外部源的 receiving/transmitting 数据,所有转换都已生成 to/from JSON .
以下用例促使我寻找 parser/generator 解决方案。
我不太确定你的问题的原因,但在我看来昨天的解决方案成立:
rule<Sink, BoxDataAttr()> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";
rule<Sink, BoxAttr()> big_box = "<Start>" << columns(4, "delimiter\n") [small_box % eol] << "<End>" ;
generate(Sink(generated), big_box, employees);
版画
<Start><B>int<1>sra_command<2>fa fa-wrench<3>
<B>float<1>swt_command<2>fa fa-wrench<3>
delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>
<B>int<1>sra_command<2>fa fa-wrench<3>
delimiter
<B>float<1>swt_command<2>fa fa-wrench<3>
<B>double<1>msc_command<2>fa fa-mobile<3>
delimiter
<B>int<1>sra_command<2>fa fa-wrench<3>
<B>float<1>swt_command<2>fa fa-wrench<3>
delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>delimiter
<End>
凭直觉,您可能错过了 , space_type
作为 small_box
规则的分隔符这一事实。
Eventually since there would be vector which would pass another custom delimiter to the big_box rule.
此时我质疑你选择的工具。为什么不在这里滚动你自己的漂亮印刷品。我希望它会简单得多。另请阅读 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
奖金:
此处避免复制向量:
client::Box const employees { {
{25, "int", "sra_command", "fa fa-wrench"},
{26, "float", "swt_command", "fa fa-wrench"},
{27, "double", "msc_command", "fa fa-mobile"},
{28, "int", "sra_command", "fa fa-wrench"},
{29, "float", "swt_command", "fa fa-wrench"},
{30, "double", "msc_command", "fa fa-mobile"},
{31, "int", "sra_command", "fa fa-wrench"},
{32, "float", "swt_command", "fa fa-wrench"},
{33, "double", "msc_command", "fa fa-mobile"},
} };
更一般地说,移动语义可以服务于:
box.box_data = std::move(employees);
这是我在此处提到的问题的延续
我想将该规则包装到另一个规则中,并在这样做时将列指令传递给子规则,但我不知道这样做的正确方法是什么。
下面是代码
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/struct.hpp>
#include <boost/fusion/include/nview.hpp>
///////////////////////////////////////////////////////////////////////////////
namespace client
{
struct BoxData
{
int num;
std::string datatype;
std::string dataname;
std::string inputicon;
};
struct Box
{
std::vector<BoxData> box_data;
};
typedef std::back_insert_iterator<std::string> iterator_type;
}
BOOST_FUSION_ADAPT_STRUCT(
client::BoxData,
// (int, num)
(std::string, datatype)
(std::string, dataname)
(std::string, inputicon)
)
BOOST_FUSION_ADAPT_STRUCT(
client::Box,
(std::vector<client::BoxData>, box_data)
)
///////////////////////////////////////////////////////////////////////////////
int main()
{
// some employees
std::vector<client::BoxData> const employees{
{25, "int", "sra_command", "fa fa-wrench"},
{26, "float", "swt_command", "fa fa-wrench"},
{27, "double", "msc_command", "fa fa-mobile"},
{28, "int", "sra_command", "fa fa-wrench"},
{29, "float", "swt_command", "fa fa-wrench"},
{30, "double", "msc_command", "fa fa-mobile"},
{31, "int", "sra_command", "fa fa-wrench"},
{32, "float", "swt_command", "fa fa-wrench"},
{33, "double", "msc_command", "fa fa-mobile"},
};
client::Box box;
///TODO prevent copying of the vector
box.box_data = employees;
// now print them all
std::string generated;
{
using namespace boost::spirit::karma;
using Sink = client::iterator_type;
using BoxDataAttr = client::BoxData;
using BoxAttr = client::Box;
rule<Sink, BoxDataAttr(),space_type> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";
rule<Sink , BoxAttr()> big_box = "<Start>" << *small_box << "<End>" ;
generate(Sink(generated),[big_box],box);
}
std::cout << generated << std::endl;
}
行中
rule<Sink , BoxAttr()> big_box = "<Start>" << *small_box << "<End>" ;
我想通过
columns(2, "delimiter\n")[small_box]
delimiter 以便将列分隔符应用于 small_box rule
.
因此预期输出变为
<Start><B>int<1>sra_command<2>fa fa-wrench<3><B>float<1>swt_command<2>fa fa-wrench<3>delimiter
<B>double<1>msc_command<2>fa fa-mobile<3><B>int<1>sra_command<2>fa fa-wrench<3>delimiter
<B>float<1>swt_command<2>fa fa-wrench<3><B>double<1>msc_command<2>fa fa-mobile<3>delimiter
<B>int<1>sra_command<2>fa fa-wrench<3><B>float<1>swt_command<2>fa fa-wrench<3>delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>delimiter<End>
最终,因为会有向量将另一个自定义分隔符传递给 big_box
规则。
背景
我打算编写一个诊断接口作为学习各种 C++ 概念的练习,其中涉及以下内容。
1.Parsing 来自 IDL 文件的数据。我还没有定义确切的格式,但看起来类似于
struct Data1
{
int command_one output "fa fa-wrench";
float commmand_two output "fa fa-sensor";
}
struct Data2
{
bool a input switch;
int b input progress_bar {0,100} ;
}
正在从 IDL 文件生成 HTML 元素。每个结构都包装在一个盒子中,盒子中包含它们内部的各个元素,这些元素位于带有 icons/optional 部分的较小盒子中。第 n 个分隔符对于生成用于在屏幕上放置这些框的 bootstrap 网格很有用。
使用 websocket 实现完成 HTML 页面,当收到包含 DOM 元素名称 - 值的 JSON 数据时自动更新 DOM 元素一对 。类似地,对于每个输入,执行发送命令以将其包装在 JSON 中并发送到 Web 服务器。
自动为网络服务器生成代码,这样唯一要实现的代码就是来自外部源的 receiving/transmitting 数据,所有转换都已生成 to/from JSON .
以下用例促使我寻找 parser/generator 解决方案。
我不太确定你的问题的原因,但在我看来昨天的解决方案成立:
rule<Sink, BoxDataAttr()> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";
rule<Sink, BoxAttr()> big_box = "<Start>" << columns(4, "delimiter\n") [small_box % eol] << "<End>" ;
generate(Sink(generated), big_box, employees);
版画
<Start><B>int<1>sra_command<2>fa fa-wrench<3>
<B>float<1>swt_command<2>fa fa-wrench<3>
delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>
<B>int<1>sra_command<2>fa fa-wrench<3>
delimiter
<B>float<1>swt_command<2>fa fa-wrench<3>
<B>double<1>msc_command<2>fa fa-mobile<3>
delimiter
<B>int<1>sra_command<2>fa fa-wrench<3>
<B>float<1>swt_command<2>fa fa-wrench<3>
delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>delimiter
<End>
凭直觉,您可能错过了 , space_type
作为 small_box
规则的分隔符这一事实。
Eventually since there would be vector which would pass another custom delimiter to the big_box rule.
此时我质疑你选择的工具。为什么不在这里滚动你自己的漂亮印刷品。我希望它会简单得多。另请阅读 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
奖金:
此处避免复制向量:
client::Box const employees { {
{25, "int", "sra_command", "fa fa-wrench"},
{26, "float", "swt_command", "fa fa-wrench"},
{27, "double", "msc_command", "fa fa-mobile"},
{28, "int", "sra_command", "fa fa-wrench"},
{29, "float", "swt_command", "fa fa-wrench"},
{30, "double", "msc_command", "fa fa-mobile"},
{31, "int", "sra_command", "fa fa-wrench"},
{32, "float", "swt_command", "fa fa-wrench"},
{33, "double", "msc_command", "fa fa-mobile"},
} };
更一般地说,移动语义可以服务于:
box.box_data = std::move(employees);