java - 使用ANTLR和Java创建数据绑定(bind)代码生成器

标签 java parsing compiler-construction antlr antlr4

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

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

由于最初我想创建一个简单的代码生成器,该软件的第一个版本可能只需要定义要序列化或反序列化的数据结构的规范,所以我选择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)
    {
        // ...
    }
}

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

最佳答案

如果您想了解一个具有您所提议的大致特征(多平台、多语言、数据定义语言)的开源数据交换系统,那么您可能比查看 Google 的 Protocol Buffers 更糟糕。 ,通常称为 protobuf

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

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

关于java - 使用ANTLR和Java创建数据绑定(bind)代码生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913810/

相关文章:

java - Jackson 解析器中的 InputBuffer

java - 如何编写代码来测试另一个类的代码?

java - Page.render() 返回 false

python - 将字符串解析为类层次结构

regex - 可以分割具有相同嵌套括号的字符串的正则表达式

php - 如何在脚本中验证 CSS?

compiler-construction - 如何为这段代码创建无分支代码?

c - Borland C 5.5 编译器不工作

java - 我初始化变量 : float f = 100; or float f = 100f? 的方式有区别吗

java - 将值放入 M​​ap