gpt4 book ai didi

c++ - 从 Boost::spirit 解析返回多种数据类型

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:29 27 4
gpt4 key购买 nike

我想解析大约 5-10 种共享通用格式(例如 JSON)但每种都有需要验证的特定字段的不同消息类型。每条消息最终都应解析为自定义类/结构,其类型不需要任何类型的转换(例如,字段是 int 而不是变体/元组)。我看到了解决该问题的两种方法:

  1. 为每条特定消息编写语法,处理消息格式(在本例中为 JSON 样板)和字段内容验证,返回真正的自定义结构

  2. 编写一个仅验证结构(仅 JSON 规则)并返回更通用的对象(具有变体/元组等字段)并在更高级别验证/转换为自定义结构的语法(转换和检查各种变体字段)

我认为这些是各自的优缺点:

1 的优点:

  • 所有验证都在 boost::spirit 中完成
  • 业力发生器(如果写的话)看起来像现有的 spirit 解析代码

1 的缺点:

  • 必须为 future 可能发明的每种新消息类型编写和维护新语法( spirit 语法不直观)

2 的优点:

  • 复杂的 spirit 代码只写一次,很少有人碰

2 的缺点:

  • 通用消息对象的验证和翻译将是 spirit 应该首先消除的困惑代码

哪种方法更可取?是否有第三种方法可以使用一种语法解析为多种类型?

下面是一些示例消息和它们最终应该驻留在的类:

{"messageType": "messageTypeA", "numberParam": 1}
{"messageType": "messageTypeB", "stringParam": "Test"}

class MessageTypeA
{
public:
double numberParam;
};

class MessageTypeB
{
public:
std::string stringParam;
};

最佳答案

我认为这个问题非常接近最近的答案,我正是这样做的:我回答了两个答案:

  1. Answer #1采取通才的方法,只根据特定的“方案”进行解释
  2. Answer #2采用临时方法,OP 认为这种方法更容易

我投第一个选项,因为

  • “复杂代码只需编写和测试一次,很少触及”在我的经验中胜过其他因素,
  • 事实上语法极大地受益于职责分离和保持 AST 真正接近自然规则属性
  • 我已经将 JSON 后端(OData、Edm、版本、元数据级别)的多种“风格”写入到我的 Fusion-adapted 类型(使用 fusion “反射”)。这些全部共享相同的解析器/生成器。

即使是链接问题中的 OP 似乎后来也需要我的第一个答案已经提供的灵 active :

Oh well. I'm pretty surprised that you accepted this answer then, since the other answer does exactly the same, except it does accept and ignore "other" JSON content. Did you miss the update that defined extract_from? It uses exactly the same data structure - the one you suggested in the question. – sehe Jan 4 at 16:41

关于c++ - 从 Boost::spirit 解析返回多种数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28708501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com