草庐IT

c++ - Boost::spirit::qi 定义一个 nullaries 的计算器

我正在尝试为数学表达式编写一个解析器,其中命名变量是boost::spirit中的nullaries|(版本1_51_0),我是全新的。我定义typedefboost::functionValue我的规则将这样声明:qi::ruleexpression,term,others,...;我用这个宏在nullaries上定义二元运算符#defineBINARY_FUNCTOR(name,op)\structname\{\name(Valuex,Valuey):x_(x),y_(y){}\doubleoperator()(){returnx_()opy_();}\Valuex_,y_;\};

c++ - 如何在 boost::spirit::qi 中将某些语义 Action 排除在 AST 之外

我尝试使用boost::spirit::qi解析大量文件。解析不是问题,但有些文件包含我想跳过的噪音。构建一个简单的解析器(不使用boost::spirit::qi)验证我可以通过跳过行首不匹配规则的任何内容来避免噪音。因此,我正在寻找一种方法来编写基于行的解析器,在不匹配任何规则时跳过行。下面的示例允许语法在完全不匹配的情况下跳过行,但是“垃圾”规则仍然插入一个空的V()实例,这是不需要的行为。在示例中使用\r而不是\n是有意的,因为我在文件中同时遇到了\n、\r和\r\n。#include#include#include#include#include#include#includ

c++ - 在 boost::spirit::qi 中,是否可以在运行时动态修改规则定义

我用boost::spirit::qi::rule写了一些语法来解析互联网数据包。语法是这样的:qi::rulestart,request,response,status,query;start=(request|response|status|query)>>lit("\r\n");为了boost性能,用户可能希望在运行时跳过一些规则,例如忽略“response”、“status”、“query”,只尝试匹配请求,因此规则将更改为:start=(request)>>lit("\r\n");这有可能吗?例如,是否有像“disable()”这样的函数来禁用规则“re​​sponse”、“

c++ - boost fusion 和 boost qi - 编译时错误

我无法编译以下代码:#include#include#includestructfunction{std::stringret_type;std::stringname;};BOOST_FUSION_ADAPT_STRUCT(function,(std::string,ret_type)(std::string,name))intmain(){}带有boost1.54的MSVC-11.0给我以下错误:1>main.cpp(6084):errorC3203:'function':unspecializedclasstemplatecan'tbeusedasatemplateargumen

c++ - 是否有 boost::phoenix::at_c 结合 boost::spirit::qi::grammar 的替代方案

我已经创建了一个测试应用程序来说明我的问题。它解析以“a=”或“b=”开头并以“\r\n”分隔的整数列表。该列表包含以任何顺序多次出现的这些字段。#include#include#include#include#include#includetypedefstd::vectoruint_vector_t;std::ostream&operatorstructMyParser:publicboost::spirit::qi::grammar{MyParser():MyParser::base_type(Parser,"Parser"){usingboost::spirit::qi::ui

c++ - Boost.Spirit.Qi - 规则开头的错误

如何检测规则开头的错误?例如,考虑MiniXMLexample包含在文档中。如果我向解析器提供如下内容:thisisanerror然后我得到:Error!Expectinghere:""Error!Expectinghere:""Parsingfailed.那很好,但接下来考虑喂它:element>thisisanerror我得到的是非常通用但不太有用的:Parsingfailed.我如何修改规则以提供信息的方式报告错误? 最佳答案 您希望需要文档根级别的元素。其他消息是由失败的期望点生成的。您会希望在开始时有一个额外的期望值。我会

c++ - 使用 Boost Spirit Qi 解析特定字符串

我是BoostSpirit的新手,正在努力创建一个正确的表达式来解析以下输入(实际上是某些命令的标准输出的结果):^+line-17532.dyn.kponet.fi273771+1503us[+9103us]+/-55ms我需要将其解析为一组字符串和整数并记录在变量中。该行的大部分内容应该被解析为适当类型(字符串或整数)的变量。所以最后,我得到:string:"^+","line-17532.dyn.kponet.fi","+1503us","+9103us","55ms"int:2,7,377,1一对+1503us[+9103us]也可以带空格+503us[+103us]我需要将方

c++ - boost::spirit::气

考虑以下代码:(Boost.Spirit2.5.1)qi::parse(str.begin(),str.end(),(+qi::alpha)[[](conststring&s){cout>(*(qi::char_(',')|qi::char_('\'')))>>qi::uint_[[](intinteger){cout[[](intinteger){cout有效,但是+qi::alpha的类似代码没有。如何更正代码? 最佳答案 BoostSpirit尚不支持C++0x/C++11lambdas1编辑显然支持有所改善(我今天早些时候使

c++ - boost spirit qi on_error 通过引用传递 error_handler struct

我又遇到了灵气障碍问题。我在一个名为error_handler的仿函数结构中实现了错误处理。这通过引用传递给语法构造函数(参见Qi的MiniC示例)。然后我有on_errors在语法的构造函数中定义:typedefboost::phoenix::function>error_handler_function;on_error(gr_instruction,error_handler_function(err_handler)(L"Error:Expecting",_4,_3));//moreon_errors...但是,我的error_handler有私有(private)成员。好像每

c++ - Qi Symbols 性能慢?

我想提出一个让我陷入困境的主题,并提出了一个关于齐::符号。这一切都始于我查看新的野兽图书馆并阅读atutorialexample它以一个从http路径猜测mime类型的函数开始扩展。我开始仔细观察,看到了这个:autoconstext=[&path]{autoconstpos=path.rfind(".");if(pos==boost::beast::string_view::npos)returnboost::beast::string_view{};returnpath.substr(pos);}();我花了一段时间才弄清楚这是一个IIFE在C++风格中,用于初始化ext,同时声