- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想解析以下字符串:id=1;entry1=[A,B,D];entry2=[bla,blubb];factor=[1,5]!
我的解析器:
struct Entry
{
uint32_t id;
std::vector< std::string > entry1;
std::vector< std::string > entry2;
bool useFactor;
std::pair<int, int> factor;
};
BOOST_FUSION_ADAPT_STRUCT( Entry, id, entry1, entry2, useFactor, factor)
template<typename It>
struct testParser : qi::grammar<It, Entry()>
{
testParser : testParser::base_type(start)
{
using namespace qi;
id_ %= lit("id=") >> int_ ;
entry1_ %= lit("entry1=") >> char_('[') >> +(char_ -char_(']') % ',') >> char_(']');
entry2_ %= lit("entry1=") >> char_('[') >> +(char_ -char_(']') % ',') >> char_(']');
factor %= lit("factor=") >> char_('[') >> int_ >> char_(',') >> int_ >> char_(']');
start = id >> ';' >> entry1 >> ';' >> entry2 >> (( ';' >> factor[ phx::bind(&Entry::useFactor,_1) = true;] ) >> '!') | '!';
qi::rule<It, Entry()> start;
qi::rule<It, int()> id;
qi::rule<It, std::vector<std::string>()> entry1_, entry2_;
qi::rule<It, std::pair<int,int>()> factor;
}
};
我收到非常大的编译错误消息。我认为这是因为 entry1 和 entry2 规则(字符串插入 vector )
最佳答案
正如您可能在直播中看到的那样,我逐步修正了语法。
其中有很多“你喝醉了”的时刻,所以我不确定我能否在这里捕捉到散文中的基本步骤。无论如何,有 a look at the recorded stream¹ .
一些重要的注释(忽略随机拼写错误和明显混淆的代码):
attr(v)
简单地公开一个属性(在本例中为 attr(true)
)lit('c')
、lit("abc")
或仅使用 'c'
和 "abc"
匹配文字字符(字符串)无需捕获其内容%=
语义在主题解析器成功后运行(并且只有当场成功)。
因此,即使您应该/应该从语义操作中设置 useFactor
成员,它也只会在 factor
部分存在(和不确定值)的情况下运行否则将被留下)。
格式化很重要。
可选:
BOOST_SPIRIT_DEBUG*
调试规则as_vector
破解快速打印结果的方法entry1
和 entry2
entry
规则
未显示:
no_case
来...不区分大小写lexeme
以避免在跳过的输入字符之间匹配关键字工作代码,作为 SSCCE :
#define BOOST_SPIRIT_DEBUG
#include <iostream>
#include <vector>
namespace std {
template <typename T>
static ostream& operator<<(ostream& os, vector<T> const& v) {
os << "vector{ ";
for(auto& e : v)
os << "'" << e << "', ";
return os << "}";
}
template <typename T, typename U>
static ostream& operator<<(ostream& os, pair<T,U> const& p) {
return os << "pair{ '" << p.first << "', '" << p.second << "' }";
}
}
#include <boost/fusion/adapted/struct.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
struct Entry
{
uint32_t id;
std::vector<std::string> entry1;
std::vector<std::string> entry2;
bool useFactor;
std::pair<int, int> factor;
};
BOOST_FUSION_ADAPT_STRUCT(Entry, id, entry1, entry2, useFactor, factor)
template<typename It>
struct testParser : qi::grammar<It, Entry()>
{
testParser() : testParser::base_type(start)
{
using namespace qi;
id = "id=" >> int_;
entry = lit(_r1) >> ('[' >> +~char_("],") % ',' >> ']');
factor = "factor=" >> ('[' >> int_ >> ',' >> int_ >> ']');
start =
id >> ';'
>> entry(+"entry1=") >> ';'
>> entry(+"entry2=") >> ';'
>> attr(true)
>> (factor | attr(std::pair<int,int>{1,1}))
>> '!';
BOOST_SPIRIT_DEBUG_NODES((start)(entry)(id)(factor))
#if 0
#endif
}
private:
qi::rule<It, Entry()> start;
qi::rule<It, int()> id;
qi::rule<It, std::vector<std::string>(std::string)> entry;
qi::rule<It, std::pair<int,int>()> factor;
};
int main() {
std::string const input = "id=1;entry1=[A,B,D];entry2=[bla,blubb];factor=[1,5]!";
using It = std::string::const_iterator;
testParser<It> g;
It f = input.begin(), l = input.end();
Entry entry;
bool ok = qi::parse(f, l, g, entry);
std::cout << std::boolalpha;
if (ok) {
std::cout << "Parsed: " << boost::fusion::as_vector(entry) << "\n";
} else {
std::cout << "Parse failed\n";
}
if (f!=l)
std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
}
打印:
<start>
<try>id=1;entry1=[A,B,D];</try>
<id>
<try>id=1;entry1=[A,B,D];</try>
<success>;entry1=[A,B,D];entr</success>
<attributes>[1]</attributes>
</id>
<entry>
<try>entry1=[A,B,D];entry</try>
<success>;entry2=[bla,blubb];</success>
<attributes>[[[A], [B], [D]], [e, n, t, r, y, 1, =]]</attributes>
</entry>
<entry>
<try>entry2=[bla,blubb];f</try>
<success>;factor=[1,5]!</success>
<attributes>[[[b, l, a], [b, l, u, b, b]], [e, n, t, r, y, 2, =]]</attributes>
</entry>
<factor>
<try>factor=[1,5]!</try>
<success>!</success>
<attributes>[[1, 5]]</attributes>
</factor>
<success></success>
<attributes>[[1, [[A], [B], [D]], [[b, l, a], [b, l, u, b, b]], 1, [1, 5]]]</attributes>
</start>
Parsed: (1 vector{ 'A', 'B', 'D', } vector{ 'bla', 'blubb', } true pair{ '1', '5' })
¹(我错过了修复标题、平衡括号和向构造函数添加括号等的第一部分……o.O)。
关于c++ - 使用凤凰绑定(bind)到结构的提升精神规则 - 编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33111067/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!