下面的代码来自Boost.Spirit x3文档 。 它使用了我以前从未见过的有趣的C ++语法,在不知道正确的术语的情况下几乎不可能在search查询中进行描述。 这是一个class的前进宣言的简写吗? C ++标准中提到的这个特性在哪里? namespace parser { using x3::eps; using x3::lit; using x3::_val; using x3::_attr; using ascii::char_; auto set_zero = [&](auto& ctx){ _val(ctx) = 0; }; auto add1000 = [&](auto& ctx){ _val(ctx) += 1000; }; auto add = [&](auto& ctx){ _val(ctx) += _attr(ctx); }; // What is this? This is the […]
在这篇关于助推精神语义行为的文章中提到了这一点 实际上还有两个参数被传递:parsing器上下文和一个布尔型“命中”参数的引用。 parsing器上下文只有在语义动作附加到规则的右手边时才有意义。 我们将很快看到更多的信息。 布尔值可以在语义操作中设置为false,使回溯中的匹配无效,从而使parsing器失败。 一切正常,但我一直在试图find一个例子传递一个函数对象作为语义行动,使用其他参数(parsing器上下文和命中布尔),但我还没有find任何。 我很希望看到一个使用常规函数或函数对象的例子,因为我几乎可以挖掘凤凰巫术
我有一个数百万行的文件,每行有3个浮动空格分隔。 读取文件需要很多时间,所以我试图用内存映射文件来读取它们,只是发现问题不在于IO的速度,而在于parsing的速度。 我目前的parsing是采取stream(称为文件),并执行以下操作 float x,y,z; file >> x >> y >> z; 有人在堆栈溢出推荐使用Boost.Spirit,但我找不到任何简单的教程来解释如何使用它。 我试图find一个简单而有效的方法来parsing看起来像这样的一行: "134.32 3545.87 3425" 我真的很感激一些帮助。 我想使用strtok来分割它,但我不知道如何将string转换为浮动,我不太确定这是最好的方法。 我不介意解决scheme是否会提升。 我不介意这是否是最有效的解决scheme,但我相信有可能将速度提高一倍。 提前致谢。
阅读并观看此演示文稿: http : //boost-spirit.com/home/2011/06/12/ast-construction-with-the-universal-tree/ 我发现了这个说法 – 基本上我们build议不要使用语义动作。 我必须承认,我已经有这样的感觉:具有语义行为的语法实际上看起来有点丑陋。 而当我需要扩展/改变它们的时候,它恰恰在语义上采取了很多“微观pipe理”。 在演示中演示的具有属性语法的方法似乎更加优雅和有前途。 所以我想问一下:这是一个“官方”的观点吗? 我应该学习如何使用属性语法,并更详细地避免语义操作? 如果是这样,我想要求一些基本的(甚至可能是微不足道的)例子,说明这种方法–LISP解释器对我来说太复杂了。