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

时间:2015-02-24 23:37:04

标签: c++ boost qi

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

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

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

  3. 我认为这些是每个人的利弊:

    1的优点:

    • 所有验证都在boost :: spirit
    • 内完成
    • Karma生成器(如果编写)看起来像现有的精神解析代码

    1的缺点:

    • 必须为将来可能发明的每种新消息类型编写和维护新语法(并且精神语法不直观)

    2的优点:

    • 复杂的精神代码只写一次,很少触及

    2的缺点:

    • 通用消息对象的验证和转换将是精神应该首先消除的混乱代码

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

    这里是一些示例消息以及它们最终应该驻留在的类:

    {"messageType": "messageTypeA", "numberParam": 1}
    {"messageType": "messageTypeB", "stringParam": "Test"}
    
    class MessageTypeA
    {
    public:
        double numberParam;
    };
    
    class MessageTypeB
    {
    public:
        std::string stringParam;
    };
    

1 个答案:

答案 0 :(得分:0)

我认为这个问题与最近的答案非常接近,我的确做到了这一点:我回答了两个答案:

  1. Answer #1采用通才的方法,只根据特定的方案解释"
  2. Answer #2采取临时方法,OP认为这更容易。
  3. 我的投票是第一个选项,因为

    • "复杂的代码被写入&测试一次,很少接触"超过我的经验中的其他因素,
    • 实际上语法很大程度上受益于分离的职责,并使AST非常接近自然规则属性
    • 我写过多种口味" JSON后端(OData,Edm,版本,元数据级别)到我的Fusion适应类型(使用fusion" reflection")。这些 all 共享相同的解析器/生成器。

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

      

    哦,好吧。我很惊讶您之后接受了这个答案,因为其他答案完全相同,除非它接受并忽略"其他" JSON内容。您是否错过了定义extract_from的更新?它使用完全相同的数据结构 - 您在问题中建议的数据结构。 – sehe Jan 4 at 16:41