我正在编写一个词法分析器。它接受一个英文字符串,并将其转换为一组纬度/经度坐标。它有点像Google地球。不管怎样,我的符号表和语法都写好了,解析格式化数据也很开心。structLatLongDegrees{std::stringdirLat_;doubledegLat_;std::stringdirLong_;doubledegLong_;}例如:{"北",23.59,"东",-30.82}这是我的语法:basic=(latitude>>''>>double_>>''>>longitude>>''>>double_);其中纬度和经度是从速记罗盘方向映射到字符串(例如“e”到“East
在Boost::Spirit中,如何从绑定(bind)了Boost::Bind的函数中触发expectation_failure?背景:我解析了一个包含复杂条目的大文件。当一个条目与前一个条目不一致时,我想失败并抛出一个expectation_failure(包含正确的解析位置信息)。当我解析一个条目时,我绑定(bind)了一个函数来确定该条目是否与之前看到的不一致。我编了一个小玩具示例来说明这一点。在这里,我只是想在int不能被10整除时抛出一个expectation_failure:#include#include#include#include#includenamespaceq
#include#includenamespaceqi=boost::spirit::qi;intmain(){usingqi::string;std::stringinput("a");std::string::iteratorstrbegin=input.begin();std::stringp;boolok=qi::phrase_parse(strbegin,input.end(),((string("a")>>string("a"))|string("a")),qi::space,p);if(ok&&strbegin==input.end()){std::cout这个程序输出a
当以有效关键字(符号)开头时,如何防止BoostSpirit符号解析器接受关键字(符号)。我希望该构造无法将“ONEMORE”作为一个整体进行解析,并且无法成功解析“ONE”,因为这是一个有效的关键字,然后在“MORE”上失败。下面是代码的实际输出:Keywordasanumber:1Keywordasanumber:2Keywordasanumber:1Invalidkeyword:MORETHREE这就是我喜欢的样子:Keywordasanumber:1Keywordasanumber:2Invalidkeyword:ONEMOREKeywordasanumber:3该代码只是一个
我有一个记录解析器,它抛出多个异常之一以指示哪个规则失败。前题:#include#include#include#include#include#include#includeusingnamespaceboost::spirit;usingnamespaceboost::spirit::ascii;usingnamespaceboost::spirit::qi;usingnamespaceboost::spirit::qi::labels;usingboost::phoenix::function;usingboost::phoenix::ref;usingboost::spirit
我正在破解的一个简单的骨架实用程序的一部分我有一个用于触发文本替换的语法。我认为这是熟悉Boost.Spirit的绝妙方式,但模板错误是一种独特的乐趣。完整代码如下:#include#include#include#includenamespacebsq=boost::spirit::qi;namespace{templatestructskel_grammar:publicbsq::grammar{skel_grammar();private:bsq::rulemacro_b;bsq::rulemacro_e;bsq::ruleid;bsq::rulemacro;bsq::rulet
我想将一些旧的手写解析代码转换为BoostSpirit并在此过程中学习(更多)精神。旧代码使用流和模板来解析某些数据类型和某些容器的定义。一些典型的格式:VECTOR[number_of_items,(item_1,item_2....item_n)]PAIR(p1,p2)RECT[(left,top)-(right,bottom)]Point(x,y)Size(x,y)解析函数是模板,以项目的类型作为模板参数,并使用流作为输入,例如templatestd::istream&operator>>(std::Stream&in,std::vector&v);templatestd::is
我正在尝试将LaTeX转义码(例如\alpha)解析为Unicode(数学)字符(即U+1D6FC)。现在这意味着我正在使用这个symbols解析器(规则):structgreek_lower_case_letters_:x3::symbols{greek_lower_case_letters_::greek_lower_case_letters_(){add("alpha",U'\u03B1');}}greek_lower_case_letter;这工作正常但意味着我得到一个std::u32string作为结果。我想要一种优雅的方式来将Unicode代码点保留在代码中(可能用于将来的
我在boost::spirit中有以下规则:typedefboost::tupleEntry;qi::ruleentry;entry=qi::int_>>qi::int_;但是第二个int没有写入元组。有没有办法让它工作而不必使用boost::fusion::tuple?如果我使用std::pair就可以,那么为什么我不能使用boost::tuple?这是一个完整的编译示例:#include#include#include#includenamespaceqi=boost::spirit::qi;//works://#include//typedefstd::pairEntry;//d
我正在尝试使用boostspirit框架定义我自己的语法,并且我正在定义这样一个匹配规则:value=(char_('"')>>(*qi::lexeme[char_('\\')>>char_('\\')|char_('\\')>>char_('"')|graph-char_('"')|char_('')])[some_func]>>char_('"'));我想将一个Action-some_func-分配给它的一部分,并将整个匹配字符串作为参数传递。但不幸的是我会得到类似vector的东西.我能否以某种方式将整个数据作为具有大小的char*、std::string或什至void*获取?