我正在编写用于日期解析的 boost::spirit::qi 语法。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/date_time.hpp>
template < typename InputIterator >
struct date_rfc1123_grammar :
boost::spirit::qi::grammar< InputIterator, boost::gregorian::date()> {
typedef boost::gregorian::date value_type;
date_rfc1123_grammar() : date_rfc1123_grammar::base_type(date)
{
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
using qi::_pass;
using qi::_val;
using qi::_2;
using qi::_3;
using qi::_4;
_2digits = qi::uint_parser< std::uint32_t, 10, 2, 2 >();
_4digits = qi::uint_parser< std::uint32_t, 10, 4, 4 >();
date = (weekday >> ' ' >> _2digits >> ' ' >> month >> ' ' >> _4digits)
[
phx::try_[
_val = phx::construct< value_type >( _4, _3, _2 )
].catch_all[
_pass = false
]
];
}
boost::spirit::qi::rule< InputIterator, value_type()> date;
weekday_grammar weekday;
month_grammar month;
boost::spirit::qi::rule< InputIterator, std::int32_t() > _2digits;
boost::spirit::qi::rule< InputIterator, std::int32_t() > _4digits;
};
我依靠 boost::gregorian::date 构造函数进行参数检查,并希望解析器在出现异常时失败。但是 boost::phoenix::try_[ ].catch_all[ ] 构造无法编译,并显示以下消息:
/path_to_file/datetime_parse.hpp:102:8: required from ‘tip::http::grammar::parse::date_rfc1123_grammar<InputIterator>::date_rfc1123_grammar() [with InputIterator = boost::spirit::multi_pass<std::istreambuf_iterator<char, std::char_traits<char> > >]’
/path_to_file/grammar_parse_test.hpp:17:7: required from here
/usr/local/include/boost/proto/traits.hpp:341:13: error: static assertion failed: 0 == Expr::proto_arity_c
BOOST_STATIC_ASSERT(0 == Expr::proto_arity_c);
^
没有 try_.catch_all 构造语法编译正常,但我希望解析器捕获异常并将 _pass 标志设置为 false 以使语法失败。
操作系统和编译器信息:
$ uname -a
Linux zmij 3.19.0-27-generic #29-Ubuntu SMP Fri Aug 14 21:43:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ g++ -v
Thread model: posix
gcc version 4.9.2 (Ubuntu 4.9.2-10ubuntu13)
提升版本 1.58
最佳答案
我以前见过这个,可能是某些增强/编译器版本的本地内容。
解决方法是包含一个空操作语句(例如 _pass=_pass)使其成为一个序列:
date = (weekday >> ' ' >> _2digits >> ' ' >> month >> ' ' >> _4digits)
[
_pass = _pass,
phx::try_[
_val = phx::construct< value_type >( _4, _3, _2 )
].catch_all[
_pass = false
]
];
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/date_time/gregorian/greg_date.hpp>
template <typename InputIterator>
struct date_rfc1123_grammar : boost::spirit::qi::grammar< InputIterator, boost::gregorian::date()>
{
typedef boost::gregorian::date value_type;
date_rfc1123_grammar() : date_rfc1123_grammar::base_type(date)
{
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
using qi::_pass;
using qi::_val;
using qi::_2;
using qi::_3;
using qi::_4;
date = (weekday >> ' ' >> _2digits >> ' ' >> month >> ' ' >> _4digits)
[
_pass = _pass,
phx::try_[
_val = phx::construct< value_type >( _4, _3, _2 )
].catch_all[
_pass = false
]
];
}
boost::spirit::qi::rule< InputIterator, value_type()> date;
boost::spirit::qi::rule< InputIterator, uint()> weekday, month;
boost::spirit::qi::uint_parser< std::uint32_t, 10, 2, 2 > _2digits;
boost::spirit::qi::uint_parser< std::uint32_t, 10, 4, 4 > _4digits;
};
int main() {
using It = std::string::const_iterator;
std::string const input;
date_rfc1123_grammar<It> g;
It f = input.begin(), l = input.end();
boost::gregorian::date d;
bool ok = boost::spirit::qi::parse(f, l, g, d);
return ok?1:2;
}
关于c++ - boost::phoenix try_catch_all 构造编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32245224/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
在Rails4.1中,ActiveRecorddestroy_all是否将整个函数包装在一个事务中?例如,如果我有一堆记录,我对其执行了destroy_all操作,它们对这些单独的对象运行了一些回调,其中一个失败了,整个操作会在那个时候回滚吗? 最佳答案 看起来不像:#Fileactiverecord/lib/active_record/relation.rb,line386defdestroy_all(conditions=nil)ifconditionswhere(conditions).destroy_allelseto_a.