草庐IT

c++ - 使用精神以替代方式解析结构时混淆输出

这是我尝试以尽可能最好的方式做的事情的一个大大减少的案例。(当然,问题还在于,我试图了解如何最好地使用精神。)我需要将数据解析为具有多个成员的结构。成员被简单地列为键值对,因此这很简单——但是,如果某些键不同,那么在我正在解析的数据中,不同的值可能会稍后出现,或者某些键可能会被省略。尽管如此,我最终解析的数据结构是有固定形式的。在示例代码中,my_struct是struct像这样:structmy_struct{std::stringa;std::stringb;std::stringc;std::stringd;};和grammar1是一个像这样解析字符串的语法"a:xb:yc:zd

c++ - 如何使用 Boost.Spirit.Qi 增量解析(并作用于)大文件?

我为自定义文本文件格式创建了一个Qi解析器。有数以万计的条目要处理,每个条目通常有1-10个子条目。我放了一个精简的解析器工作示例here.#include#include#include#include#include#include#include#include#include#include#include#include#includeusingstd::string;usingstd::vector;usingstd::cout;usingstd::endl;namespacemodel{namespaceqi=boost::spirit::qi;structspectru

c++ - 如何解析带引号字段中嵌入逗号的 CSV?

我已经尝试了其他答案中提到的一些修复,但它们对我的输出没有影响。我不打算使用boostspirit,因为我不确定它是否是满足我需求的最佳选择。此外,类似的帖子不涉及包含逗号的引用Material,这是我目前要解决的最后一个问题。这是一个C++程序。我正在使用CSV文件作为输入。该文件给出了印章的特征,每个条目有23个值(列)。当我输出rawdata[22]时,我希望看到第一组数据的最后一个条目。相反,我看到了最后一个条目(请愿书),然后是下一个印章的第一个条目(2055)。当我在十六进制编辑器中打开它时,我看到这两个词由“.”分隔。十六进制字符为0a。我尝试将\r、\n、\r\n设置为

c++ - C++ 中的日期/时间解析

在用C++进行数据/时间解析(将任何格式的字符串转换为日期)时,我发现了以下有用的方法1)strptime()-这里的%d、%m等可以有1个或2个字符。该功能将负责这一点。因此,它将强制我们在两个转换说明符之间使用分隔符。例如:给%d%m是无效的,它必须给%d/%m或任何其他分隔符。这也不支持时区。2)boost日期IO-这里的%d、%m必须有2个字符。现在,我得到的输入字符串不能保证有这个。结果,它不可能成功地使用它。但是,这似乎确实支持时区,但不确定。因为它说输入它确实支持时区所以我打算结合使用两者来确定日期。但我想得到一个我也可以考虑时区的地方。但似乎没有人支持这一点。有人有什么

c++ - 使用 GNU 工具链从文件中解析 C++ 函数头

我需要从SWIG使用的.i文件中解析函数头,该文件在函数头旁边包含各种垃圾。(最终输出将是函数声明列表)对我来说,最好的选择是使用GNU工具链(GCC、Binutils等)来执行此操作,但我可能缺少使用SWIG执行此操作的简单方法。如果我是请告诉我!谢谢:]编辑:我也不知道如何使用GCC工具链来做到这一点,如果你有想法那就太好了。 最佳答案 我会尝试从clang获取抽象语法树的XML转储。或来自gccxml.从那里您可以轻松提取您感兴趣的函数声明。 关于c++-使用GNU工具链从文件中解

c++ - 用于解析 C++ 中重复日期描述的库?

对于我的应用程序,我需要一个可以处理日期直接描述的解析器,例如“12/31/10”表示今年的除夕,但也可以处理/repeating/日期的描述,例如“每个月的第一个星期一。”boost::date_time已经有了日期生成器的概念,但我认为它没有提供任何通用的方法在不知道将生成的生成器类型的情况下将字符串转换为日期生成器。在我去重新发明轮子之前,是否已经有一些东西可以做到这一点?我对字符串的确切语言很灵活,只要它是非程序员可以阅读和理解的内容即可。 最佳答案 您可以使用很棒的boost::spirit库。它允许您轻松地为这类事情创建

c++ - 从文件中解析二进制数据

提前感谢您的帮助!我正在学习C++。我的第一个项目是为我们在实验室使用的二进制文件格式编写一个解析器。我能够使用“fread”在Matlab中相当轻松地使解析器工作,看起来这可能适用于我在C++中尝试做的事情。但从我读到的内容来看,似乎推荐使用ifstream。我的问题有两个方面。首先,使用ifstream相对于fread的优势到底是什么?其次,如何使用ifstream来解决我的问题?这就是我想要做的。我有一个包含一组结构化整数、float和64位整数的二进制文件。共有8个数据字段,我想将每个字段读入其自己的数组。数据结构如下,重复288字节block:Bytes0-3:intByte

c++ - 解析表达式语法中的左分解

我正在尝试为允许以下表达式的语言编写语法:fargs形式的函数调用(注意:没有括号!)a+b形式的添加(和更复杂的表达式,但这不是重点)例如:f42=>f(42)42+b=>(42+b)f42+b=>f(42+b)语法是明确的(每个表达式都可以完全以一种方式解析)但我不知道如何将此语法编写为PEG,因为两个产品可能以相同的标记开始,id.这是我错误的PEG。我怎样才能重写它以使其有效?expression::=call/additioncall::=idaddition*addition::=unary(('+'unary)/('-'unary))*unary::=primary/'(

c++ - 通过自定义语法使用 Boost Spirit 的流解析器

概要我想利用BoostSpirit的streamparserAPI以增量方式解析std::istream。但是,我找不到一个很好的例子来说明如何将它与基于迭代器的语法一起使用。从概念上讲,我的目标是解析无穷无尽的T类型的对象流。详情Qi中具有T类型属性和Sskipper的语法通常具有以下形式:templatestructgrammar:qi::grammar;如何在基于流的API中使用这样的语法?具体来说,我对流API的心理模型是我可以按照以下方式做一些事情://CallbackinvokedforeachsuccessfullyparsedinstanceofT.voidf(Tcon

c++ - 在 Bison 中为 && 和 || 启动短路规则操作

我正在使用C/C++在Bison&Flex中编写一个简单的计算器(逻辑在Bison中完成,C/C++部分负责数据结构,例如STL等)。我有以下问题:在我的计算器中,美元符号$表示i++和++i(前缀和后缀),例如:inty=3;->$y=4->y$=4当用户点击:int_expression1&&int_expression2时,如果int_expression1被评估为0(即false),那么我不想'tbison评估int_expression2!例如:inta=0;intx=2;然后用户点击:intz=a&&x$...因此,变量a被评估为0,因此,我不想评估x,但它仍然增长1...