嘿,另一个问题:我写了很多非常相似的解析器,它们使用了很多通用规则。我可以将这些rule对象存储在多个解析器可以访问的地方吗?它看起来像这样:rulenmeaStart=ch_p('$');rulenmeaAddress=alnum_p()>>alnum_p()>>!alnum_p()>>!alnum_p();rulenmeaDelim=ch_p(',');rulenmeaHead=nmeaStart>>nmeaAddress>>nmeaDelim;.../*otherrules.Differentforeachparser*/...rulenmeaChkSumStart=ch_p('
我的目标是让我的qi::grammar返回一个属性。不过,我在使用spirit::lexer时遇到了很大的困难。我希望使用下面给定的语法,如果我用spirit::qi::parse(begin,end,grammar,output);调用它,那么structident输出将包含已解析的词素的内容。错误似乎主要从这一行流出:start%=lexer.identifier;系统说明boost1.47.0MacOSX10.7.2clang++或g++(下面显示的错误来自clang++)编译命令g++-g-c-O0-Wall-DBOOST_SPIRIT_DEBUG-DBOOST_SPIRIT_
以下代码是我正在尝试做的事情的简化版本。基本上,我有结构(玩具代码中的int_holder)和一个容器数据成员。我想插入一个对象(在本例中为int)并向父qi::rule返回一个指向新插入对象的指针。我通过引用将int_holder传递给语法,以便在解析时用值填充它,因此int_holder将是语法的继承属性。代码:#include#include#include#include#includenamespaceqi=boost::spirit::qi;namespacephoenix=boost::phoenix;structint_holder{int_holder(){}std:
我有一个从spirit::lex和spirit::qi构建的简单配置文件解析器。当词法分析器到达模式include"path"时,我希望包含文件的文本。你可能知道,spirit::lexer::begin()启动扫描过程://Readfilecontentsintoastd::string...//_firstand_lastareconstchar*_first=_contents.c_str();_last=&_first[_input.size()];//_tokenisalexer::iterator_typeforthecurrenttoken_token=_lexer.be
我正在尝试使用Boost::Spirit::qi的on_error机制来找出解析失败的原因。我在on_error函数处设置了一个断点,该函数正在被调用,但没有输出(nada、nothing、void、...)。简单的on_error:on_error(level1,boost::phoenix::ref(std::cout)复杂的on_error(来自不同网站):on_error(start,boost::phoenix::ref(std::cout)(qi::_3,qi::_2)这是我的类,包含简单的on_error:templatestructEvent_Compound:qi::
我的目的是将逗号分隔的值列表解析为嵌套vector。这个列表是二维的。基本问题是:是否可以用boost::spirit解析成vector的vector?类似于“牵引力”下的表格:''RPM0,5000,10000,15000,20000,25000''Temp'-40.,0.,20.,40.''Traction200.,175.,170.,165.,160.,150.200.,175.,170.,165.,160.,150.165.,165.,160.,155.,145.,145.160.,155.,150.,145.,145.,140.'下一步,我想读入4维数据,但目前我正在努力处理
我试图继续处理我之前的示例并扩展规则。我的问题是,使用ID_IDENTIFIER的规则不起作用-虽然我知道词法分析器正在工作(使用单元测试)。例子如下:#include#includenamespaceqi=boost::spirit::qi;namespacelex=boost::spirit::lex;enumLexerIDs{ID_IDENTIFIER,ID_WHITESPACE,ID_INTEGER,ID_FLOAT,ID_PUNCTUATOR};templatestructcustom_lexer:lex::lexer{custom_lexer():identifier("[
我的目标是创建一个解决方法,以便我可以在BoostSpiritQi语义操作中使用C++11lambda,同时仍然可以访问更多扩展的qi占位符集,例如qi::_pass或qi::_r1,而无需从上下文对象中手动提取它们。我希望避免为一些重要的解析逻辑编写Phoenixlambda,而更喜欢C++11lambda中可用的更直接的C++语法和语义。下面的代码代表了我对解决方法的想法。我的想法是使用phoenix::bind绑定(bind)到lambda并将我需要的特定占位符传递给它。但是,我遇到了一个非常长的模板化编译器错误(gcc4.7.0,Boost1.54),我没有解释的专业知识。我选
我已经问过这个问题了。但由于没有答案,我现在再次询问完整的可编译源代码片段。由于boost::variant移动语义的一些问题,此代码片段应该在没有std=c++11选项的情况下编译。只是'g++-Wall-pedantic'。在此代码片段中,您将找到“//Commenthere”行。您可以评论以下block,直到“//Andhere-----”。如果这个block没有注释,这个程序的性能会很差。所以只要我能看到瓶颈就是替代解析器。我需要的是一些关于改进/更改语法以boost解析性能的建议。谢谢。代码:#include#include#include#include#include#i
我正在研究使用boost::spirit::lex编写词法分析器,但我能找到的所有示例似乎都假定您已先将整个文件读入RAM。我想编写一个不需要整个字符串都在RAM中的词法分析器,这可能吗?或者我需要使用其他东西吗?我尝试使用istream_iterator,但除非我使用constchar*作为迭代器类型,否则boost会给我一个编译错误。例如我能找到的所有示例基本上都是这样做的:lex_functor_type>lex_functor;//assumesentirefileisinmemorycharconst*first=str.c_str();charconst*last=&fir