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

Returning multiple data types from Boost::spirit parse

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

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

  2. 编写仅验证结构的语法(仅 JSON 规则)和 returns 更通用的对象(具有 variants/tuples 的字段等.) 和 validate/translate 在更高级别进入自定义结构(转换和检查各种变体字段)

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

优点 1:

缺点 1:

2 人的优点:

2 的缺点:

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

这里有一些示例消息和 类 它们最终应该位于:

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

class MessageTypeA
{
public:
    double numberParam;
};

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

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

  1. 采取通才的方法,并根据特定的 "scheme"
  2. 进行解释
  3. 采用临时方法,OP
  4. 认为这种方法更容易

我投第一个选项,因为

  • "complex code gets written & tested once, and touched rarely" 根据我的经验,比其他因素更重要,
  • 事实上,语法从分离的职责和保持 AST 真正接近自然规则属性中受益匪浅
  • 我已经将多个 "flavours" 的 JSON 后端(OData、Edm、版本、元数据级别)编写到我的融合适应类型(使用融合 "reflection")。这些全部共享相同的parser/generator。

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

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.