使用ANTLR和Java创建数据绑定代码生成器

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

  • 目标编程语言,即用于生成代码的编程语言;
  • 目标序列化格式,即数据的序列化格式;
  • 要序列化或反序列化的数据结构的规范。
  • 因为最初我想创建一个简单的代码生成器,所以此软件的第一个版本可能只需要定义要序列化或反序列化的数据结构的规范,所以我选择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,我相信这个工具对于刚刚解释的目的是完美的。 正如在这个答案中所解释的那样,我应该首先创建一个用于规范要序列化或反序列化的数据结构的语法。

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

    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)
        {
            // ...
        }
    }
    

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


    总是一个很好的起点是Antl4回购中的示例语法。 简单的语法,如abnf,json等,可能会为您的规范语法提供相关的起点。 更复杂的语法,就像几个sql语法一样,可以提供有关如何处理更困难或涉及的规范结构的见解 - 规范中的每一行看起来大致类似于sql语句。

    当然,Antlr 4 - 它的语法和实现 - 是阅读规范和生成派生源输出的最佳例子。


    如果你想看看一个开源的数据交换系统,其具有你提出的大致特征(多平台,多语言,数据定义语言),那么你可能会比看看谷歌协议缓冲区更糟糕,通常被称为protobuf。

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

    交换格式本身可以描述一个有趣的特征。 此外,可以根据交换格式的描述对数据进行编码和解码,因此也可以交换格式描述并在不需要代码生成的情况下临时使用它们。 (显然这效率较低,但仍然很有用。)

    链接地址: http://www.djcxy.com/p/43711.html

    上一篇: Using ANTLR and Java to create a data binding code generator

    下一篇: Grammar for a recognizer of a spice