【问题标题】:Using ANTLR and Java to create a data binding code generator使用 ANTLR 和 Java 创建数据绑定代码生成器
【发布时间】:2015-10-02 18:44:12
【问题描述】:

我将为指定的编程语言和指定的序列化格式创建一个数据绑定代码生成器:给定要序列化或反序列化的数据结构的规范,预期的代码生成器应该生成表示给定词汇表的类(使用指定的编程语言)以及使用指定格式进行序列化和反序列化的方法。预期的代码生成器可能需要以下输入:

  • 目标编程语言,即生成代码的编程语言;
  • 目标序列化格式,即数据的序列化格式;
  • 要序列化或反序列化的数据结构规范。

由于最初我想创建一个简单的代码生成器,这个软件的第一个版本可能只需要定义要序列化或反序列化的数据结构的规范,所以我选择 C# 作为目标编程语言和 XML 作为目标序列化格式。 本质上,预期的代码生成器应该是一个 Java 软件,它读取要序列化或反序列化的数据结构规范(该规范必须根据给定的语法编写),并生成表示给定词汇表的 C# 类:这些类应该具有 XML 格式的序列化和反序列化方法。预期代码生成器的目的是生成一个或多个类,以便它们可以嵌入到 C# 项目中。

关于要序列化或反序列化的数据结构的规范,可以定义如下:

simple type Message: int id, string content

根据上面示例中的规范,预期的代码生成器可以生成以下 C# 类:

public class Message
{
    public int Id { get; set; }

    public string Content { get; set; }

    public byte[] Serialize()
    {
        // ...
    }

    public void Deserialize(byte[] data)
    {
        // ...
    }
}

我读到了ANTLR,我相信这个工具非常适合刚刚解释的目的。正如this answer 中解释的那样,我应该首先为要序列化或反序列化的数据结构的规范创建一个语法。

上面的例子很简单,因为它只定义了一个简单类型,但是数据结构的规范可能更复杂,所以我们可以有一个复合类型,它包含一个或多个简单类型或列表等,如下例所示:

simple type LogInfo: DateTime time, String message
simple type LogSource: String class, String version
compound type LogEntry: LogInfo info, LogSource source

此外,数据规范还可以包括一个或多个约束,如下例所示:

simple type Message: int id (constraint: not negative), string content

在这种情况下,预期的代码生成器可以生成以下 C# 类:

public class Message
{
    private int _id;
    private string _content;

    public int Id
    {
        get { return _id; }
        set
        {
            if (value < 0)
                throw new ArgumentException("...");

            _id = value;
        }
    }

    public string Content
    {
        get { return _content; }
        set { _content = value; }
    }

    public byte[] Serialize()
    {
        // ...
    }

    public void Deserialize(byte[] data)
    {
        // ...
    }
}

基本上,预期的代码生成器应该找到所有用户定义的类型、任何约束等。有一些简单的例子吗?

【问题讨论】:

  • 我会警惕重新发明这个特殊的轮子。

标签: java parsing compiler-construction antlr antlr4


【解决方案1】:

Antl4 repo 中的示例语法总是一个很好的起点。简单的语法,如 abnf、json 等,可能会为您的规范语法提供相关的起点。更复杂的语法,比如几个 sql 语法,可以让我们深入了解如何处理更困难或更复杂的规范结构——规范的每一行看起来都类似于 sql 语句。

当然,Antlr 4(无论是语法还是实现)都是阅读规范和生成衍生源输出的最典型示例。

【讨论】:

    【解决方案2】:

    如果您想查看一个具有您提议的特征(多平台、多语言、数据定义语言)的开源数据交换系统,您可能会比查看 Google 的 Protocol Buffers(更广为人知)做得更糟作为 protobuf.

    不幸的是,数据描述语言的compiler 不是从语法生成的;但它是一个用 C++ 编写的相对易读的递归下降解析器。包括多种语言的代码生成器,还有更多可用。

    一个有趣的特性是交换格式本身可以被描述。此外,可以根据交换格式的描述对数据进行编码和解码,因此也可以交换格式描述并临时使用它们,而无需生成代码。 (显然,这效率较低,但通常很有用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多