如何为JSON对象编写ANTLR4语法

时间:2016-05-09 00:28:48

标签: json antlr4 abstract-syntax-tree

我很难弄清楚如何为抽象数据结构编写ANTLR4语法。例如,考虑一个Python程序,它读取和写入人员列表,其中一个人有姓名,电子邮件地址和电话号码。相同的抽象数据结构(Python的dicts列表)可以以多种格式存储,每行一个人的csv文件,带有对象列表的JSON文件,XML文件等,但我会开始只有JSON

grammar People;
import JSON;

people: person+;
person: name email phone?;
name:   STRING;
email:  STRING;
phone:  STRING;

JSON语法定义了七种value类型,人和人定义了我的抽象类型,但不明显如何将它们链接在一起而不强制语法为JSON特定。

问题:假设有三个编解码器语法(JSON,CSV,XML)定义了值类型数组,obj和STRING,语法如何指定人是一个人的数组,而人是一个三人的obj名为STRINGS?

编辑:

为了澄清,我想阅读一个JSON实例:[{" name":" Fred"," email":" fred @ foo .com"}]到由ANTLR语法定义的Python对象中,拒绝有效JSON但不是有效people对象的数据。并通过import不同的编解码器语法将该对象转换为CSV文件:"名称,电子邮件,电话\ n弗雷德,fred @ foo.com"。我还想使用相同的语法来生成验证人员列表的JSON实例的JSON模式,以及验证人员列表的XML实例的XSD文件。

换句话说,我想知道ANTLR是否能够执行与ASN.1相同的操作 - 定义数据对象的结构,而不依赖于这些对象的序列化。如果是这样,请了解ANTLR如何表示结构与编码/序列化之间的接口。

2 个答案:

答案 0 :(得分:3)

正如其他人所指出的那样,你真正想要的是一个用于将数据绑定到对象/从对象绑定数据的模型,类似于Jackson在Java中的工作方式。如果是这样,可以获得结构验证作为尝试将自描述(json,xml,csv在某种程度上)中的结构绑定/映射到编程语言对象定义中的副作用。 我假设这些工具存在于Python中(假设它是你的平台)。

正如其他人所指出的那样,像ANTLR这样的基于语法的解析器似乎并不常用于解决问题。

除了数据绑定工具之外,另一类实用程序将是模式语言和验证器,但问题是它们往往只适用于特定的数据格式,因此您必须具有XML Schema,JSON Schema和等等。它可能用于其他类似的格式,但即使看似相似的格式(XML,JSON)在逻辑数据模型中也经常存在显着差异。

答案 1 :(得分:2)

这不是ANTLR的作用

TL; DR

ANTLR处理语法并生成代码以解析目标语言中的语法。

就是这样。

它不进行序列化或反序列化或映射或其他任何操作。它只是做了上面所说的。

它与解析表示紧密相关,而不是相反。 ANTLR非常受欢迎,如果它做了这样的事情会有几十个如何做的例子,你可以使用一些无处不在的标准。那些不存在,因为这不是该工具的作用。

如果你想创建一些新的绑定语言,你可以用ANTLR做到这一点,但你永远不会获得一个可以读取任何格式并映射它的ANTLR语法某些任意结构,不是它的设计目的,它永远不会那样做,你试图用错误的工具来做错误的工作。

ANTLR是一个解析器编写器,您可以编写JSON解析器或CSV解析器或XML解析器,但是您不能编写将所有这些转换为某些通用对象表示的语法文件。

您可以使用ANTLR解析ANS.1,但它没有做任何其他事情。

JAXB用于通过可选架构对XML进行反序列化/序列化。

杰克逊存在使用可选序列化特定模式对JSO,XML,CSV,YAML,协议缓冲区等进行序列化和/或序列化。

ASN.1也没有按照您的要求执行,它只是定义了一个独立于序列化的架构,它执行任何解析或验证。您正在将使用语言语法规范读取和处理ASN.1的工具混为一谈。

这只是架构标准。一些独立的解析器解析特定的序列化方案,而不是某些命令式程序读取ASN.1并应用其规则。

JSON Schema用于定义JSON文档, 存在XML模式和DTD以定义XML文档之前。 CSV有一个标题行。所有这些只是语言语法的规范,专门用于其中没有一个实际上做任何事情的原因。