- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
解析器
namespace qi = boost::spirit::qi;
template<typename T>
class action
{
public:
action(std::vector<std::shared_ptr<part>>& parts) : m_parts{ parts } {}
void operator()(const std::vector<char>& cc, qi::unused_type, qi::unused_type) const
{
std::string s(cc.begin(), cc.end());
if (s.length() > 0) {
auto p = new T(s);
m_parts.push_back(std::shared_ptr<part>(p));
}
}
private:
std::vector<std::shared_ptr<part>>& m_parts;
};
std::vector<std::shared_ptr<part>> parse(const std::string& source) {
namespace ascii = boost::spirit::ascii;
using ascii::char_;
using qi::lit;
std::vector<std::shared_ptr<part>> parts;
auto prop_g = lit("{{=")
>> *char_(' ')
>> (*(char_ - char_("} ")))[action<property_part>(parts)]
>> *char_(' ')
>> "}}"
;
auto text_g = (+(char_ - '{'))[action<text_part>(parts)];
auto g = -text_g >> +(prop_g >> text_g);
qi::parse(source.begin(), source.end(), g);
return parts;
}
在 Kitkat 设备上测试时导致 qi::parse 调用出错。错误发生在调用任何语义操作之前。相同的代码适用于 Xcode 6/iOS 8.4 和 VS 2015。我们使用的是 Boost 1.59。
我们可以将 Spirit 替换为 Bison,这意味着额外的构建步骤,或者将 Clang 与 Android NDK 结合使用,让我们远离常规。
是否可以通过构建配置修复此错误,或者是否有其他我们可以探索的选项?
最佳答案
当然可以修复错误。
你没有展示语法
请参阅更新不过,你展示了很多带有未知数的解析器表达式,所以我们甚至无法开始对你的代码进行推理。 p>
确实突出的一件事是(滥用)使用auto
, 不过。
一个快速的谷歌应该指向你关于 SO 的 ~6 个问题,警告这个。
You can not use
auto
with Spirit's expression templates. In all but the very very trivial cases (unparameterized stateless terminals) this leads directly to Undefined Behaviour
尝试使用
qi::rule<>
包含/分组表达式boost::spirit::copy
或 boost::proto::deep_copy
更新
对于已编辑的问题:确实由于未定义的行为导致语法崩溃(如果这“似乎有效”,那你只是(不)幸运!)。
这是一个固定版本,作为奖励我删除了 action<>
用现有的 Phoenix 机制和属性传播替换它的东西。
您可能想要并排研究这些更改,以准确了解我所做的更改。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
struct part {
part(std::string s="") : _value(std::move(s)) {}
virtual ~part() { }
virtual void do_print(std::ostream& os) const = 0;
protected:
std::string _value;
};
struct property_part : part {
using part::part;
void do_print(std::ostream& os) const { os << "{{=" << _value << "}}"; }
};
struct text_part : part {
using part::part;
void do_print(std::ostream& os) const { os << "'" << _value << "'"; }
};
std::vector<std::shared_ptr<part>> parse(const std::string& source) {
namespace qi = boost::spirit::qi;
namespace px = boost::phoenix;
using boost::spirit::ascii::char_;
using qi::lit;
typedef std::shared_ptr<part> pptr;
qi::rule<std::string::const_iterator, pptr()> prop_g, text_g;
// this is ok: purely stateless expression template
prop_g = lit("{{=")
>> *char_(' ')
>> qi::as_string [ +~char_("} ") ] [ qi::_val = px::construct<pptr>(px::new_<property_part>(qi::_1)) ]
>> *char_(' ')
>> "}}"
;
text_g = qi::as_string [ +~char_('{') ] [ qi::_val = px::construct<pptr>(px::new_<text_part>(qi::_1)) ];
std::vector<pptr> parts;
qi::parse(source.begin(), source.end(), -text_g >> +(prop_g >> text_g), parts);
return parts;
}
int main() {
auto result = parse("My book is about {{= this-is-a-(bogus)-property-part }} else entirely {{=byebye}}");
assert(result.size() == 4);
for(auto item : result)
item->do_print(std::cout);
}
打印
'My book is about '{{=this-is-a-(bogus)-property-part}}' else entirely '{{=byebye}}
关于c++ - Android 上的简单 boost::spirit 语法 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32611682/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!